Refactor VersionSetting.clone() & .addListener(), fix javaVersionType is not saved

This commit is contained in:
Haowei Wen
2024-12-29 22:36:40 +08:00
parent f0a064afdd
commit c5b8aabc57
6 changed files with 27 additions and 90 deletions

View File

@@ -218,7 +218,7 @@ public class HMCLGameRepository extends DefaultGameRepository {
private VersionSetting initLocalVersionSetting(String id, VersionSetting vs) { private VersionSetting initLocalVersionSetting(String id, VersionSetting vs) {
localVersionSettings.put(id, vs); localVersionSettings.put(id, vs);
vs.addPropertyChangedListener(a -> saveVersionSetting(id)); vs.addListener(a -> saveVersionSetting(id));
return vs; return vs;
} }

View File

@@ -47,7 +47,7 @@ import java.net.Proxy;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; 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; public static final int CURRENT_UI_VERSION = 0;
@@ -223,11 +223,6 @@ public final class Config implements Cloneable, Observable {
return CONFIG_GSON.toJson(this); return CONFIG_GSON.toJson(this);
} }
@Override
public Config clone() {
return fromJson(this.toJson());
}
// Getters & Setters & Properties // Getters & Setters & Properties
public String getSelectedProfile() { public String getSelectedProfile() {
return selectedProfile.get(); return selectedProfile.get();

View File

@@ -197,7 +197,7 @@ public final class ConfigHolder {
} }
} }
static void markConfigDirty() { private static void markConfigDirty() {
configWriter.accept(configInstance.toJson()); configWriter.accept(configInstance.toJson());
} }
@@ -241,11 +241,7 @@ public final class ConfigHolder {
} }
} }
static void markGlobalConfigDirty() { private static void markGlobalConfigDirty() {
globalConfigWriter.accept(globalConfigInstance.toJson()); globalConfigWriter.accept(globalConfigInstance.toJson());
} }
private static void saveGlobalConfigSync() throws IOException {
writeToConfig(globalConfigInstance.toJson());
}
} }

View File

@@ -33,7 +33,7 @@ import java.lang.reflect.Type;
import java.util.*; import java.util.*;
@JsonAdapter(GlobalConfig.Serializer.class) @JsonAdapter(GlobalConfig.Serializer.class)
public final class GlobalConfig implements Cloneable, Observable { public final class GlobalConfig implements Observable {
@Nullable @Nullable
public static GlobalConfig fromJson(String json) throws JsonParseException { 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); return Config.CONFIG_GSON.toJson(this);
} }
@Override
public GlobalConfig clone() {
return fromJson(this.toJson());
}
public int getAgreementVersion() { public int getAgreementVersion() {
return agreementVersion.get(); return agreementVersion.get();
} }

View File

@@ -188,7 +188,7 @@ public final class Profile implements Observable {
global.addListener(listener); global.addListener(listener);
gameDir.addListener(listener); gameDir.addListener(listener);
useRelativePath.addListener(listener); useRelativePath.addListener(listener);
global.get().addPropertyChangedListener(listener); global.get().addListener(listener);
selectedVersion.addListener(listener); selectedVersion.addListener(listener);
} }

View File

@@ -20,11 +20,14 @@ package org.jackhuang.hmcl.setting;
import com.google.gson.*; import com.google.gson.*;
import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.JsonAdapter;
import javafx.beans.InvalidationListener; import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.property.*; import javafx.beans.property.*;
import org.jackhuang.hmcl.game.*; import org.jackhuang.hmcl.game.*;
import org.jackhuang.hmcl.java.JavaManager; import org.jackhuang.hmcl.java.JavaManager;
import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.Lang;
import org.jackhuang.hmcl.util.StringUtils; 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.java.JavaRuntime;
import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jackhuang.hmcl.util.platform.OperatingSystem;
import org.jackhuang.hmcl.util.versioning.GameVersionNumber; import org.jackhuang.hmcl.util.versioning.GameVersionNumber;
@@ -42,7 +45,13 @@ import static org.jackhuang.hmcl.util.logging.Logger.LOG;
* @author huangyuhui * @author huangyuhui
*/ */
@JsonAdapter(VersionSetting.Serializer.class) @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); private final BooleanProperty usesGlobalProperty = new SimpleBooleanProperty(this, "usesGlobal", true);
@@ -698,79 +707,21 @@ public final class VersionSetting implements Cloneable {
} }
} }
public void addPropertyChangedListener(InvalidationListener listener) { @Override
usesGlobalProperty.addListener(listener); public void addListener(InvalidationListener listener) {
javaVersionProperty.addListener(listener); helper.addListener(listener);
javaDirProperty.addListener(listener); }
wrapperProperty.addListener(listener);
permSizeProperty.addListener(listener); @Override
maxMemoryProperty.addListener(listener); public void removeListener(InvalidationListener listener) {
minMemoryProperty.addListener(listener); helper.removeListener(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 @Override
public VersionSetting clone() { public VersionSetting clone() {
VersionSetting versionSetting = new VersionSetting(); VersionSetting cloned = new VersionSetting();
versionSetting.setUsesGlobal(isUsesGlobal()); PropertyUtils.copyProperties(this, cloned);
versionSetting.setJavaVersionType(getJavaVersionType()); return cloned;
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;
} }
public static class Serializer implements JsonSerializer<VersionSetting>, JsonDeserializer<VersionSetting> { public static class Serializer implements JsonSerializer<VersionSetting>, JsonDeserializer<VersionSetting> {