package com.narrowtux.fmm.gui; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.narrowtux.fmm.model.Datastore; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.layout.VBox; import javafx.stage.DirectoryChooser; import javafx.stage.FileChooser; import javafx.stage.Window; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; public class SettingsWindowController extends Controller { @FXML VBox root; @FXML Button executableButton; @FXML Button closeButton; @FXML Button dataButton; private Runnable onClose; public Runnable getOnClose() { return onClose; } public void setOnClose(Runnable onClose) { this.onClose = onClose; } @Override public VBox getRoot() { return root; } @Override public void init() { Datastore.getInstance().dataDirProperty().addListener((observableValue, ov, nv) -> { updateButton(dataButton, nv); }); Datastore.getInstance().factorioApplicationProperty().addListener((obs, ov, nv) -> { updateButton(executableButton, nv); }); updateButton(dataButton, Datastore.getInstance().getDataDir()); updateButton(executableButton, Datastore.getInstance().getFactorioApplication()); } public void setWindow(Window window) { window.setOnCloseRequest(event -> { if (closeButton.isDisable()) { event.consume(); } else { try { onClose(); } catch (IOException e) { e.printStackTrace(); } } }); } private void updateButton(Button button, Path path) { if (path != null) { button.setText(".../" + path.getFileName().toString()); } else { button.setText("..."); } closeButton.setDisable(Datastore.getInstance().getDataDir() == null || Datastore.getInstance().getFactorioApplication() == null); } @FXML public void onClose() throws IOException { Gson gson = new Gson(); JsonObject settings = new JsonObject(); settings.addProperty("data", Datastore.getInstance().getDataDir().toString()); settings.addProperty("executable", Datastore.getInstance().getFactorioApplication().toString()); FileWriter out = new FileWriter(Datastore.getInstance().getStorageDir().resolve("settings.json").toFile()); gson.toJson(settings, new JsonWriter(out)); out.close(); root.getScene().getWindow().hide(); if (onClose != null) { onClose.run(); onClose = null; } } @FXML public void onSelectExecutableButton(ActionEvent event) { FileChooser chooser = new FileChooser(); Path factorioApplication = Datastore.getInstance().getFactorioApplication(); if (factorioApplication != null) { chooser.setInitialDirectory(factorioApplication.getParent().toFile()); } File file = chooser.showOpenDialog(root.getScene().getWindow()); if (file == null) { return; } Datastore.getInstance().setFactorioApplication(Paths.get(file.getAbsolutePath())); } @FXML public void onSelectDataButton(ActionEvent event) { DirectoryChooser chooser = new DirectoryChooser(); chooser.setInitialDirectory(Datastore.getInstance().getDataDir().toFile()); File dir = chooser.showDialog(root.getScene().getWindow()); if (dir == null) { return; } Datastore.getInstance().setDataDir(Paths.get(dir.getAbsolutePath())); } }