From c5b8aabc57189de8808dec7b78c270a4bc8aee92 Mon Sep 17 00:00:00 2001 From: Haowei Wen Date: Sun, 29 Dec 2024 22:36:40 +0800 Subject: [PATCH] Refactor VersionSetting.clone() & .addListener(), fix javaVersionType is not saved --- .../hmcl/game/HMCLGameRepository.java | 2 +- .../org/jackhuang/hmcl/setting/Config.java | 7 +- .../jackhuang/hmcl/setting/ConfigHolder.java | 8 +- .../jackhuang/hmcl/setting/GlobalConfig.java | 7 +- .../org/jackhuang/hmcl/setting/Profile.java | 2 +- .../hmcl/setting/VersionSetting.java | 91 +++++-------------- 6 files changed, 27 insertions(+), 90 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 638546c1c..503f2870e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -218,7 +218,7 @@ public class HMCLGameRepository extends DefaultGameRepository { private VersionSetting initLocalVersionSetting(String id, VersionSetting vs) { localVersionSettings.put(id, vs); - vs.addPropertyChangedListener(a -> saveVersionSetting(id)); + vs.addListener(a -> saveVersionSetting(id)); return vs; } 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 b124c509a..44e7d3a6b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -47,7 +47,7 @@ import java.net.Proxy; import java.util.Map; import java.util.TreeMap; -public final class Config implements Cloneable, Observable { +public final class Config implements Observable { public static final int CURRENT_UI_VERSION = 0; @@ -223,11 +223,6 @@ public final class Config implements Cloneable, Observable { return CONFIG_GSON.toJson(this); } - @Override - public Config clone() { - return fromJson(this.toJson()); - } - // Getters & Setters & Properties public String getSelectedProfile() { return selectedProfile.get(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java index cbd034e95..8d5e4809b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java @@ -197,7 +197,7 @@ public final class ConfigHolder { } } - static void markConfigDirty() { + private static void markConfigDirty() { configWriter.accept(configInstance.toJson()); } @@ -241,11 +241,7 @@ public final class ConfigHolder { } } - static void markGlobalConfigDirty() { + private static void markGlobalConfigDirty() { globalConfigWriter.accept(globalConfigInstance.toJson()); } - - private static void saveGlobalConfigSync() throws IOException { - writeToConfig(globalConfigInstance.toJson()); - } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java index 7979f17fd..b78acc0cc 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java @@ -33,7 +33,7 @@ import java.lang.reflect.Type; import java.util.*; @JsonAdapter(GlobalConfig.Serializer.class) -public final class GlobalConfig implements Cloneable, Observable { +public final class GlobalConfig implements Observable { @Nullable public static GlobalConfig fromJson(String json) throws JsonParseException { @@ -79,11 +79,6 @@ public final class GlobalConfig implements Cloneable, Observable { return Config.CONFIG_GSON.toJson(this); } - @Override - public GlobalConfig clone() { - return fromJson(this.toJson()); - } - public int getAgreementVersion() { return agreementVersion.get(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java index 5b8da0995..239eef2ec 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java @@ -188,7 +188,7 @@ public final class Profile implements Observable { global.addListener(listener); gameDir.addListener(listener); useRelativePath.addListener(listener); - global.get().addPropertyChangedListener(listener); + global.get().addListener(listener); selectedVersion.addListener(listener); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java index cf337e3dd..39fb1afd4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java @@ -20,11 +20,14 @@ package org.jackhuang.hmcl.setting; import com.google.gson.*; import com.google.gson.annotations.JsonAdapter; import javafx.beans.InvalidationListener; +import javafx.beans.Observable; import javafx.beans.property.*; import org.jackhuang.hmcl.game.*; import org.jackhuang.hmcl.java.JavaManager; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.javafx.ObservableHelper; +import org.jackhuang.hmcl.util.javafx.PropertyUtils; import org.jackhuang.hmcl.java.JavaRuntime; import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jackhuang.hmcl.util.versioning.GameVersionNumber; @@ -42,7 +45,13 @@ import static org.jackhuang.hmcl.util.logging.Logger.LOG; * @author huangyuhui */ @JsonAdapter(VersionSetting.Serializer.class) -public final class VersionSetting implements Cloneable { +public final class VersionSetting implements Cloneable, Observable { + + private transient ObservableHelper helper = new ObservableHelper(this); + + public VersionSetting() { + PropertyUtils.attachListener(this, helper); + } private final BooleanProperty usesGlobalProperty = new SimpleBooleanProperty(this, "usesGlobal", true); @@ -698,79 +707,21 @@ public final class VersionSetting implements Cloneable { } } - public void addPropertyChangedListener(InvalidationListener listener) { - usesGlobalProperty.addListener(listener); - javaVersionProperty.addListener(listener); - javaDirProperty.addListener(listener); - wrapperProperty.addListener(listener); - permSizeProperty.addListener(listener); - maxMemoryProperty.addListener(listener); - minMemoryProperty.addListener(listener); - autoMemory.addListener(listener); - preLaunchCommandProperty.addListener(listener); - postExitCommand.addListener(listener); - javaArgsProperty.addListener(listener); - minecraftArgsProperty.addListener(listener); - environmentVariablesProperty.addListener(listener); - noJVMArgsProperty.addListener(listener); - notCheckGameProperty.addListener(listener); - notCheckJVMProperty.addListener(listener); - notPatchNativesProperty.addListener(listener); - showLogsProperty.addListener(listener); - serverIpProperty.addListener(listener); - fullscreenProperty.addListener(listener); - widthProperty.addListener(listener); - heightProperty.addListener(listener); - gameDirTypeProperty.addListener(listener); - gameDirProperty.addListener(listener); - processPriorityProperty.addListener(listener); - rendererProperty.addListener(listener); - useNativeGLFW.addListener(listener); - useNativeOpenAL.addListener(listener); - launcherVisibilityProperty.addListener(listener); - defaultJavaPathProperty.addListener(listener); - nativesDirProperty.addListener(listener); - nativesDirTypeProperty.addListener(listener); - versionIcon.addListener(listener); + @Override + public void addListener(InvalidationListener listener) { + helper.addListener(listener); + } + + @Override + public void removeListener(InvalidationListener listener) { + helper.removeListener(listener); } @Override public VersionSetting clone() { - VersionSetting versionSetting = new VersionSetting(); - versionSetting.setUsesGlobal(isUsesGlobal()); - versionSetting.setJavaVersionType(getJavaVersionType()); - versionSetting.setJavaVersion(getJavaVersion()); - versionSetting.setDefaultJavaPath(getDefaultJavaPath()); - versionSetting.setJavaDir(getJavaDir()); - versionSetting.setWrapper(getWrapper()); - versionSetting.setPermSize(getPermSize()); - versionSetting.setMaxMemory(getMaxMemory()); - versionSetting.setMinMemory(getMinMemory()); - versionSetting.setAutoMemory(isAutoMemory()); - versionSetting.setPreLaunchCommand(getPreLaunchCommand()); - versionSetting.setPostExitCommand(getPostExitCommand()); - versionSetting.setJavaArgs(getJavaArgs()); - versionSetting.setMinecraftArgs(getMinecraftArgs()); - versionSetting.setEnvironmentVariables(getEnvironmentVariables()); - versionSetting.setNoJVMArgs(isNoJVMArgs()); - versionSetting.setNotCheckGame(isNotCheckGame()); - versionSetting.setNotCheckJVM(isNotCheckJVM()); - versionSetting.setNotPatchNatives(isNotPatchNatives()); - versionSetting.setShowLogs(isShowLogs()); - versionSetting.setServerIp(getServerIp()); - versionSetting.setFullscreen(isFullscreen()); - versionSetting.setWidth(getWidth()); - versionSetting.setHeight(getHeight()); - versionSetting.setGameDirType(getGameDirType()); - versionSetting.setGameDir(getGameDir()); - versionSetting.setProcessPriority(getProcessPriority()); - versionSetting.setRenderer(getRenderer()); - versionSetting.setUseNativeGLFW(isUseNativeGLFW()); - versionSetting.setUseNativeOpenAL(isUseNativeOpenAL()); - versionSetting.setLauncherVisibility(getLauncherVisibility()); - versionSetting.setNativesDir(getNativesDir()); - versionSetting.setVersionIcon(getVersionIcon()); - return versionSetting; + VersionSetting cloned = new VersionSetting(); + PropertyUtils.copyProperties(this, cloned); + return cloned; } public static class Serializer implements JsonSerializer, JsonDeserializer {