package nl.utwente.viskell.ui;
import java.util.prefs.Preferences;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import nl.utwente.viskell.ghcj.GhciSession;
import com.google.common.collect.ImmutableList;
/**
* A window for setting preferences.
*/
public class PreferencesWindow extends BorderPane implements ComponentLoader {
private Stage stage;
private Preferences preferences;
@FXML private ComboBox<GhciSession.Backend> ghci;
@FXML private ComboBox<String> background;
@FXML private ComboBox<String> theme;
@FXML private CheckBox scrollInversion;
@FXML protected CheckBox debugOverlay;
@FXML private Button reloadTheme;
public PreferencesWindow(MainOverlay overlay) {
super();
preferences = Preferences.userNodeForPackage(Main.class);
stage = new Stage();
stage.setTitle("Preferences");
stage.setScene(new Scene(this, 450, 450));
loadFXML("PreferencesWindow");
ghci.getItems().setAll(GhciSession.getBackends());
ghci.getSelectionModel().select(GhciSession.pickBackend());
ghci.valueProperty().addListener(event -> {
preferences.put("ghci", ghci.getValue().toString());
overlay.getToplevelPane().restartBackend();
});
background.getItems().setAll(ImmutableList.of("/ui/grid.png", "/ui/light_grid.png", "/ui/white.png"));
background.getSelectionModel().select(preferences.get("background", "/ui/grid.png"));
background.valueProperty().addListener(event -> {
preferences.put("background", background.getValue());
refreshTheme(overlay);
});
theme.getItems().setAll(ImmutableList.of("/ui/colours.css", "/ui/debugColours.css"));
theme.getSelectionModel().select(preferences.get("theme", "/ui/colours.css"));
theme.valueProperty().addListener(event -> {
preferences.put("theme", theme.getValue());
refreshTheme(overlay);
});
scrollInversion.setSelected(preferences.getBoolean("invertScroll", false));
scrollInversion.setOnAction(event -> {
preferences.put("invertScroll", Boolean.toString(scrollInversion.isSelected()));
});
debugOverlay.setOnAction(event -> {
overlay.setTouchOverlayVisible(debugOverlay.isSelected());
});
reloadTheme.setOnAction(event -> refreshTheme(overlay));
stage.focusedProperty().addListener(new ChangeListener<Boolean>() {
public void changed(ObservableValue<? extends Boolean> observable, Boolean old, Boolean newVal) {
if (!newVal) {
close();
}
}
});
refreshTheme(overlay);
}
protected void refreshTheme(MainOverlay overlay) {
Main.getStage().getScene().getStylesheets().clear();
Main.getStage().getScene().getStylesheets().addAll("/ui/layout.css", preferences.get("theme", "/ui/colours.css"));
stage.getScene().getStylesheets().clear();
stage.getScene().getStylesheets().addAll("/ui/layout.css", preferences.get("theme", "/ui/colours.css"));
String backGroundImage = preferences.get("background", "/ui/grid.png");
overlay.getToplevelPane().setStyle("-fx-background-image: url('" + backGroundImage + "');");
}
public void show() {
stage.show();
}
public void close() {
stage.hide();
}
}