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 98e0cbda9..744815f7a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -17,256 +17,92 @@ */ package org.jackhuang.hmcl.setting; -import com.google.gson.annotations.SerializedName; -import org.jackhuang.hmcl.Launcher; -import org.jackhuang.hmcl.util.JavaVersion; +import java.util.HashSet; +import java.util.Map; +import java.util.TreeMap; -import java.util.*; +import org.jackhuang.hmcl.Launcher; +import com.google.gson.annotations.SerializedName; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.DoubleProperty; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.collections.ObservableMap; +import javafx.collections.ObservableSet; public final class Config implements Cloneable { @SerializedName("last") - private String selectedProfile = ""; + public final StringProperty selectedProfile = new SimpleStringProperty(""); @SerializedName("backgroundType") - private int backgroundImageType = 0; + public final IntegerProperty backgroundImageType = new SimpleIntegerProperty(0); @SerializedName("bgpath") - private String backgroundImage = null; + public final StringProperty backgroundImage = new SimpleStringProperty(); @SerializedName("commonpath") - private String commonDirectory = Launcher.MINECRAFT_DIRECTORY.getAbsolutePath(); + public final StringProperty commonDirectory = new SimpleStringProperty(Launcher.MINECRAFT_DIRECTORY.getAbsolutePath()); @SerializedName("hasProxy") - private boolean hasProxy = false; + public final BooleanProperty hasProxy = new SimpleBooleanProperty(); @SerializedName("hasProxyAuth") - private boolean hasProxyAuth = false; + public final BooleanProperty hasProxyAuth = new SimpleBooleanProperty(); @SerializedName("proxyType") - private int proxyType = 0; + public final IntegerProperty proxyType = new SimpleIntegerProperty(); @SerializedName("proxyHost") - private String proxyHost = null; + public final StringProperty proxyHost = new SimpleStringProperty(); @SerializedName("proxyPort") - private String proxyPort = null; + public final StringProperty proxyPort = new SimpleStringProperty(); @SerializedName("proxyUserName") - private String proxyUser = null; + public final StringProperty proxyUser = new SimpleStringProperty(); @SerializedName("proxyPassword") - private String proxyPass = null; + public final StringProperty proxyPass = new SimpleStringProperty(); @SerializedName("theme") - private String theme = null; - - @SerializedName("java") - private List java = null; + public final StringProperty theme = new SimpleStringProperty(); @SerializedName("localization") - private String localization; + public final StringProperty localization = new SimpleStringProperty(); @SerializedName("downloadtype") - private int downloadType = 0; + public final IntegerProperty downloadType = new SimpleIntegerProperty(); @SerializedName("configurations") - private Map configurations = new TreeMap<>(); + public final ObservableMap configurations = FXCollections.observableMap(new TreeMap<>()); @SerializedName("accounts") - private List> accounts = new LinkedList<>(); + public final ObservableList> accounts = FXCollections.observableArrayList(); @SerializedName("selectedAccount") - private String selectedAccount = ""; + public final StringProperty selectedAccount = new SimpleStringProperty(""); @SerializedName("fontFamily") - private String fontFamily = "Consolas"; + public final StringProperty fontFamily = new SimpleStringProperty("Consolas"); @SerializedName("fontSize") - private double fontSize = 12; + public final DoubleProperty fontSize = new SimpleDoubleProperty(12); @SerializedName("logLines") - private int logLines = 100; + public final IntegerProperty logLines = new SimpleIntegerProperty(100); @SerializedName("authlibInjectorServerURLs") - private Set authlibInjectorServerURLs = new HashSet<>(); - - public String getSelectedProfile() { - return selectedProfile; - } - - public void setSelectedProfile(String selectedProfile) { - this.selectedProfile = selectedProfile; - } - - public String getBackgroundImage() { - return backgroundImage; - } - - public void setBackgroundImage(String backgroundImage) { - this.backgroundImage = backgroundImage; - } - - public int getBackgroundImageType() { - return backgroundImageType; - } - - public void setBackgroundImageType(int backgroundImageType) { - this.backgroundImageType = backgroundImageType; - } - - public String getCommonDirectory() { - return commonDirectory; - } - - public void setCommonDirectory(String commonDirectory) { - this.commonDirectory = commonDirectory; - } - - public boolean isHasProxy() { - return hasProxy; - } - - public void setHasProxy(boolean hasProxy) { - this.hasProxy = hasProxy; - } - - public boolean isHasProxyAuth() { - return hasProxyAuth; - } - - public void setHasProxyAuth(boolean hasProxyAuth) { - this.hasProxyAuth = hasProxyAuth; - } - - public int getProxyType() { - return proxyType; - } - - public void setProxyType(int proxyType) { - this.proxyType = proxyType; - } - - public String getProxyHost() { - return proxyHost; - } - - public void setProxyHost(String proxyHost) { - this.proxyHost = proxyHost; - } - - public String getProxyPort() { - return proxyPort; - } - - public void setProxyPort(String proxyPort) { - this.proxyPort = proxyPort; - } - - public String getProxyUser() { - return proxyUser; - } - - public void setProxyUser(String proxyUser) { - this.proxyUser = proxyUser; - } - - public String getProxyPass() { - return proxyPass; - } - - public void setProxyPass(String proxyPass) { - this.proxyPass = proxyPass; - } - - public String getTheme() { - return theme; - } - - public void setTheme(String theme) { - this.theme = theme; - } - - public List getJava() { - return java; - } - - public void setJava(List java) { - this.java = java; - } - - public String getLocalization() { - return localization; - } - - public void setLocalization(String localization) { - this.localization = localization; - } - - public int getDownloadType() { - return downloadType; - } - - public void setDownloadType(int downloadType) { - this.downloadType = downloadType; - } - - public Map getConfigurations() { - return configurations; - } - - public void setConfigurations(Map configurations) { - this.configurations = configurations; - } - - public List> getAccounts() { - return accounts; - } - - public void setAccounts(List> accounts) { - this.accounts = accounts; - } - - public String getSelectedAccount() { - return selectedAccount; - } - - public void setSelectedAccount(String selectedAccount) { - this.selectedAccount = selectedAccount; - } - - public String getFontFamily() { - return fontFamily; - } - - public void setFontFamily(String fontFamily) { - this.fontFamily = fontFamily; - } - - public double getFontSize() { - return fontSize; - } - - public void setFontSize(double fontSize) { - this.fontSize = fontSize; - } - - public int getLogLines() { - return logLines; - } - - public void setLogLines(int logLines) { - this.logLines = logLines; - } - - public Set getAuthlibInjectorServerURLs() { - return authlibInjectorServerURLs; - } - - public void setAuthlibInjectorServerURLs(Set authlibInjectorServerURLs) { - this.authlibInjectorServerURLs = authlibInjectorServerURLs; - } + public final ObservableSet authlibInjectorServerURLs = FXCollections.observableSet(new HashSet<>()); + @Override public Config clone() { return Settings.GSON.fromJson(Settings.GSON.toJson(this), Config.class); } 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 4c03b9e28..713ad792e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -22,7 +22,15 @@ import com.google.gson.GsonBuilder; import javafx.beans.property.ObjectProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ObservableValue; +import javafx.collections.ObservableList; +import javafx.collections.ObservableMap; +import javafx.collections.ObservableSet; import javafx.scene.text.Font; + +import org.hildan.fxgson.creators.ObservableListCreator; +import org.hildan.fxgson.creators.ObservableMapCreator; +import org.hildan.fxgson.creators.ObservableSetCreator; +import org.hildan.fxgson.factories.JavaFxPropertyTypeAdapterFactory; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.AccountFactory; @@ -50,7 +58,12 @@ public class Settings { .registerTypeAdapter(VersionSetting.class, VersionSetting.Serializer.INSTANCE) .registerTypeAdapter(Profile.class, Profile.Serializer.INSTANCE) .registerTypeAdapter(File.class, FileTypeAdapter.INSTANCE) - .setPrettyPrinting().create(); + .registerTypeAdapter(ObservableList.class, new ObservableListCreator()) + .registerTypeAdapter(ObservableSet.class, new ObservableSetCreator()) + .registerTypeAdapter(ObservableMap.class, new ObservableMapCreator()) + .registerTypeAdapterFactory(new JavaFxPropertyTypeAdapterFactory(true, true)) + .setPrettyPrinting() + .create(); public static final String DEFAULT_PROFILE = "Default"; public static final String HOME_PROFILE = "Home"; @@ -67,7 +80,7 @@ public class Settings { private Settings() { loadProxy(); - for (Iterator> iterator = SETTINGS.getAccounts().iterator(); iterator.hasNext(); ) { + for (Iterator> iterator = SETTINGS.accounts.iterator(); iterator.hasNext();) { Map settings = iterator.next(); AccountFactory factory = Accounts.ACCOUNT_FACTORY.get(tryCast(settings.get("type"), String.class).orElse("")); if (factory == null) { @@ -88,7 +101,6 @@ public class Settings { accounts.put(Accounts.getAccountId(account), account); } - checkAuthlibInjectorServerURLs(); checkAuthlibInjectorAccounts(); checkProfileMap(); @@ -124,11 +136,11 @@ public class Settings { public void save() { try { - SETTINGS.getAccounts().clear(); + SETTINGS.accounts.clear(); for (Account account : accounts.values()) { Map storage = account.toStorage(); storage.put("type", Accounts.getAccountType(account)); - SETTINGS.getAccounts().add(storage); + SETTINGS.accounts.add(storage); } FileUtils.writeText(SETTINGS_FILE, GSON.toJson(SETTINGS)); @@ -137,12 +149,12 @@ public class Settings { } } - private final StringProperty commonPath = new ImmediateStringProperty(this, "commonPath", SETTINGS.getCommonDirectory()) { + private final StringProperty commonPath = new ImmediateStringProperty(this, "commonPath", SETTINGS.commonDirectory.get()) { @Override public void invalidated() { super.invalidated(); - SETTINGS.setCommonDirectory(get()); + SETTINGS.commonDirectory.set(get()); save(); } }; @@ -159,7 +171,7 @@ public class Settings { this.commonPath.set(commonPath); } - private Locales.SupportedLocale locale = Locales.getLocaleByName(SETTINGS.getLocalization()); + private Locales.SupportedLocale locale = Locales.getLocaleByName(SETTINGS.localization.get()); public Locales.SupportedLocale getLocale() { return locale; @@ -167,7 +179,7 @@ public class Settings { public void setLocale(Locales.SupportedLocale locale) { this.locale = locale; - SETTINGS.setLocalization(Locales.getNameByLocale(locale)); + SETTINGS.localization.set(Locales.getNameByLocale(locale)); save(); } @@ -177,7 +189,7 @@ public class Settings { return proxy; } - private Proxy.Type proxyType = Proxies.getProxyType(SETTINGS.getProxyType()); + private Proxy.Type proxyType = Proxies.getProxyType(SETTINGS.proxyType.get()); public Proxy.Type getProxyType() { return proxyType; @@ -185,58 +197,62 @@ public class Settings { public void setProxyType(Proxy.Type proxyType) { this.proxyType = proxyType; - SETTINGS.setProxyType(Proxies.PROXIES.indexOf(proxyType)); + SETTINGS.proxyType.set(Proxies.PROXIES.indexOf(proxyType)); save(); loadProxy(); } public String getProxyHost() { - return SETTINGS.getProxyHost(); + return SETTINGS.proxyHost.get(); } public void setProxyHost(String proxyHost) { - SETTINGS.setProxyHost(proxyHost); + SETTINGS.proxyHost.set(proxyHost); save(); } public String getProxyPort() { - return SETTINGS.getProxyPort(); + return SETTINGS.proxyPort.get(); } public void setProxyPort(String proxyPort) { - SETTINGS.setProxyPort(proxyPort); + SETTINGS.proxyPort.set(proxyPort); save(); } public String getProxyUser() { - return SETTINGS.getProxyUser(); + return SETTINGS.proxyUser.get(); } public void setProxyUser(String proxyUser) { - SETTINGS.setProxyUser(proxyUser); + SETTINGS.proxyUser.set(proxyUser); save(); } public String getProxyPass() { - return SETTINGS.getProxyPass(); + return SETTINGS.proxyPass.get(); } public void setProxyPass(String proxyPass) { - SETTINGS.setProxyPass(proxyPass); + SETTINGS.proxyPass.set(proxyPass); save(); } - public boolean hasProxy() { return SETTINGS.isHasProxy(); } + public boolean hasProxy() { + return SETTINGS.hasProxy.get(); + } public void setHasProxy(boolean hasProxy) { - SETTINGS.setHasProxy(hasProxy); + SETTINGS.hasProxy.set(hasProxy); save(); } - public boolean hasProxyAuth() { return SETTINGS.isHasProxyAuth(); } + public boolean hasProxyAuth() { + return SETTINGS.hasProxyAuth.get(); + } public void setHasProxyAuth(boolean hasProxyAuth) { - SETTINGS.setHasProxyAuth(hasProxyAuth); + SETTINGS.hasProxyAuth.set(hasProxyAuth); save(); } @@ -267,21 +283,21 @@ public class Settings { } public Font getFont() { - return Font.font(SETTINGS.getFontFamily(), SETTINGS.getFontSize()); + return Font.font(SETTINGS.fontFamily.get(), SETTINGS.fontSize.get()); } public void setFont(Font font) { - SETTINGS.setFontFamily(font.getFamily()); - SETTINGS.setFontSize(font.getSize()); + SETTINGS.fontFamily.set(font.getFamily()); + SETTINGS.fontSize.set(font.getSize()); save(); } public int getLogLines() { - return Math.max(SETTINGS.getLogLines(), 100); + return Math.max(SETTINGS.logLines.get(), 100); } public void setLogLines(int logLines) { - SETTINGS.setLogLines(logLines); + SETTINGS.logLines.set(logLines); save(); } @@ -290,37 +306,26 @@ public class Settings { ****************************************/ public Set getAuthlibInjectorServerURLs() { - return SETTINGS.getAuthlibInjectorServerURLs(); + return SETTINGS.authlibInjectorServerURLs; } public void removeAuthlibInjectorServerURL(String serverURL) { - checkAuthlibInjectorServerURLs(); - - SETTINGS.getAuthlibInjectorServerURLs().remove(serverURL); + SETTINGS.authlibInjectorServerURLs.remove(serverURL); checkAuthlibInjectorAccounts(); save(); } public void addAuthlibInjectorServerURL(String serverURL) { - checkAuthlibInjectorServerURLs(); - - SETTINGS.getAuthlibInjectorServerURLs().add(serverURL); + SETTINGS.authlibInjectorServerURLs.add(serverURL); save(); } - private void checkAuthlibInjectorServerURLs() { - if (SETTINGS.getAuthlibInjectorServerURLs() == null) { - SETTINGS.setAuthlibInjectorServerURLs(new HashSet<>()); - save(); - } - } - private void checkAuthlibInjectorAccounts() { for (Account account : getAccounts()) { if (account instanceof AuthlibInjectorAccount) { AuthlibInjectorAccount injectorAccount = (AuthlibInjectorAccount) account; - if (!SETTINGS.getAuthlibInjectorServerURLs().contains(injectorAccount.getServerBaseURL())) + if (!SETTINGS.authlibInjectorServerURLs.contains(injectorAccount.getServerBaseURL())) deleteAccount(account); } } @@ -331,14 +336,14 @@ public class Settings { ****************************************/ public DownloadProvider getDownloadProvider() { - return DownloadProviders.getDownloadProvider(SETTINGS.getDownloadType()); + return DownloadProviders.getDownloadProvider(SETTINGS.downloadType.get()); } public void setDownloadProvider(DownloadProvider downloadProvider) { int index = DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(downloadProvider); if (index == -1) throw new IllegalArgumentException("Unknown download provider: " + downloadProvider); - SETTINGS.setDownloadType(index); + SETTINGS.downloadType.set(index); save(); } @@ -346,7 +351,7 @@ public class Settings { * ACCOUNTS * ****************************************/ - private final ImmediateObjectProperty selectedAccount = new ImmediateObjectProperty(this, "selectedAccount", accounts.get(SETTINGS.getSelectedAccount())) { + private final ImmediateObjectProperty selectedAccount = new ImmediateObjectProperty(this, "selectedAccount", accounts.get(SETTINGS.selectedAccount.get())) { @Override public Account get() { Account a = super.get(); @@ -368,7 +373,7 @@ public class Settings { public void invalidated() { super.invalidated(); - SETTINGS.setSelectedAccount(getValue() == null ? "" : Accounts.getAccountId(getValue())); + SETTINGS.selectedAccount.set(getValue() == null ? "" : Accounts.getAccountId(getValue())); save(); } }; @@ -418,12 +423,12 @@ public class Settings { * BACKGROUND * ****************************************/ - private final ImmediateStringProperty backgroundImage = new ImmediateStringProperty(this, "backgroundImage", SETTINGS.getBackgroundImage()) { + private final ImmediateStringProperty backgroundImage = new ImmediateStringProperty(this, "backgroundImage", SETTINGS.backgroundImage.get()) { @Override public void invalidated() { super.invalidated(); - SETTINGS.setBackgroundImage(get()); + SETTINGS.backgroundImage.set(get()); save(); } }; @@ -440,12 +445,12 @@ public class Settings { this.backgroundImage.set(backgroundImage); } - private final ImmediateObjectProperty backgroundImageType = new ImmediateObjectProperty(this, "backgroundImageType", EnumBackgroundImage.indexOf(SETTINGS.getBackgroundImageType())) { + private final ImmediateObjectProperty backgroundImageType = new ImmediateObjectProperty(this, "backgroundImageType", EnumBackgroundImage.indexOf(SETTINGS.backgroundImageType.get())) { @Override public void invalidated() { super.invalidated(); - SETTINGS.setBackgroundImageType(get().ordinal()); + SETTINGS.backgroundImageType.set(get().ordinal()); save(); } }; @@ -466,12 +471,12 @@ public class Settings { * THEME * ****************************************/ - private final ImmediateObjectProperty theme = new ImmediateObjectProperty(this, "theme", Theme.getTheme(SETTINGS.getTheme()).orElse(Theme.BLUE)) { + private final ImmediateObjectProperty theme = new ImmediateObjectProperty(this, "theme", Theme.getTheme(SETTINGS.theme.get()).orElse(Theme.BLUE)) { @Override public void invalidated() { super.invalidated(); - SETTINGS.setTheme(get().getName().toLowerCase()); + SETTINGS.theme.set(get().getName().toLowerCase()); save(); } }; @@ -495,19 +500,19 @@ public class Settings { public Profile getSelectedProfile() { checkProfileMap(); - if (!hasProfile(SETTINGS.getSelectedProfile())) { + if (!hasProfile(SETTINGS.selectedProfile.get())) { getProfileMap().keySet().stream().findFirst().ifPresent(selectedProfile -> { - SETTINGS.setSelectedProfile(selectedProfile); + SETTINGS.selectedProfile.set(selectedProfile); save(); }); Schedulers.computation().schedule(this::onProfileChanged); } - return getProfile(SETTINGS.getSelectedProfile()); + return getProfile(SETTINGS.selectedProfile.get()); } public void setSelectedProfile(Profile selectedProfile) { - if (hasProfile(selectedProfile.getName()) && !Objects.equals(selectedProfile.getName(), SETTINGS.getSelectedProfile())) { - SETTINGS.setSelectedProfile(selectedProfile.getName()); + if (hasProfile(selectedProfile.getName()) && !Objects.equals(selectedProfile.getName(), SETTINGS.selectedProfile.get())) { + SETTINGS.selectedProfile.set(selectedProfile.getName()); save(); Schedulers.computation().schedule(this::onProfileChanged); } @@ -525,7 +530,7 @@ public class Settings { } public Map getProfileMap() { - return SETTINGS.getConfigurations(); + return SETTINGS.configurations; } public Collection getProfiles() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java index 6d13755db..0b4316d57 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java @@ -82,17 +82,16 @@ public final class ExportWizardProvider implements WizardProvider { try (ZipEngine zip = new ZipEngine(modpackFile)) { Config config = Settings.INSTANCE.getRawConfig(); - config.setHasProxy(false); - config.setSelectedProfile(""); - config.setCommonDirectory(null); - config.setFontFamily("Consolas"); - config.setFontSize(12); - config.setJava(null); - config.setLocalization(null); - config.setAccounts(null); - config.setSelectedAccount(""); - config.setLogLines(100); - config.setConfigurations(null); + config.hasProxy.set(false); + config.selectedProfile.set(""); + config.commonDirectory.set(null); + config.fontFamily.set("Consolas"); + config.fontSize.set(12); + config.localization.set(null); + config.accounts.clear(); + config.selectedAccount.set(""); + config.logLines.set(100); + config.configurations.clear(); zip.putTextFile(Settings.GSON.toJson(config), Settings.SETTINGS_FILE_NAME); zip.putFile(tempModpack, "modpack.zip");