From 32e45bd017ea1660186308ee3bca3fd07d671bde Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 8 Dec 2021 20:58:07 +0100 Subject: [PATCH] eros: theming --- .../profile/profiles/eros/ErosProfile.kt | 2 ++ .../profile/profiles/eros/theme/ThemeC.kt | 12 +++++++ .../minosoft/gui/eros/util/JavaFXUtil.kt | 32 ++++++++++++++++++- .../assets/minosoft/eros/themes/default.css | 0 .../assets/minosoft/eros/themes/green.css | 8 +++++ .../assets/minosoft/eros/themes/red.css | 8 +++++ .../assets/minosoft/eros/themes/yellow.css | 8 +++++ 7 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/theme/ThemeC.kt create mode 100644 src/main/resources/assets/minosoft/eros/themes/default.css create mode 100644 src/main/resources/assets/minosoft/eros/themes/green.css create mode 100644 src/main/resources/assets/minosoft/eros/themes/red.css create mode 100644 src/main/resources/assets/minosoft/eros/themes/yellow.css diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfile.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfile.kt index c0b872e41..b9b932427 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfile.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfile.kt @@ -7,6 +7,7 @@ import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager.lates import de.bixilon.minosoft.config.profile.profiles.eros.general.GeneralC import de.bixilon.minosoft.config.profile.profiles.eros.server.ServerC import de.bixilon.minosoft.config.profile.profiles.eros.text.TextC +import de.bixilon.minosoft.config.profile.profiles.eros.theme.ThemeC import de.bixilon.minosoft.util.KUtil.unsafeCast /** @@ -26,6 +27,7 @@ class ErosProfile( val general = GeneralC() + val theme = ThemeC() val server = ServerC() val text = TextC() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/theme/ThemeC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/theme/ThemeC.kt new file mode 100644 index 000000000..282d14c49 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/theme/ThemeC.kt @@ -0,0 +1,12 @@ +package de.bixilon.minosoft.config.profile.profiles.eros.theme + +import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager.delegate + +class ThemeC { + + /** + * Name of the theme css file + * Located in minosoft:eros/themes/.css + */ + var theme by delegate("default") +} diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt b/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt index b8ceed666..94248121d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/util/JavaFXUtil.kt @@ -13,7 +13,10 @@ package de.bixilon.minosoft.gui.eros.util +import com.sun.javafx.util.WeakReferenceQueue import de.bixilon.minosoft.Minosoft +import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatchFX +import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.eros.controller.EmbeddedJavaFXController import de.bixilon.minosoft.gui.eros.controller.JavaFXController @@ -39,11 +42,33 @@ import java.net.CookieManager import kotlin.reflect.jvm.javaField object JavaFXUtil { + private const val DEFAULT_STYLE = "resource:minosoft:eros/style.css" + private val stages: WeakReferenceQueue = WeakReferenceQueue() lateinit var JAVA_FX_THREAD: Thread lateinit var MINOSOFT_LOGO: Image lateinit var HOST_SERVICES: HostServices + private var watchingTheme = false + + private fun startThemeWatcher() { + if (watchingTheme) { + return + } + + ErosProfileManager.selected.theme::theme.profileWatchFX(this) { + stages.cleanup() + for (stage in stages.iterator() as Iterator) { + stage ?: continue + stage.scene.stylesheets.clear() + stage.scene.stylesheets.add(DEFAULT_STYLE) + val theme = ErosProfileManager.selected.theme.theme + stage.scene.stylesheets.add("resource:minosoft:eros/themes/$theme.css") + } + } + watchingTheme = true + } fun openModal(title: Any, layout: ResourceLocation, controller: T? = null, modality: Modality = Modality.WINDOW_MODAL): T { + startThemeWatcher() val fxmlLoader = FXMLLoader() controller?.let { fxmlLoader.setController(it) } val parent: Parent = fxmlLoader.load(Minosoft.MINOSOFT_ASSETS_MANAGER.readAssetAsStream(layout)) @@ -54,7 +79,12 @@ object JavaFXUtil { stage.scene = Scene(parent) stage.icons.setAll(MINOSOFT_LOGO) - stage.scene.stylesheets.add("resource:minosoft:eros/style.css") + stage.scene.stylesheets.add(DEFAULT_STYLE) + val theme = ErosProfileManager.selected.theme.theme + stage.scene.stylesheets.add("resource:minosoft:eros/themes/$theme.css") + + stages.cleanup() + stages.add(stage) val controller: T = fxmlLoader.getController() diff --git a/src/main/resources/assets/minosoft/eros/themes/default.css b/src/main/resources/assets/minosoft/eros/themes/default.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/resources/assets/minosoft/eros/themes/green.css b/src/main/resources/assets/minosoft/eros/themes/green.css new file mode 100644 index 000000000..81c58ddcb --- /dev/null +++ b/src/main/resources/assets/minosoft/eros/themes/green.css @@ -0,0 +1,8 @@ + +* { + -primary-color: #13d349; + -primary-light-color: #66ff7a; + -primary-dark-color: #00a012; + -primary-text-color: #000000; +} + diff --git a/src/main/resources/assets/minosoft/eros/themes/red.css b/src/main/resources/assets/minosoft/eros/themes/red.css new file mode 100644 index 000000000..5d2cbdf83 --- /dev/null +++ b/src/main/resources/assets/minosoft/eros/themes/red.css @@ -0,0 +1,8 @@ + +* { + -primary-color: #d33324; + -primary-light-color: #ff684e; + -primary-dark-color: #9a0000; + -primary-text-color: #000000; +} + diff --git a/src/main/resources/assets/minosoft/eros/themes/yellow.css b/src/main/resources/assets/minosoft/eros/themes/yellow.css new file mode 100644 index 000000000..0a0aad23d --- /dev/null +++ b/src/main/resources/assets/minosoft/eros/themes/yellow.css @@ -0,0 +1,8 @@ + +* { + -primary-color: #e8da1a; + -primary-light-color: #ffff5a; + -primary-dark-color: #b2a900; + -primary-text-color: #000000; +} +