diff --git a/src/main/java/envoy/client/data/Settings.java b/src/main/java/envoy/client/data/Settings.java index 419d22a..fbbe108 100644 --- a/src/main/java/envoy/client/data/Settings.java +++ b/src/main/java/envoy/client/data/Settings.java @@ -27,8 +27,8 @@ import envoy.util.SerializationUtils; public class Settings { // Actual settings accessible by the rest of the application - private Map> items; - private Map themes; + private Map> items; + private Map themes; /** * Settings are stored in this file. @@ -46,8 +46,8 @@ public class Settings { private static Settings settings = new Settings(); /** - * The way to instantiate the settings. - * Is set to private to deny other instances of that object. + * The way to instantiate the settings. Is set to private to deny other + * instances of that object. * * @since Envoy Client v0.2-alpha */ @@ -69,12 +69,10 @@ public class Settings { } // Load standard themes not defined in the themes file - themes.put("dark", - new Theme("dark", Color.black, Color.darkGray, Color.white, new Color(165, 60, 232), Color.white, Color.orange, Color.blue, - Color.white, Color.white)); - themes.put("light", - new Theme("light", new Color(235, 235, 235), Color.white, Color.white, Color.darkGray, Color.black, Color.orange, Color.darkGray, - Color.black, Color.black)); + themes.put("dark", new Theme("dark", Color.black, Color.darkGray, Color.white, new Color(165, 60, 232), + Color.white, Color.orange, Color.blue, Color.white, Color.white)); + themes.put("light", new Theme("light", new Color(235, 235, 235), Color.white, Color.white, Color.darkGray, + Color.black, Color.orange, Color.darkGray, Color.black, Color.black)); } /** @@ -83,7 +81,9 @@ public class Settings { * @return the instance of Settings * @since Envoy Client v0.2-alpha */ - public static Settings getInstance() { return settings; } + public static Settings getInstance() { + return settings; + } /** * Updates the preferences when the save button is clicked. @@ -101,9 +101,12 @@ public class Settings { } private void supplementDefaults() { - items.putIfAbsent("enterToSend", new SettingsItem<>(true, "Enter to send", "Sends a message by pressing the enter key.")); - items.putIfAbsent("onCloseMode", new SettingsItem<>(true, "Hide on close", "Hides the chat window when it is closed.")); - items.putIfAbsent("currentTheme", new SettingsItem<>("dark", "Current Theme Name", "The name of the currently selected theme.")); + items.putIfAbsent("enterToSend", + new SettingsItem<>(true, "Enter to send", "Sends a message by pressing the enter key.")); + items.putIfAbsent("onCloseMode", + new SettingsItem<>(true, "Hide on close", "Hides the chat window when it is closed.")); + items.putIfAbsent("currentTheme", + new SettingsItem<>("dark", "Current Theme Name", "The name of the currently selected theme.")); } /** @@ -112,19 +115,25 @@ public class Settings { * @param theme the {@link Theme} to add * @since Envoy Client v0.2-alpha */ - public void addNewThemeToMap(Theme theme) { getThemes().put(theme.getThemeName(), theme); } + public void addNewThemeToMap(Theme theme) { + getThemes().put(theme.getThemeName(), theme); + } /** * @return the name of the currently active {@link Theme} * @since Envoy Client v0.2-alpha */ - public String getCurrentThemeName() { return (String) items.get("currentTheme").get(); } + public String getCurrentThemeName() { + return (String) items.get("currentTheme").get(); + } /** * @return the currently active {@link Theme} * @since Envoy Client v0.1-beta */ - public Theme getCurrentTheme() { return getTheme(getCurrentThemeName()); } + public Theme getCurrentTheme() { + return getTheme(getCurrentThemeName()); + } /** * Sets the name of the current {@link Theme}. @@ -132,7 +141,18 @@ public class Settings { * @param themeName the name to set * @since Envoy Client v0.2-alpha */ - public void setCurrentTheme(String themeName) { ((SettingsItem) items.get("currentTheme")).set(themeName); } + public void setCurrentTheme(String themeName) { + ((SettingsItem) items.get("currentTheme")).set(themeName); + } + + /** + * @return whether the current {@link Theme} is one of the default themes. + * Currently checks for dark and light theme. + * @since Envoy Client v0.1-beta + */ + public boolean isUsingDefaultTheme() { + return getCurrentThemeName().equals("dark") || getCurrentThemeName().equals("light"); + } /** * @return {@code true}, if pressing the {@code Enter} key suffices to send a @@ -140,7 +160,9 @@ public class Settings { * {@code Control} key. * @since Envoy Client v0.2-alpha */ - public Boolean isEnterToSend() { return (Boolean) items.get("enterToSend").get(); } + public Boolean isEnterToSend() { + return (Boolean) items.get("enterToSend").get(); + } /** * Changes the keystrokes performed by the user to send a message. @@ -150,13 +172,17 @@ public class Settings { * conjunction with the {@code Control} key. * @since Envoy Client v0.2-alpha */ - public void setEnterToSend(boolean enterToSend) { ((SettingsItem) items.get("enterToSend")).set(enterToSend); } + public void setEnterToSend(boolean enterToSend) { + ((SettingsItem) items.get("enterToSend")).set(enterToSend); + } /** * @return the current on close mode. * @since Envoy Client v0.3-alpha */ - public Boolean getCurrentOnCloseMode() { return (Boolean) items.get("onCloseMode").get(); } + public Boolean getCurrentOnCloseMode() { + return (Boolean) items.get("onCloseMode").get(); + } /** * Sets the current on close mode. @@ -164,23 +190,31 @@ public class Settings { * @param currentOnCloseMode the on close mode that should be set. * @since Envoy Client v0.3-alpha */ - public void setCurrentOnCloseMode(boolean currentOnCloseMode) { ((SettingsItem) items.get("onCloseMode")).set(currentOnCloseMode); } + public void setCurrentOnCloseMode(boolean currentOnCloseMode) { + ((SettingsItem) items.get("onCloseMode")).set(currentOnCloseMode); + } /** * @return the items */ - public Map> getItems() { return items; } + public Map> getItems() { + return items; + } /** * @param items the items to set */ - public void setItems(Map> items) { this.items = items; } + public void setItems(Map> items) { + this.items = items; + } /** * @return a {@code Map} of all themes with their names as keys * @since Envoy Client v0.2-alpha */ - public Map getThemes() { return themes; } + public Map getThemes() { + return themes; + } /** * Sets the {@code Map} of all themes with their names as keys @@ -188,12 +222,16 @@ public class Settings { * @param themes the theme map to set * @since Envoy Client v0.2-alpha */ - public void setThemes(Map themes) { this.themes = themes; } + public void setThemes(Map themes) { + this.themes = themes; + } /** * @param themeName the name of the {@link Theme} to get * @return the {@link Theme} with the specified name * @since Envoy Client v0.3-alpha */ - public Theme getTheme(String themeName) { return themes.get(themeName); } + public Theme getTheme(String themeName) { + return themes.get(themeName); + } } diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java index 9b5405a..12d54e4 100644 --- a/src/main/java/envoy/client/ui/Startup.java +++ b/src/main/java/envoy/client/ui/Startup.java @@ -3,6 +3,7 @@ package envoy.client.ui; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.nio.file.Paths; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; @@ -44,11 +45,14 @@ public final class Startup extends Application { private FXMLLoader loader = new FXMLLoader(); private Stage stage; + private Scene previousScene; - private Scene previousScene; + private final String[] CSSPaths = { "file://./src/main/resources/fxml/themes/base.css", + "file://./src/main/resources/fxml/themes/" + (settings.isUsingDefaultTheme() ? settings.getCurrentThemeName() : "custom") + ".css" }; - private static final ClientConfig config = ClientConfig.getInstance(); - private static final Logger logger = EnvoyLog.getLogger(Startup.class); + private static final Settings settings = Settings.getInstance(); + private static final ClientConfig config = ClientConfig.getInstance(); + private static final Logger logger = EnvoyLog.getLogger(Startup.class); /** * {@inheritDoc} @@ -150,7 +154,8 @@ public final class Startup extends Application { * @param fxmlLocation the location of the fxml file * @param layout the layout to use * @param savePrevious if true, the previous stage will be stored in this - * instance of Startup, else the variable storing it will be + * instance of Startup, else the variable storing it will + * be * set to null * @since Envoy Client v0.1-beta */ @@ -160,13 +165,17 @@ public final class Startup extends Application { // Clearing the loader so that a new Scene can be initialised loader = new FXMLLoader(); var rootNode = loader.load(getClass().getResourceAsStream(fxmlLocation)); - var chatScene = new Scene(rootNode); - previousScene = (savePrevious) ? stage.getScene() : null; - stage.setScene(chatScene); + var scene = new Scene(rootNode); + previousScene = savePrevious ? stage.getScene() : null; + // Setting the visual appearance + scene.getStylesheets().addAll(CSSPaths); + System.out.println(Paths.get(".").toAbsolutePath().normalize().toString()); + stage.setScene(scene); stage.show(); // return loader.getController(); } catch (IOException e) { new Alert(AlertType.ERROR, "The screen could not be updated due to reasons. (...bad programming...)"); + System.err.println("input: FXMLLocation: " + fxmlLocation + ", CSS paths: " + CSSPaths); e.printStackTrace(); logger.severe("Something happened (while loading the new scene from " + fxmlLocation + ")"); } @@ -175,7 +184,7 @@ public final class Startup extends Application { /** * Changes the visual scene back to the saved value. The currently active scene - * can be saved. + * can be saved, but must not be. * * @param storeCurrent the old scene to store, if wanted. Can be null * @since Envoy Client v0.1-beta @@ -185,7 +194,7 @@ public final class Startup extends Application { if (previousScene == null) throw new IllegalStateException("Someone tried restoring a null scene. (Something happened)"); else { // switching previous and current - var temp = (storeCurrent) ? stage.getScene() : null; + var temp = storeCurrent ? stage.getScene() : null; stage.setScene(previousScene); previousScene = temp; stage.show(); @@ -224,4 +233,23 @@ public final class Startup extends Application { if (loader.getController() == null) throw new NullPointerException("Cannot deliver current controller as its undefined (duh!)"); else return loader.getController(); } + + /** + * @return the CSSPaths + * @since Envoy Client v0.1-beta + */ + public String[] getCSSPaths() { return CSSPaths; } + + /** + * Changes the currently displayed theme + * + * @since Envoy Client v0.1-beta + */ + public void changeTheme() { + // the base.css file should never be changed during runtime + CSSPaths[1] = "file://.fxml/themes/" + (settings.isUsingDefaultTheme() ? settings.getCurrentThemeName() : "custom") + ".css"; + var styleSheets = stage.getScene().getStylesheets(); + styleSheets.remove(styleSheets.size() - 1); + styleSheets.add(CSSPaths[1]); + } } diff --git a/src/main/resources/fxml/themes/base.css b/src/main/resources/fxml/themes/base.css new file mode 100644 index 0000000..8cfc8ca --- /dev/null +++ b/src/main/resources/fxml/themes/base.css @@ -0,0 +1,5 @@ +.root{ + -fx-font: 200pt "Serif"; + --background=#00FF00; + background: var(--background); +} \ No newline at end of file diff --git a/src/main/resources/fxml/themes/custom.css b/src/main/resources/fxml/themes/custom.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/fxml/themes/dark.css b/src/main/resources/fxml/themes/dark.css new file mode 100644 index 0000000..06326dd --- /dev/null +++ b/src/main/resources/fxml/themes/dark.css @@ -0,0 +1,7 @@ +.root{ + --background=#000000; + background: var(--background); +} +.button{ + color: rgb(105,0,153); +} \ No newline at end of file diff --git a/src/main/resources/fxml/themes/light.css b/src/main/resources/fxml/themes/light.css new file mode 100644 index 0000000..e69de29