diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java index 6c0b60e8d..b1ab82646 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -66,6 +66,7 @@ public final class Config implements Cloneable, Observable { .registerTypeAdapter(ObservableSet.class, new ObservableSetCreator()) .registerTypeAdapter(ObservableMap.class, new ObservableMapCreator()) .registerTypeAdapterFactory(new JavaFxPropertyTypeAdapterFactory(true, true)) + .registerTypeAdapter(Theme.class, new Theme.TypeAdapter()) .registerTypeAdapter(EnumBackgroundImage.class, new EnumOrdinalDeserializer<>(EnumBackgroundImage.class)) // backward compatibility for backgroundType .registerTypeAdapter(Proxy.Type.class, new EnumOrdinalDeserializer<>(Proxy.Type.class)) // backward compatibility for hasProxy .setPrettyPrinting() @@ -113,7 +114,7 @@ public final class Config implements Cloneable, Observable { private StringProperty proxyPass = new SimpleStringProperty(); @SerializedName("theme") - private StringProperty theme = new SimpleStringProperty(); + private ObjectProperty theme = new SimpleObjectProperty<>(Theme.BLUE); @SerializedName("localization") private StringProperty localization = new SimpleStringProperty(); @@ -320,15 +321,15 @@ public final class Config implements Cloneable, Observable { return proxyPass; } - public String getTheme() { + public Theme getTheme() { return theme.get(); } - public void setTheme(String theme) { + public void setTheme(Theme theme) { this.theme.set(theme); } - public StringProperty themeProperty() { + public ObjectProperty themeProperty() { return theme; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index c5d73164c..a1b667c2b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -257,31 +257,6 @@ public class Settings { selectedAccount.get(); } - /**************************************** - * THEME * - ****************************************/ - - private final ImmediateObjectProperty theme = new ImmediateObjectProperty(this, "theme", Theme.getTheme(CONFIG.getTheme()).orElse(Theme.BLUE)) { - @Override - public void invalidated() { - super.invalidated(); - - CONFIG.setTheme(get().getName().toLowerCase()); - } - }; - - public Theme getTheme() { - return theme.get(); - } - - public void setTheme(Theme theme) { - this.theme.set(theme); - } - - public ImmediateObjectProperty themeProperty() { - return theme; - } - /**************************************** * PROFILES * ****************************************/ diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java index 0ec6d8b0d..d3ee6ba6d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java @@ -24,6 +24,11 @@ import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.IOUtils; import org.jackhuang.hmcl.util.Logging; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; + import java.io.File; import java.io.IOException; import java.util.Optional; @@ -115,7 +120,7 @@ public class Theme { } public static ObjectBinding foregroundFillBinding() { - return Bindings.createObjectBinding(() -> Settings.INSTANCE.getTheme().getForegroundColor(), Settings.INSTANCE.themeProperty()); + return Bindings.createObjectBinding(() -> CONFIG.getTheme().getForegroundColor(), CONFIG.themeProperty()); } public static ObjectBinding blackFillBinding() { @@ -125,4 +130,16 @@ public class Theme { public static ObjectBinding whiteFillBinding() { return Bindings.createObjectBinding(() -> Color.WHITE); } + + public static class TypeAdapter extends com.google.gson.TypeAdapter { + @Override + public void write(JsonWriter out, Theme value) throws IOException { + out.value(value.getName().toLowerCase()); + } + + @Override + public Theme read(JsonReader in) throws IOException { + return getTheme(in.nextString()).orElse(Theme.BLUE); + } + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index bc4f297f5..e2abc47d5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -34,6 +34,8 @@ import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane; import org.jackhuang.hmcl.util.FutureCallback; import org.jackhuang.hmcl.util.JavaVersion; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; + import java.util.function.Consumer; public final class Controllers { @@ -106,7 +108,7 @@ public final class Controllers { decorator.setCustomMaximize(false); scene = new Scene(decorator, 804, 521); - scene.getStylesheets().setAll(Settings.INSTANCE.getTheme().getStylesheets()); + scene.getStylesheets().setAll(CONFIG.getTheme().getStylesheets()); stage.setMinWidth(804); stage.setMaxWidth(804); stage.setMinHeight(521); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java index 4a2de4f0f..4cc24c1b2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -43,6 +43,7 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.concurrent.CountDownLatch; @@ -64,7 +65,7 @@ public final class LogWindow extends Stage { public LogWindow() { setScene(new Scene(impl, 800, 480)); - getScene().getStylesheets().addAll(Settings.INSTANCE.getTheme().getStylesheets()); + getScene().getStylesheets().addAll(CONFIG.getTheme().getStylesheets()); setTitle(i18n("logwindow.title")); getIcons().add(new Image("/assets/img/icon.png")); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index 25a4aa39e..be56e0d43 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -202,13 +202,13 @@ public final class SettingsPage extends StackPane implements DecoratorPage { CONFIG.setBackgroundImageType((EnumBackgroundImage) newValue.getUserData())); // theme - JFXColorPicker picker = new JFXColorPicker(Color.web(Settings.INSTANCE.getTheme().getColor()), null); + JFXColorPicker picker = new JFXColorPicker(Color.web(CONFIG.getTheme().getColor()), null); picker.setCustomColorText(i18n("color.custom")); picker.setRecentColorsText(i18n("color.recent")); picker.getCustomColors().setAll(Theme.SUGGESTED_COLORS); picker.setOnAction(e -> { Theme theme = Theme.custom(Theme.getColorDisplayName(picker.getValue())); - Settings.INSTANCE.setTheme(theme); + CONFIG.setTheme(theme); Controllers.getScene().getStylesheets().setAll(theme.getStylesheets()); }); themeColorPickerContainer.getChildren().setAll(picker); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java index 34089f027..3d9217fb3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java @@ -21,14 +21,15 @@ import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.web.WebView; import javafx.stage.Stage; -import org.jackhuang.hmcl.setting.Settings; + +import static org.jackhuang.hmcl.setting.ConfigHolder.CONFIG; public class WebStage extends Stage { private final WebView webView = new WebView(); public WebStage() { setScene(new Scene(webView, 800, 480)); - getScene().getStylesheets().addAll(Settings.INSTANCE.getTheme().getStylesheets()); + getScene().getStylesheets().addAll(CONFIG.getTheme().getStylesheets()); getIcons().add(new Image("/assets/img/icon.png")); }