From 9d5c430fe0232c7b72d5003fbd9dc1e8bc997c4c Mon Sep 17 00:00:00 2001 From: delvh Date: Tue, 7 Jul 2020 17:02:39 +0200 Subject: [PATCH] Defined theme specific icon folders, renamed icon loading method --- src/main/java/envoy/client/data/Settings.java | 11 +++++- .../envoy/client/ui/ClearableTextField.java | 2 +- src/main/java/envoy/client/ui/IconUtil.java | 34 +++++++++--------- src/main/java/envoy/client/ui/Startup.java | 2 +- .../envoy/client/ui/controller/ChatScene.java | 10 +++--- .../attachment.png} | Bin .../attachment_present.png} | Bin .../clear_button.png} | Bin .../resources/icons/{ => dark}/forward.png | Bin .../microphone.png} | Bin .../resources/icons/{ => dark}/settings.png | Bin .../attachment.png} | Bin .../attachment_present.png} | Bin .../clear_button.png} | Bin .../{forward_white.png => light/forward.png} | Bin .../microphone.png} | Bin .../settings.png} | Bin src/main/resources/icons/settings_white.png | Bin 29000 -> 0 bytes 18 files changed, 35 insertions(+), 24 deletions(-) rename src/main/resources/icons/{attachment_white.png => dark/attachment.png} (100%) rename src/main/resources/icons/{attachment_present_white.png => dark/attachment_present.png} (100%) rename src/main/resources/icons/{clear_button_white.png => dark/clear_button.png} (100%) rename src/main/resources/icons/{ => dark}/forward.png (100%) rename src/main/resources/icons/{microphone_white.png => dark/microphone.png} (100%) rename src/main/resources/icons/{ => dark}/settings.png (100%) rename src/main/resources/icons/{attachment_black.png => light/attachment.png} (100%) rename src/main/resources/icons/{attachment_present_black.png => light/attachment_present.png} (100%) rename src/main/resources/icons/{clear_button_black.png => light/clear_button.png} (100%) rename src/main/resources/icons/{forward_white.png => light/forward.png} (100%) rename src/main/resources/icons/{microphone_black.png => light/microphone.png} (100%) rename src/main/resources/icons/{settings_black.png => light/settings.png} (100%) delete mode 100644 src/main/resources/icons/settings_white.png diff --git a/src/main/java/envoy/client/data/Settings.java b/src/main/java/envoy/client/data/Settings.java index 9d43bca..fc16c26 100644 --- a/src/main/java/envoy/client/data/Settings.java +++ b/src/main/java/envoy/client/data/Settings.java @@ -25,7 +25,7 @@ import envoy.util.SerializationUtils; public class Settings { // Actual settings accessible by the rest of the application - private Map> items; + private Map> items; /** * Settings are stored in this file. @@ -93,6 +93,15 @@ public class Settings { */ public void setCurrentTheme(String themeName) { ((SettingsItem) items.get("currentTheme")).set(themeName); } + /** + * @return true if the currently used theme is one of the default themes + * @since Envoy Client v0.1-beta + */ + public boolean isUsingDefaultTheme() { + final var theme = getCurrentTheme(); + return theme.equals("dark") || theme.equals("light"); + } + /** * @return {@code true}, if pressing the {@code Enter} key suffices to send a * message. Otherwise it has to be pressed in conjunction with the diff --git a/src/main/java/envoy/client/ui/ClearableTextField.java b/src/main/java/envoy/client/ui/ClearableTextField.java index b8b3a34..fbe6926 100644 --- a/src/main/java/envoy/client/ui/ClearableTextField.java +++ b/src/main/java/envoy/client/ui/ClearableTextField.java @@ -47,7 +47,7 @@ public class ClearableTextField extends GridPane { public ClearableTextField(String text, int size) { // initializing the textField and the button textField = new TextField(text); - clearButton = new Button("", new ImageView(IconUtil.loadDefaultThemeSensitive("clear_button_", size))); + clearButton = new Button("", new ImageView(IconUtil.loadIconThemeSensitive("clear_button", size))); clearButton.setOnAction(e -> textField.clear()); clearButton.setFocusTraversable(false); clearButton.getStyleClass().clear(); diff --git a/src/main/java/envoy/client/ui/IconUtil.java b/src/main/java/envoy/client/ui/IconUtil.java index 337227e..4591f51 100644 --- a/src/main/java/envoy/client/ui/IconUtil.java +++ b/src/main/java/envoy/client/ui/IconUtil.java @@ -66,23 +66,23 @@ public class IconUtil { * folder and scales it to 16px.
* The suffix {@code .png} is automatically appended. * - * @param name the image name without the .png - suffix + * @param name the image name without the .png suffix * @return the loaded image * @since Envoy Client v0.1-beta * @apiNote let's take a sample image {@code abc.png} in the folder * {@code /icons/}. *
* To do that, we only have to call - * {@code IconUtil.loadDefault("abc")} + * {@code IconUtil.loadIcon("abc")} */ - public static Image loadDefault(String name) { return load("/icons/" + name + ".png"); } + public static Image loadIcon(String name) { return load("/icons/" + name + ".png"); } /** * Loads a {@code .png} icon from the sub-folder {@code /icons/} of the resource * folder and scales it to a given size.
* The suffix {@code .png} is automatically appended. * - * @param name the image name without the .png - suffix + * @param name the image name without the .png suffix * @param size the size of the image to scale to * @return the loaded image * @since Envoy Client v0.1-beta @@ -90,9 +90,9 @@ public class IconUtil { * {@code /icons/} and load it in size 16. *
* To do that, we only have to call - * {@code IconUtil.loadDefault("abc", 16)} + * {@code IconUtil.loadIcon("abc", 16)} */ - public static Image loadDefault(String name, int size) { return load("/icons/" + name + ".png", size); } + public static Image loadIcon(String name, int size) { return load("/icons/" + name + ".png", size); } /** * Loads a {@code .png} icon whose design depends on the currently active theme @@ -104,16 +104,16 @@ public class IconUtil { * The suffix {@code .png} is automatically appended. * * @param name the image name without the "black" or "white" suffix and without - * the .png - suffix + * the .png suffix * @return the loaded image * @since Envoy Client v0.1-beta * @apiNote let's take two sample images {@code abc_black.png} and * {@code abc_white.png} in the folder {@code /icons/} and load them. *
* To do that theme sensitve, we only have to call - * {@code IconUtil.loadDefaultThemeSensitive("abc_")} + * {@code IconUtil.loadIconThemeSensitive("abc_")} */ - public static Image loadDefaultThemeSensitive(String name) { return loadDefault(name + themeSpecificSuffix()); } + public static Image loadIconThemeSensitive(String name) { return loadIcon(themeSpecificSubFolder() + name); } /** * Loads a {@code .png} icon whose design depends on the currently active theme @@ -125,7 +125,7 @@ public class IconUtil { *

* The suffix {@code .png} is automatically appended. * - * @param name the image name without the .png - suffix + * @param name the image name without the .png suffix * @param size the size of the image to scale to * @return the loaded image * @since Envoy Client v0.1-beta @@ -134,9 +134,9 @@ public class IconUtil { * size 16. *
* To do that theme sensitve, we only have to call - * {@code IconUtil.loadDefaultThemeSensitive("abc_", 16)} + * {@code IconUtil.loadIconThemeSensitive("abc_", 16)} */ - public static Image loadDefaultThemeSensitive(String name, int size) { return loadDefault(name + themeSpecificSuffix(), size); } + public static Image loadIconThemeSensitive(String name, int size) { return loadIcon(themeSpecificSubFolder() + name, size); } /** * @@ -163,11 +163,13 @@ public class IconUtil { /** * This method should be called if the display of an icon depends upon the * currently active theme.
- * In case of the dark theme, the suffix {@code "white"} will be appended, else - * the suffix {@code "black"} will be appended. + * In case of a default theme, the string returned will be + * returned ({@code dark/} or {@code light/}), else it will be empty. * - * @return the theme specific suffix + * @return the theme specific folder * @since Envoy Client v0.1-beta */ - public static String themeSpecificSuffix() { return Settings.getInstance().getCurrentTheme().equals("dark") ? "white" : "black"; } + public static String themeSpecificSubFolder() { + return Settings.getInstance().isUsingDefaultTheme() ? Settings.getInstance().getCurrentTheme() + "/" : ""; + } } diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java index a28963a..0240e84 100644 --- a/src/main/java/envoy/client/ui/Startup.java +++ b/src/main/java/envoy/client/ui/Startup.java @@ -102,7 +102,7 @@ public final class Startup extends Application { messageStatusCache = new Cache<>(); stage.setTitle("Envoy"); - stage.getIcons().add(IconUtil.loadDefault("envoy_logo")); + stage.getIcons().add(IconUtil.loadIcon("envoy_logo")); final var sceneContext = new SceneContext(stage); sceneContext.load(SceneInfo.LOGIN_SCENE); diff --git a/src/main/java/envoy/client/ui/controller/ChatScene.java b/src/main/java/envoy/client/ui/controller/ChatScene.java index 75f500c..956ce21 100644 --- a/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -110,8 +110,8 @@ public final class ChatScene implements Restorable { messageList.setCellFactory(MessageListCellFactory::new); userList.setCellFactory(ContactListCellFactory::new); - settingsButton.setGraphic(new ImageView(IconUtil.loadDefault("settings", 16))); - voiceButton.setGraphic(new ImageView(IconUtil.loadDefaultThemeSensitive("", 24))); + settingsButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("settings", 16))); + voiceButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("microphone", 20))); // Listen to received messages eventBus.register(MessageCreationEvent.class, e -> { @@ -265,17 +265,17 @@ public final class ChatScene implements Restorable { recording = true; Platform.runLater(() -> { voiceButton.setText("Recording"); - voiceButton.setGraphic(new ImageView(IconUtil.loadDefault("microphone_recording", 24))); + voiceButton.setGraphic(new ImageView(IconUtil.loadIcon("microphone_recording", 24))); }); recorder.start(); } else { pendingAttachment = new Attachment(recorder.finish(), AttachmentType.VOICE); recording = false; Platform.runLater(() -> { - voiceButton.setGraphic(new ImageView(IconUtil.loadDefaultThemeSensitive("microphone_", 24))); + voiceButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("microphone", 20))); voiceButton.setText(null); checkPostConditions(false); - attachmentView.setImage(IconUtil.loadDefaultThemeSensitive("attachment_present_", 20)); + attachmentView.setImage(IconUtil.loadIconThemeSensitive("attachment_present", 20)); attachmentView.setVisible(true); }); } diff --git a/src/main/resources/icons/attachment_white.png b/src/main/resources/icons/dark/attachment.png similarity index 100% rename from src/main/resources/icons/attachment_white.png rename to src/main/resources/icons/dark/attachment.png diff --git a/src/main/resources/icons/attachment_present_white.png b/src/main/resources/icons/dark/attachment_present.png similarity index 100% rename from src/main/resources/icons/attachment_present_white.png rename to src/main/resources/icons/dark/attachment_present.png diff --git a/src/main/resources/icons/clear_button_white.png b/src/main/resources/icons/dark/clear_button.png similarity index 100% rename from src/main/resources/icons/clear_button_white.png rename to src/main/resources/icons/dark/clear_button.png diff --git a/src/main/resources/icons/forward.png b/src/main/resources/icons/dark/forward.png similarity index 100% rename from src/main/resources/icons/forward.png rename to src/main/resources/icons/dark/forward.png diff --git a/src/main/resources/icons/microphone_white.png b/src/main/resources/icons/dark/microphone.png similarity index 100% rename from src/main/resources/icons/microphone_white.png rename to src/main/resources/icons/dark/microphone.png diff --git a/src/main/resources/icons/settings.png b/src/main/resources/icons/dark/settings.png similarity index 100% rename from src/main/resources/icons/settings.png rename to src/main/resources/icons/dark/settings.png diff --git a/src/main/resources/icons/attachment_black.png b/src/main/resources/icons/light/attachment.png similarity index 100% rename from src/main/resources/icons/attachment_black.png rename to src/main/resources/icons/light/attachment.png diff --git a/src/main/resources/icons/attachment_present_black.png b/src/main/resources/icons/light/attachment_present.png similarity index 100% rename from src/main/resources/icons/attachment_present_black.png rename to src/main/resources/icons/light/attachment_present.png diff --git a/src/main/resources/icons/clear_button_black.png b/src/main/resources/icons/light/clear_button.png similarity index 100% rename from src/main/resources/icons/clear_button_black.png rename to src/main/resources/icons/light/clear_button.png diff --git a/src/main/resources/icons/forward_white.png b/src/main/resources/icons/light/forward.png similarity index 100% rename from src/main/resources/icons/forward_white.png rename to src/main/resources/icons/light/forward.png diff --git a/src/main/resources/icons/microphone_black.png b/src/main/resources/icons/light/microphone.png similarity index 100% rename from src/main/resources/icons/microphone_black.png rename to src/main/resources/icons/light/microphone.png diff --git a/src/main/resources/icons/settings_black.png b/src/main/resources/icons/light/settings.png similarity index 100% rename from src/main/resources/icons/settings_black.png rename to src/main/resources/icons/light/settings.png diff --git a/src/main/resources/icons/settings_white.png b/src/main/resources/icons/settings_white.png deleted file mode 100644 index f956615fa7133ced0a93b645706a9a9812a6a574..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29000 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 b9!Tr_dUdaI))_(I)rbt9u6{1-oD!M