diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionBase.java b/G-Earth/src/main/java/gearth/extensions/ExtensionBase.java index 4b4881c..d801aeb 100644 --- a/G-Earth/src/main/java/gearth/extensions/ExtensionBase.java +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionBase.java @@ -33,7 +33,7 @@ public abstract class ExtensionBase extends IExtension { volatile PacketInfoManager packetInfoManager = PacketInfoManager.EMPTY; - protected ObservableObject observableHostInfo = new ObservableObject<>(null); + ObservableObject observableHostInfo = new ObservableObject<>(null); void updateHostInfo(HostInfo hostInfo) { observableHostInfo.setObject(hostInfo); diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java b/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java index 326eaf0..6922c93 100644 --- a/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java @@ -1,12 +1,17 @@ package gearth.extensions; +import gearth.misc.HostInfo; +import gearth.misc.listenerpattern.Observable; import gearth.services.packet_info.PacketInfoManager; import javafx.application.HostServices; import javafx.application.Platform; +import javafx.beans.InvalidationListener; import javafx.stage.Stage; import gearth.protocol.HMessage; import gearth.protocol.HPacket; +import java.util.function.Consumer; + /** * Created by Jonas on 22/09/18. */ @@ -92,4 +97,10 @@ public abstract class ExtensionForm extends ExtensionBase { public HostServices getHostServices() { return hostServices; } + + public HostInfo getHostInfo() { + return extension.observableHostInfo.getObject(); + } + + Observable fieldsInitialized = new Observable<>(Runnable::run); } diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java b/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java index 170b398..8f67369 100644 --- a/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java @@ -60,6 +60,7 @@ public class ExtensionFormLauncher extends Application { extensionForm.extension = extension; extensionForm.primaryStage = primaryStage; + extensionForm.fieldsInitialized.fireEvent(); Thread t = new Thread(() -> { extension.run(); //when the extension has ended, close this process diff --git a/G-Earth/src/main/java/gearth/extensions/ThemedExtensionFormCreator.java b/G-Earth/src/main/java/gearth/extensions/ThemedExtensionFormCreator.java new file mode 100644 index 0000000..5941757 --- /dev/null +++ b/G-Earth/src/main/java/gearth/extensions/ThemedExtensionFormCreator.java @@ -0,0 +1,67 @@ +package gearth.extensions; + +import gearth.ui.themes.Theme; +import gearth.ui.themes.ThemeFactory; +import gearth.ui.titlebar.DefaultTitleBarConfig; +import gearth.ui.titlebar.TitleBarController; +import javafx.application.Platform; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; + +import java.net.URL; + +public abstract class ThemedExtensionFormCreator extends ExtensionFormCreator { + + @Override + protected ExtensionForm createForm(Stage primaryStage) throws Exception { + FXMLLoader loader = new FXMLLoader(getFormResource()); + Parent root = loader.load(); + + primaryStage.setTitle(getTitle()); + primaryStage.setScene(new Scene(root)); + initialize(primaryStage); + primaryStage.setResizable(false); + primaryStage.sizeToScene(); + + DefaultTitleBarConfig config = new DefaultTitleBarConfig(primaryStage, ThemeFactory.getDefaultTheme()) { + @Override + public boolean displayThemePicker() { + return false; + } + }; + TitleBarController.create(primaryStage, config); + + ExtensionForm extensionForm = loader.getController(); + extensionForm.fieldsInitialized.addListener(() -> extensionForm.extension.observableHostInfo.addListener(hostInfo -> { + if (hostInfo.getAttributes().containsKey("theme")) { + String themeTitle = hostInfo.getAttributes().get("theme"); + Theme theme = ThemeFactory.themeForTitle(themeTitle); + if (config.getCurrentTheme() != theme) { + String styleClassOld = config.getCurrentTheme().title().replace(" ", "-").toLowerCase(); + String styleClassNew = theme.title().replace(" ", "-").toLowerCase(); + config.setTheme(theme); + Parent currentRoot = primaryStage.getScene().getRoot(); + Platform.runLater(() -> { + currentRoot.getStyleClass().remove(styleClassOld); + currentRoot.getStyleClass().add(styleClassNew); + }); + } + } + })); + + + return extensionForm; + } + + protected abstract String getTitle(); + protected abstract URL getFormResource(); + + // can be overridden for more settings + protected void initialize(Stage primaryStage) { + + } +} 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 431f730..2dbe3c7 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 @@ -974,6 +974,10 @@ VBox > .split-menu-button.last > .arrow-button { -fx-text-fill: black; } +.label.softer { + -fx-text-fill: rgba(0, 0, 0, 0.8); +} + .list-view { -fx-border-color: #cccccc; -fx-border-radius: 4; 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 f6209c3..03c6c2e 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 @@ -1036,6 +1036,10 @@ VBox > .split-menu-button.last > .arrow-button { -fx-text-fill: #f0f0f0 !important; } +.label.softer { + -fx-text-fill: rgba(240, 240, 240, 0.8); +} + .pckt-info { -fx-fill: #ffffffa0; } 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 080056c..7d76f93 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 @@ -973,6 +973,10 @@ VBox > .split-menu-button.last > .arrow-button { -fx-text-fill: black; } +.label.softer { + -fx-text-fill: rgba(0, 0, 0, 0.8); +} + .list-view { -fx-border-color: #cccccc; -fx-border-radius: 4;