package be.bendem.manga.library;
import be.bendem.manga.library.config.ConfigManager;
import be.bendem.manga.library.controllers.MangaLibraryCtrl;
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.util.Callback;
import java.lang.reflect.InvocationTargetException;
import java.util.Stack;
public class MangaLibrary extends Application {
public final Callback<Class<?>, Object> controllerFactory;
private final ConfigManager configManager;
private final Stack<String> mainHistory;
private MangaLibraryCtrl controller;
public MangaLibrary() {
controllerFactory = clazz -> {
try {
return clazz.getConstructor(MangaLibrary.class).newInstance(this);
} catch(InstantiationException | IllegalAccessException
| NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException("Could not instantiate controller for " + clazz, e);
}
};
configManager = new ConfigManager();
mainHistory = new Stack<>();
}
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("app.fxml"));
loader.setControllerFactory(controllerFactory);
Parent app = loader.load();
controller = loader.getController();
app.getStylesheets().add(getClass().getClassLoader().getResource("style.css").toExternalForm());
double width = Double.valueOf(configManager.getApplicationConfig().get("applicationWidth", "-1"));
double height = Double.valueOf(configManager.getApplicationConfig().get("applicationHeight", "-1"));
Scene scene = new Scene(app, width, height);
stage.setTitle("Manga Library");
stage.setScene(scene);
stage.show();
stage.widthProperty().addListener(this::onWidthChange);
stage.heightProperty().addListener(this::onHeightChange);
}
private void onWidthChange(ObservableValue<? extends Number> obs, Number oldVal, Number newVal) {
configManager.getApplicationConfig().set("applicationWidth", newVal);
}
private void onHeightChange(ObservableValue<? extends Number> obs, Number oldVal, Number newVal) {
configManager.getApplicationConfig().set("applicationHeight", newVal);
}
@Override
public void stop() {
configManager.getApplicationConfig().save();
}
public ConfigManager getConfigManager() {
return configManager;
}
public MangaLibraryCtrl getController() {
return controller;
}
public void pushHistory(String fxml) {
mainHistory.push(fxml);
}
public void popHistory() {
if(mainHistory.isEmpty()) {
return;
}
controller.setMain(mainHistory.pop());
}
}