package eu.lestard.snakefx;
import de.saxsys.mvvmfx.FluentViewLoader;
import de.saxsys.mvvmfx.MvvmFX;
import de.saxsys.mvvmfx.ViewTuple;
import eu.lestard.easydi.EasyDI;
import eu.lestard.fxzeug.usability.Scaling;
import eu.lestard.grid.GridModel;
import eu.lestard.snakefx.highscore.HighscoreDao;
import eu.lestard.snakefx.highscore.HighscoreJsonDao;
import eu.lestard.snakefx.util.KeyboardHandler;
import eu.lestard.snakefx.util.TriggerablePopup;
import eu.lestard.snakefx.view.highscore.HighscoreView;
import eu.lestard.snakefx.view.highscore.NewHighscoreView;
import eu.lestard.snakefx.view.main.MainView;
import eu.lestard.snakefx.view.main.MainViewModel;
import eu.lestard.snakefx.viewmodel.CentralViewModel;
import javafx.application.Application;
import javafx.application.HostServices;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Launcher extends Application {
public static void main(final String... args) {
Application.launch(Launcher.class, args);
}
private TriggerablePopup newHighscorePopup;
private TriggerablePopup highscorePopup;
@Override
public void start(final Stage primaryStage) {
EasyDI easyDI = new EasyDI();
easyDI.bindProvider(HostServices.class, this::getHostServices);
easyDI.bindInterface(HighscoreDao.class, HighscoreJsonDao.class);
easyDI.markAsSingleton(GridModel.class);
MvvmFX.setCustomDependencyInjector(easyDI::getInstance);
final ViewTuple<MainView, MainViewModel> viewTuple = FluentViewLoader.fxmlView(MainView.class).load();
Scaling.detectDefaultScaling();
final int fontSize = Scaling.getFontSize();
Scene scene = new Scene(viewTuple.getView(), fontSize*60, fontSize*50);
Scaling.enableScaling(scene);
scene.setOnKeyPressed(easyDI.getInstance(KeyboardHandler.class));
CentralViewModel viewModel = easyDI.getInstance(CentralViewModel.class);
highscorePopup = new TriggerablePopup(HighscoreView.class, primaryStage);
highscorePopup.trigger().bindBidirectional(viewModel.highscoreWindowOpen);
newHighscorePopup = new TriggerablePopup(NewHighscoreView.class, highscorePopup.getStage());
newHighscorePopup.trigger().bindBidirectional(viewModel.newHighscoreWindowOpen);
primaryStage.setTitle("SnakeFX");
primaryStage.setScene(scene);
primaryStage.sizeToScene();
primaryStage.show();
}
}