From 846f383f7b0aa6853bc8c7516d329c25cfb0052e Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Tue, 17 Jul 2018 18:48:53 +0800 Subject: [PATCH] Remove backgroundImageTypeProperty --- .../org/jackhuang/hmcl/setting/Config.java | 6 +- .../org/jackhuang/hmcl/setting/Settings.java | 25 -------- .../java/org/jackhuang/hmcl/ui/Decorator.java | 2 +- .../org/jackhuang/hmcl/ui/SettingsPage.java | 8 +-- .../hmcl/util/EnumOrdinalDeserializer.java | 63 +++++++++++++++++++ 5 files changed, 73 insertions(+), 31 deletions(-) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/util/EnumOrdinalDeserializer.java 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 d5b3082d3..6231714a4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -29,6 +29,7 @@ import org.hildan.fxgson.creators.ObservableSetCreator; import org.hildan.fxgson.factories.JavaFxPropertyTypeAdapterFactory; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; +import org.jackhuang.hmcl.util.EnumOrdinalDeserializer; import org.jackhuang.hmcl.util.FileTypeAdapter; import org.jackhuang.hmcl.util.ObservableHelper; @@ -42,9 +43,11 @@ import javafx.beans.Observable; import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; import javafx.beans.property.IntegerProperty; +import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; @@ -62,6 +65,7 @@ public final class Config implements Cloneable, Observable { .registerTypeAdapter(ObservableSet.class, new ObservableSetCreator()) .registerTypeAdapter(ObservableMap.class, new ObservableMapCreator()) .registerTypeAdapterFactory(new JavaFxPropertyTypeAdapterFactory(true, true)) + .registerTypeAdapter(EnumBackgroundImage.class, new EnumOrdinalDeserializer<>(EnumBackgroundImage.class)) // backward compatibility for backgroundType .setPrettyPrinting() .create(); @@ -77,7 +81,7 @@ public final class Config implements Cloneable, Observable { public final StringProperty selectedProfile = new SimpleStringProperty(""); @SerializedName("backgroundType") - public final IntegerProperty backgroundImageType = new SimpleIntegerProperty(0); + public final ObjectProperty backgroundImageType = new SimpleObjectProperty<>(EnumBackgroundImage.DEFAULT); @SerializedName("bgpath") public final StringProperty backgroundImage = new SimpleStringProperty(); 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 9b53af874..3ff7b0022 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -304,31 +304,6 @@ public class Settings { selectedAccount.get(); } - /**************************************** - * BACKGROUND * - ****************************************/ - - private final ImmediateObjectProperty backgroundImageType = new ImmediateObjectProperty(this, "backgroundImageType", EnumBackgroundImage.indexOf(ConfigHolder.CONFIG.backgroundImageType.get())) { - @Override - public void invalidated() { - super.invalidated(); - - ConfigHolder.CONFIG.backgroundImageType.set(get().ordinal()); - } - }; - - public EnumBackgroundImage getBackgroundImageType() { - return backgroundImageType.get(); - } - - public ImmediateObjectProperty backgroundImageTypeProperty() { - return backgroundImageType; - } - - public void setBackgroundImageType(EnumBackgroundImage backgroundImageType) { - this.backgroundImageType.set(backgroundImageType); - } - /**************************************** * THEME * ****************************************/ diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index bb1bab43c..ef6f0a767 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -220,7 +220,7 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza try { Image background; - if (Settings.INSTANCE.getBackgroundImageType() == EnumBackgroundImage.DEFAULT) + if (ConfigHolder.CONFIG.backgroundImageType.get() == EnumBackgroundImage.DEFAULT) background = searchBackgroundImage(new Image("/assets/img/background.jpg"), ""); else background = searchBackgroundImage(new Image("/assets/img/background.jpg"), ConfigHolder.CONFIG.backgroundImage.get()); 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 ca21a4272..2d547d118 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -190,14 +190,14 @@ public final class SettingsPage extends StackPane implements DecoratorPage { FXUtils.bindString(backgroundItem.getTxtCustom(), ConfigHolder.CONFIG.backgroundImage); backgroundItem.setCustomUserData(EnumBackgroundImage.CUSTOM); - backgroundItem.getGroup().getToggles().stream().filter(it -> it.getUserData() == Settings.INSTANCE.getBackgroundImageType()).findFirst().ifPresent(it -> it.setSelected(true)); + backgroundItem.getGroup().getToggles().stream().filter(it -> it.getUserData() == ConfigHolder.CONFIG.backgroundImageType.get()).findFirst().ifPresent(it -> it.setSelected(true)); ConfigHolder.CONFIG.backgroundImage.addListener(onInvalidating(this::initBackgroundItemSubtitle)); - Settings.INSTANCE.backgroundImageTypeProperty().setChangedListener(it -> initBackgroundItemSubtitle()); + ConfigHolder.CONFIG.backgroundImageType.addListener(onInvalidating(this::initBackgroundItemSubtitle)); initBackgroundItemSubtitle(); backgroundItem.setToggleSelectedListener(newValue -> - Settings.INSTANCE.setBackgroundImageType((EnumBackgroundImage) newValue.getUserData())); + ConfigHolder.CONFIG.backgroundImageType.set((EnumBackgroundImage) newValue.getUserData())); // theme JFXColorPicker picker = new JFXColorPicker(Color.web(Settings.INSTANCE.getTheme().getColor()), null); @@ -214,7 +214,7 @@ public final class SettingsPage extends StackPane implements DecoratorPage { } private void initBackgroundItemSubtitle() { - switch (Settings.INSTANCE.getBackgroundImageType()) { + switch (ConfigHolder.CONFIG.backgroundImageType.get()) { case DEFAULT: backgroundItem.setSubtitle(i18n("launcher.background.default")); break; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/EnumOrdinalDeserializer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/EnumOrdinalDeserializer.java new file mode 100644 index 000000000..e1c3cc95b --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/EnumOrdinalDeserializer.java @@ -0,0 +1,63 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.util; + +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.annotations.SerializedName; + +/** + * A deserializer that supports deserializing strings and **numbers** into enums. + * + * @author yushijinhun + */ +public class EnumOrdinalDeserializer> implements JsonDeserializer { + + private Map mapping = new HashMap<>(); + + public EnumOrdinalDeserializer(Class enumClass) { + for (T constant : enumClass.getEnumConstants()) { + mapping.put(String.valueOf(constant.ordinal()), constant); + String name = constant.name(); + try { + SerializedName annotation = enumClass.getField(name).getAnnotation(SerializedName.class); + if (annotation != null) { + name = annotation.value(); + for (String alternate : annotation.alternate()) { + mapping.put(alternate, constant); + } + } + } catch (NoSuchFieldException e) { + throw new AssertionError(e); + } + mapping.put(name, constant); + } + } + + @Override + public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + return mapping.get(json.getAsString()); + } + +}