From 767fb1ab9b2fb8c45b3e285579c8831c91d321ae Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Sun, 13 Feb 2022 04:14:44 +0100 Subject: [PATCH] more refactoring --- G-Earth/src/main/java/gearth/GEarth.java | 39 ++++++---- .../extensions/logger/ExtensionLogger.java | 25 ++++--- .../java/gearth/ui/themes/AnimeTheme.java | 7 ++ .../main/java/gearth/ui/themes/DarkTheme.java | 23 ++++++ .../java/gearth/ui/themes/LightTheme.java | 23 ++++++ .../java/gearth/ui/themes/TanjiTheme.java | 23 ++++++ .../src/main/java/gearth/ui/themes/Theme.java | 6 +- .../java/gearth/ui/themes/ThemeFactory.java | 27 +++++++ .../ui/titlebar/DefaultTitleBarConfig.java | 56 +++++++++++++++ .../gearth/ui/titlebar/TitleBarConfig.java | 5 +- .../ui/titlebar/TitleBarController.java | 27 +++++-- .../gearth/ui/themes/G-Earth/styling.css | 2 +- .../gearth/ui/themes/G-Earth_Dark/styling.css | 2 +- .../gearth/ui/themes/Tanji/styling.css | 2 +- .../gearth/ui/titlebar/Titlebar.fxml | 71 ++++++++++++------- 15 files changed, 282 insertions(+), 56 deletions(-) create mode 100644 G-Earth/src/main/java/gearth/ui/themes/AnimeTheme.java create mode 100644 G-Earth/src/main/java/gearth/ui/themes/DarkTheme.java create mode 100644 G-Earth/src/main/java/gearth/ui/themes/LightTheme.java create mode 100644 G-Earth/src/main/java/gearth/ui/themes/TanjiTheme.java create mode 100644 G-Earth/src/main/java/gearth/ui/themes/ThemeFactory.java create mode 100644 G-Earth/src/main/java/gearth/ui/titlebar/DefaultTitleBarConfig.java diff --git a/G-Earth/src/main/java/gearth/GEarth.java b/G-Earth/src/main/java/gearth/GEarth.java index fff1a18..22f3941 100644 --- a/G-Earth/src/main/java/gearth/GEarth.java +++ b/G-Earth/src/main/java/gearth/GEarth.java @@ -4,6 +4,8 @@ import gearth.misc.AdminValidator; import gearth.misc.Cacher; import gearth.misc.UpdateChecker; import gearth.ui.GEarthController; +import gearth.ui.themes.Theme; +import gearth.ui.themes.ThemeFactory; import gearth.ui.titlebar.TitleBarConfig; import gearth.ui.titlebar.TitleBarController; import javafx.application.Application; @@ -20,8 +22,7 @@ public class GEarth extends Application { public static Application main; public static String version = "1.5.1"; public static String gitApi = "https://api.github.com/repos/sirjonasxx/G-Earth/releases/latest"; - public static String theme = "G-Earth_Dark"; - public static String[] themes = new String[] {"G-Earth", "Tanji", "G-Earth_Dark"}; + public static Theme theme; private Stage stage; private TitleBarController titleBar; @@ -29,7 +30,10 @@ public class GEarth extends Application { static { if (Cacher.getCacheContents().has("theme")) { - theme = Cacher.getCacheContents().getString("theme"); + theme = ThemeFactory.themeForTitle(Cacher.getCacheContents().getString("theme")); + } + else { + theme = ThemeFactory.getDefaultTheme(); } } @@ -62,14 +66,19 @@ public class GEarth extends Application { } @Override - public void onSetTheme(String theme) { - setTheme(theme); + public void setTheme(Theme theme) { + setGearthTheme(theme); + } + + @Override + public Theme getCurrentTheme() { + return theme; } }); primaryStage.setResizable(false); primaryStage.sizeToScene(); - setTheme(theme); + setGearthTheme(theme); primaryStage.show(); primaryStage.setOnCloseRequest( event -> closeGEarth()); @@ -85,19 +94,23 @@ public class GEarth extends Application { System.exit(0); } - private void setTheme(String theme) { + private void setGearthTheme(Theme theme) { GEarth.theme = theme; + Theme defaultTheme = ThemeFactory.getDefaultTheme(); stage.getScene().getStylesheets().clear(); - stage.getScene().getStylesheets().add(GEarth.class.getResource(String.format("/gearth/ui/themes/%s/styling.css", theme)).toExternalForm()); + stage.getScene().getStylesheets().add(GEarth.class.getResource(String.format("/gearth/ui/themes/%s/styling.css", theme.internalName())).toExternalForm()); stage.getIcons().clear(); - stage.getIcons().add(new Image(GEarth.class.getResourceAsStream(String.format("/gearth/ui/themes/%s/logoSmall.png", theme)))); + stage.getIcons().add(new Image(GEarth.class.getResourceAsStream(String.format("/gearth/ui/themes/%s/logoSmall.png", theme.overridesLogo() ? theme.internalName() : defaultTheme.internalName())))); + stage.setTitle((theme.overridesTitle() ? theme.title() : defaultTheme.title()) + " " + GEarth.version); - stage.setTitle(theme.split("_")[0] + " " + GEarth.version); - titleBar.setTitle(stage.getTitle()); - - controller.infoController.img_logo.setImage(new Image(GEarth.class.getResourceAsStream(String.format("/gearth/ui/themes/%s/logo.png", theme)))); + controller.infoController.img_logo.setImage(new Image(GEarth.class.getResourceAsStream( + String.format( + "/gearth/ui/themes/%s/logo.png", + theme.overridesLogo() ? theme.internalName() : defaultTheme.internalName() + ) + ))); controller.infoController.version.setText(stage.getTitle()); } diff --git a/G-Earth/src/main/java/gearth/ui/subforms/extensions/logger/ExtensionLogger.java b/G-Earth/src/main/java/gearth/ui/subforms/extensions/logger/ExtensionLogger.java index 19bffe8..f2b5f90 100644 --- a/G-Earth/src/main/java/gearth/ui/subforms/extensions/logger/ExtensionLogger.java +++ b/G-Earth/src/main/java/gearth/ui/subforms/extensions/logger/ExtensionLogger.java @@ -1,6 +1,8 @@ package gearth.ui.subforms.extensions.logger; import gearth.GEarth; +import gearth.ui.titlebar.DefaultTitleBarConfig; +import gearth.ui.titlebar.TitleBarController; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; @@ -35,26 +37,31 @@ public class ExtensionLogger { stage = new Stage(); - stage.setTitle(String.format("%s | Extension Console", GEarth.theme)); + stage.setTitle("G-Earth | Extension Console"); stage.initModality(Modality.NONE); - stage.getIcons().add(new Image(getClass().getResourceAsStream(String.format("/gearth/ui/themes/%s/logoSmall.png", GEarth.theme)))); stage.setAlwaysOnTop(true); stage.setMinHeight(235); stage.setMinWidth(370); Scene scene = new Scene(root); - scene.getStylesheets().add(String.format("/gearth/ui/themes/%s/styling.css", GEarth.theme)); - scene.getStylesheets().add("/gearth/ui/extensions/logger/logger.css"); + scene.getStylesheets().add("/gearth/ui/subforms/extensions/logger/logger.css"); ExtensionLoggerController controller = loader.getController(); controller.setStage(stage); stage.setScene(scene); - - // don't let the user close this window on their own - stage.setOnCloseRequest(windowEvent -> { - stage.hide(); - isVisible = false; + TitleBarController titleBar = TitleBarController.create(stage, new DefaultTitleBarConfig(stage) { + @Override + public void onCloseClicked() { + stage.hide(); + isVisible = false; + } }); + +// // don't let the user close this window on their own +// stage.setOnCloseRequest(windowEvent -> { +// stage.hide(); +// isVisible = false; +// }); } catch (IOException e) { e.printStackTrace(); } diff --git a/G-Earth/src/main/java/gearth/ui/themes/AnimeTheme.java b/G-Earth/src/main/java/gearth/ui/themes/AnimeTheme.java new file mode 100644 index 0000000..baf0a34 --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/themes/AnimeTheme.java @@ -0,0 +1,7 @@ +package gearth.ui.themes; + +public class AnimeTheme { + + // just kidding + +} diff --git a/G-Earth/src/main/java/gearth/ui/themes/DarkTheme.java b/G-Earth/src/main/java/gearth/ui/themes/DarkTheme.java new file mode 100644 index 0000000..25f90da --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/themes/DarkTheme.java @@ -0,0 +1,23 @@ +package gearth.ui.themes; + +public class DarkTheme implements Theme { + @Override + public String title() { + return "G-Earth Dark"; + } + + @Override + public String internalName() { + return "G-Earth_Dark"; + } + + @Override + public boolean overridesLogo() { + return false; + } + + @Override + public boolean overridesTitle() { + return false; + } +} diff --git a/G-Earth/src/main/java/gearth/ui/themes/LightTheme.java b/G-Earth/src/main/java/gearth/ui/themes/LightTheme.java new file mode 100644 index 0000000..6e131fe --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/themes/LightTheme.java @@ -0,0 +1,23 @@ +package gearth.ui.themes; + +public class LightTheme implements Theme { + @Override + public String title() { + return "G-Earth"; + } + + @Override + public String internalName() { + return "G-Earth"; + } + + @Override + public boolean overridesLogo() { + return true; + } + + @Override + public boolean overridesTitle() { + return true; + } +} diff --git a/G-Earth/src/main/java/gearth/ui/themes/TanjiTheme.java b/G-Earth/src/main/java/gearth/ui/themes/TanjiTheme.java new file mode 100644 index 0000000..abf3078 --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/themes/TanjiTheme.java @@ -0,0 +1,23 @@ +package gearth.ui.themes; + +public class TanjiTheme implements Theme { + @Override + public String title() { + return "Tanji"; + } + + @Override + public String internalName() { + return "Tanji"; + } + + @Override + public boolean overridesLogo() { + return false; + } + + @Override + public boolean overridesTitle() { + return false; + } +} diff --git a/G-Earth/src/main/java/gearth/ui/themes/Theme.java b/G-Earth/src/main/java/gearth/ui/themes/Theme.java index a2bae69..ee50c28 100644 --- a/G-Earth/src/main/java/gearth/ui/themes/Theme.java +++ b/G-Earth/src/main/java/gearth/ui/themes/Theme.java @@ -1,7 +1,11 @@ package gearth.ui.themes; -public class Theme { +public interface Theme { + String title(); + String internalName(); + boolean overridesLogo(); + boolean overridesTitle(); } diff --git a/G-Earth/src/main/java/gearth/ui/themes/ThemeFactory.java b/G-Earth/src/main/java/gearth/ui/themes/ThemeFactory.java new file mode 100644 index 0000000..915b27d --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/themes/ThemeFactory.java @@ -0,0 +1,27 @@ +package gearth.ui.themes; + +import java.util.Arrays; +import java.util.List; + +public class ThemeFactory { + + private static List themes = Arrays.asList( + new LightTheme(), + new TanjiTheme(), + new DarkTheme() + ); + + public static Theme getDefaultTheme() { + return themes.get(0); + } + + public static List allThemes() { + return themes; + } + + // returns default theme if not found + public static Theme themeForTitle(String title) { + return allThemes().stream().filter(theme -> theme.title().equals(title)).findFirst().orElse(getDefaultTheme()); + } + +} diff --git a/G-Earth/src/main/java/gearth/ui/titlebar/DefaultTitleBarConfig.java b/G-Earth/src/main/java/gearth/ui/titlebar/DefaultTitleBarConfig.java new file mode 100644 index 0000000..2fed191 --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/titlebar/DefaultTitleBarConfig.java @@ -0,0 +1,56 @@ +package gearth.ui.titlebar; + +import gearth.GEarth; +import gearth.ui.themes.Theme; +import gearth.ui.themes.ThemeFactory; +import javafx.scene.image.Image; +import javafx.stage.Stage; + +// a typical config to be used in all windows that is not the g-earth main window +public class DefaultTitleBarConfig implements TitleBarConfig { + + protected Stage stage; + private String currentStylesheet = null; + private Theme currentTheme; + + + public DefaultTitleBarConfig(Stage stage) { + this.stage = stage; + currentTheme = ThemeFactory.getDefaultTheme(); + setTheme(currentTheme); + } + + @Override + public boolean displayThemePicker() { + return false; + } + + @Override + public void onCloseClicked() { + + } + + @Override + public void onMinimizeClicked() { + stage.setIconified(true); + } + + @Override + public void setTheme(Theme theme) { + currentTheme = theme; + Theme defaultTheme = ThemeFactory.getDefaultTheme(); + if (currentStylesheet != null) { + stage.getScene().getStylesheets().remove(currentStylesheet); + } + currentStylesheet = GEarth.class.getResource(String.format("/gearth/ui/themes/%s/styling.css", theme.internalName())).toExternalForm(); + stage.getScene().getStylesheets().add(currentStylesheet); + + stage.getIcons().clear(); + stage.getIcons().add(new Image(GEarth.class.getResourceAsStream(String.format("/gearth/ui/themes/%s/logoSmall.png", theme.overridesLogo() ? theme.internalName() : defaultTheme.internalName())))); + } + + @Override + public Theme getCurrentTheme() { + return currentTheme; + } +} diff --git a/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarConfig.java b/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarConfig.java index 57537d0..6186284 100644 --- a/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarConfig.java +++ b/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarConfig.java @@ -1,10 +1,13 @@ package gearth.ui.titlebar; +import gearth.ui.themes.Theme; + public interface TitleBarConfig { boolean displayThemePicker(); void onCloseClicked(); void onMinimizeClicked(); - void onSetTheme(String theme); + void setTheme(Theme theme); + Theme getCurrentTheme(); } diff --git a/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarController.java b/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarController.java index 1806086..cd654ae 100644 --- a/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarController.java +++ b/G-Earth/src/main/java/gearth/ui/titlebar/TitleBarController.java @@ -1,10 +1,15 @@ package gearth.ui.titlebar; import gearth.GEarth; -import javafx.application.Platform; +import gearth.ui.themes.Theme; +import gearth.ui.themes.ThemeFactory; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; @@ -13,12 +18,12 @@ import javafx.stage.Stage; import javafx.stage.StageStyle; import java.io.IOException; -import java.util.Arrays; public class TitleBarController { public Label titleLabel; public Pane titleBar; + public ImageView titleIcon; private Stage stage; private TitleBarConfig config; @@ -38,9 +43,21 @@ public class TitleBarController { stage.getScene().setRoot(newParent); parent.getScene().setFill(Color.TRANSPARENT); + stage.titleProperty().addListener((i) -> controller.setTitle(stage.getTitle())); + controller.setTitle(stage.getTitle()); + + stage.getIcons().addListener((InvalidationListener) observable -> controller.updateIcon()); + controller.updateIcon(); + return controller; } + public void updateIcon() { + titleIcon.setImage(stage.getIcons().size() > 0 ? stage.getIcons().get(0) : + new Image(GEarth.class.getResourceAsStream( + String.format("/gearth/ui/themes/%s/logoSmall.png", ThemeFactory.getDefaultTheme().internalName())))); + } + public void setTitle(String title) { titleLabel.setText(title); } @@ -51,7 +68,7 @@ public class TitleBarController { } public void handleMinimizeAction(MouseEvent event) { - stage.setIconified(true); + config.onMinimizeClicked(); } private double xOffset, yOffset; @@ -67,8 +84,8 @@ public class TitleBarController { } public void toggleTheme(MouseEvent event) { - int themeIndex = Arrays.asList(GEarth.themes).indexOf(GEarth.theme); - config.onSetTheme(GEarth.themes[(themeIndex + 1) % GEarth.themes.length]); + int themeIndex = ThemeFactory.allThemes().indexOf(config.getCurrentTheme()); + config.setTheme(ThemeFactory.allThemes().get((themeIndex + 1) % ThemeFactory.allThemes().size())); } } diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/styling.css b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/styling.css index bc70a61..03e337a 100644 --- a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/styling.css +++ b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth/styling.css @@ -949,7 +949,7 @@ VBox > .split-menu-button.last > .arrow-button { } #icon { - -fx-image: url("logoSmall.png"); + /*-fx-image: url("logoSmall.png");*/ } #theme-button { diff --git a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/styling.css b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/styling.css index 6d12ffe..9f78ffa 100644 --- a/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/styling.css +++ b/G-Earth/src/main/resources/gearth/ui/themes/G-Earth_Dark/styling.css @@ -992,7 +992,7 @@ VBox > .split-menu-button.last > .arrow-button { } #icon { - -fx-image: url("logoSmall.png"); + /*-fx-image: url("logoSmall.png");*/ } #theme-button { diff --git a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/styling.css b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/styling.css index 26c68e8..9ae3974 100644 --- a/G-Earth/src/main/resources/gearth/ui/themes/Tanji/styling.css +++ b/G-Earth/src/main/resources/gearth/ui/themes/Tanji/styling.css @@ -949,7 +949,7 @@ VBox > .split-menu-button.last > .arrow-button { } #icon { - -fx-image: url("logoSmall.png"); + /*-fx-image: url("logoSmall.png");*/ } #theme-button { diff --git a/G-Earth/src/main/resources/gearth/ui/titlebar/Titlebar.fxml b/G-Earth/src/main/resources/gearth/ui/titlebar/Titlebar.fxml index 76aafba..cdf7ae1 100644 --- a/G-Earth/src/main/resources/gearth/ui/titlebar/Titlebar.fxml +++ b/G-Earth/src/main/resources/gearth/ui/titlebar/Titlebar.fxml @@ -1,35 +1,58 @@ - + + - + - - - - - - - - - + + + + + + + + + + + - + - + - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + +