diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index dd0a388cf..a4206e683 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -32,7 +32,6 @@ import org.jackhuang.hmcl.mod.CurseCompletionTask; import org.jackhuang.hmcl.mod.ModpackConfiguration; import org.jackhuang.hmcl.setting.LauncherVisibility; import org.jackhuang.hmcl.setting.Profile; -import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.setting.VersionSetting; import org.jackhuang.hmcl.task.*; import org.jackhuang.hmcl.ui.Controllers; @@ -50,6 +49,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; +import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -443,7 +443,7 @@ public final class LauncherHelper { System.out.print(log); logs.add(pair(log, level)); - if (logs.size() > Settings.instance().getLogLines()) + if (logs.size() > config().getLogLines()) logs.removeFirst(); if (setting.isShowLogs()) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index 8f0c210ae..550be7665 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -59,7 +59,7 @@ public final class Accounts { public static final OfflineAccountFactory FACTORY_OFFLINE = OfflineAccountFactory.INSTANCE; public static final YggdrasilAccountFactory FACTORY_YGGDRASIL = new YggdrasilAccountFactory(MojangYggdrasilProvider.INSTANCE); public static final AuthlibInjectorAccountFactory FACTORY_AUTHLIB_INJECTOR = new AuthlibInjectorAccountFactory( - new AuthlibInjectorDownloader(Launcher.HMCL_DIRECTORY.toPath(), () -> Settings.instance().getDownloadProvider())::getArtifactInfo, + new AuthlibInjectorDownloader(Launcher.HMCL_DIRECTORY.toPath(), DownloadProviders::getDownloadProvider)::getArtifactInfo, Accounts::getOrCreateAuthlibInjectorServer); private static final String TYPE_OFFLINE = "offline"; 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 5988f8621..386c01cc6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -115,8 +115,8 @@ public final class Config implements Cloneable, Observable { @SerializedName("localization") private ObjectProperty localization = new SimpleObjectProperty<>(Locales.DEFAULT); - @SerializedName("downloadtype") - private IntegerProperty downloadType = new SimpleIntegerProperty(1); + @SerializedName("downloadType") + private StringProperty downloadType = new SimpleStringProperty("bmclapi"); @SerializedName("configurations") private ObservableMap configurations = FXCollections.observableMap(new TreeMap<>()); @@ -359,15 +359,15 @@ public final class Config implements Cloneable, Observable { return localization; } - public int getDownloadType() { + public String getDownloadType() { return downloadType.get(); } - public void setDownloadType(int downloadType) { + public void setDownloadType(String downloadType) { this.downloadType.set(downloadType); } - public IntegerProperty downloadTypeProperty() { + public StringProperty downloadTypeProperty() { return downloadType; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java index 85b006662..f89408111 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java @@ -86,5 +86,17 @@ final class ConfigUpgrader { deserialized.setHasProxy(StringUtils.isNotBlank(deserialized.getProxyHost())); if (!rawJson.containsKey("hasProxyAuth")) deserialized.setHasProxyAuth(StringUtils.isNotBlank(deserialized.getProxyUser())); + + if (!rawJson.containsKey("downloadType")) { + tryCast(rawJson.get("downloadtype"), Number.class) + .map(Number::intValue) + .ifPresent(id -> { + if (id == 0) { + deserialized.setDownloadType("mojang"); + } else if (id == 1) { + deserialized.setDownloadType("bmclapi"); + } + }); + } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/DownloadProviders.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/DownloadProviders.java index b345c4ace..306192664 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/DownloadProviders.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/DownloadProviders.java @@ -17,20 +17,44 @@ */ package org.jackhuang.hmcl.setting; +import static org.jackhuang.hmcl.setting.ConfigHolder.config; +import static org.jackhuang.hmcl.util.Lang.mapOf; +import static org.jackhuang.hmcl.util.Pair.pair; + +import java.util.Map; +import java.util.Optional; + import org.jackhuang.hmcl.download.BMCLAPIDownloadProvider; -import org.jackhuang.hmcl.download.CurseCDNDownloadProvider; import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.MojangDownloadProvider; -import org.jackhuang.hmcl.util.Lang; -import java.util.List; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.ObjectBinding; +import javafx.beans.value.ObservableObjectValue; public final class DownloadProviders { private DownloadProviders() {} - public static final List DOWNLOAD_PROVIDERS = Lang.immutableListOf(new MojangDownloadProvider(), BMCLAPIDownloadProvider.INSTANCE, CurseCDNDownloadProvider.INSTANCE); + public static final Map providersById = mapOf( + pair("mojang", new MojangDownloadProvider()), + pair("bmclapi", new BMCLAPIDownloadProvider())); - public static DownloadProvider getDownloadProvider(int index) { - return Lang.get(DOWNLOAD_PROVIDERS, index).orElse(DOWNLOAD_PROVIDERS.get(0)); + public static final String DEFAULT_PROVIDER_ID = "bmclapi"; + + private static ObjectBinding downloadProviderProperty; + + static void init() { + downloadProviderProperty = Bindings.createObjectBinding( + () -> Optional.ofNullable(providersById.get(config().getDownloadType())) + .orElse(providersById.get(DEFAULT_PROVIDER_ID)), + config().downloadTypeProperty()); + } + + public static DownloadProvider getDownloadProvider() { + return downloadProviderProperty.get(); + } + + public static ObservableObjectValue downloadProviderProperty() { + return downloadProviderProperty; } } 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 de989f716..a5b58e64e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java @@ -29,7 +29,7 @@ import org.jackhuang.hmcl.game.HMCLCacheRepository; import org.jackhuang.hmcl.game.HMCLGameRepository; import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.mod.ModManager; -import org.jackhuang.hmcl.ui.WeakListenerHelper; +import org.jackhuang.hmcl.ui.WeakListenerHolder; import org.jackhuang.hmcl.util.*; import java.io.File; @@ -43,7 +43,7 @@ import static org.jackhuang.hmcl.ui.FXUtils.onInvalidating; * @author huangyuhui */ public final class Profile implements Observable { - private final WeakListenerHelper helper = new WeakListenerHelper(); + private final WeakListenerHolder listenerHolder = new WeakListenerHolder(); private final HMCLGameRepository repository; private final ModManager modManager; @@ -136,7 +136,7 @@ public final class Profile implements Observable { gameDir.addListener((a, b, newValue) -> repository.changeDirectory(newValue)); this.selectedVersion.addListener(o -> checkSelectedVersion()); - helper.add(EventBus.EVENT_BUS.channel(RefreshedVersionsEvent.class).registerWeak(event -> checkSelectedVersion())); + listenerHolder.add(EventBus.EVENT_BUS.channel(RefreshedVersionsEvent.class).registerWeak(event -> checkSelectedVersion())); addPropertyChangedListener(onInvalidating(this::invalidate)); } @@ -162,7 +162,7 @@ public final class Profile implements Observable { } public DefaultDependencyManager getDependency() { - return new DefaultDependencyManager(repository, Settings.instance().getDownloadProvider(), HMCLCacheRepository.REPOSITORY); + return new DefaultDependencyManager(repository, DownloadProviders.getDownloadProvider(), HMCLCacheRepository.REPOSITORY); } public VersionSetting getVersionSetting(String id) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java index 723af4bb3..52a9e0d60 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java @@ -35,20 +35,7 @@ public final class ProxyManager { private ProxyManager() { } - private static ObjectBinding proxyProperty = Bindings.createObjectBinding( - () -> { - String host = config().getProxyHost(); - Integer port = Lang.toIntOrNull(config().getProxyPort()); - if (!config().hasProxy() || StringUtils.isBlank(host) || port == null || config().getProxyType() == Proxy.Type.DIRECT) { - return Proxy.NO_PROXY; - } else { - return new Proxy(config().getProxyType(), new InetSocketAddress(host, port)); - } - }, - config().proxyTypeProperty(), - config().proxyHostProperty(), - config().proxyPortProperty(), - config().hasProxyProperty()); + private static ObjectBinding proxyProperty; public static Proxy getProxy() { return proxyProperty.get(); @@ -59,12 +46,25 @@ public final class ProxyManager { } static void init() { - proxyProperty.addListener(observable -> updateSystemProxy()); + proxyProperty = Bindings.createObjectBinding( + () -> { + String host = config().getProxyHost(); + Integer port = Lang.toIntOrNull(config().getProxyPort()); + if (!config().hasProxy() || StringUtils.isBlank(host) || port == null || config().getProxyType() == Proxy.Type.DIRECT) { + return Proxy.NO_PROXY; + } else { + return new Proxy(config().getProxyType(), new InetSocketAddress(host, port)); + } + }, + config().proxyTypeProperty(), + config().proxyHostProperty(), + config().proxyPortProperty(), + config().hasProxyProperty()); + proxyProperty.addListener(any -> updateSystemProxy()); updateSystemProxy(); Authenticator.setDefault(new Authenticator() { - @Override protected PasswordAuthentication getPasswordAuthentication() { if (config().hasProxyAuth()) { 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 a262a8e38..4e68466db 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -19,7 +19,6 @@ package org.jackhuang.hmcl.setting; import javafx.scene.text.Font; import org.jackhuang.hmcl.Launcher; -import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.game.HMCLCacheRepository; import org.jackhuang.hmcl.util.CacheRepository; @@ -44,6 +43,7 @@ public class Settings { } private Settings() { + DownloadProviders.init(); ProxyManager.init(); Accounts.init(); Profiles.init(); @@ -61,14 +61,6 @@ public class Settings { config().setFontSize(font.getSize()); } - public int getLogLines() { - return Math.max(config().getLogLines(), 100); - } - - public void setLogLines(int logLines) { - config().setLogLines(logLines); - } - public static String getDefaultCommonDirectory() { return Launcher.MINECRAFT_DIRECTORY.getAbsolutePath(); } @@ -83,19 +75,4 @@ public class Settings { return null; } } - - /**************************************** - * DOWNLOAD PROVIDERS * - ****************************************/ - - public DownloadProvider getDownloadProvider() { - return DownloadProviders.getDownloadProvider(config().getDownloadType()); - } - - public void setDownloadProvider(DownloadProvider downloadProvider) { - int index = DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(downloadProvider); - if (index == -1) - throw new IllegalArgumentException("Unknown download provider: " + downloadProvider); - config().setDownloadType(index); - } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java index 8f9b09806..887e75a35 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -328,8 +328,10 @@ public final class FXUtils { * @param comboBox the combo box being bound with {@code property}. * @param property the property being bound with {@code combo box}. * @see #unbindEnum(JFXComboBox) + * @deprecated Use {@link SelectionModelSelectedItemProperty#selectedItemPropertyFor(ComboBox)} */ @SuppressWarnings("unchecked") + @Deprecated public static void bindEnum(JFXComboBox comboBox, Property property) { unbindEnum(comboBox); ChangeListener listener = (a, b, newValue) -> @@ -346,6 +348,7 @@ public final class FXUtils { * @see #bindEnum(JFXComboBox, Property) */ @SuppressWarnings("unchecked") + @Deprecated public static void unbindEnum(JFXComboBox comboBox) { ChangeListener listener = tryCast(comboBox.getProperties().get("FXUtils.bindEnum.listener"), ChangeListener.class).orElse(null); if (listener == null) return; 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 2662fc632..437a336b9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -181,7 +181,7 @@ public final class LogWindow extends Stage { if (newValue == Worker.State.SUCCEEDED) { document = engine.getDocument(); body = document.getElementsByTagName("body").item(0); - engine.executeScript("limitedLogs=" + Settings.instance().getLogLines()); + engine.executeScript("limitedLogs=" + config().getLogLines()); latch.countDown(); onDone.fireEvent(new Event(LogWindow.this)); } @@ -189,14 +189,14 @@ public final class LogWindow extends Stage { boolean flag = false; for (String i : cboLines.getItems()) - if (Integer.toString(Settings.instance().getLogLines()).equals(i)) { + if (Integer.toString(config().getLogLines()).equals(i)) { cboLines.getSelectionModel().select(i); flag = true; } cboLines.getSelectionModel().selectedItemProperty().addListener((a, b, newValue) -> { - Settings.instance().setLogLines(newValue == null ? 100 : Integer.parseInt(newValue)); - engine.executeScript("limitedLogs=" + Settings.instance().getLogLines()); + config().setLogLines(newValue == null ? 100 : Integer.parseInt(newValue)); + engine.executeScript("limitedLogs=" + config().getLogLines()); }); if (!flag) 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 d60c0ff7c..ffa339cf5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -25,9 +25,6 @@ import javafx.beans.WeakInvalidationListener; import javafx.beans.binding.Bindings; import javafx.beans.binding.When; import javafx.beans.property.*; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.scene.control.Label; import javafx.scene.control.ToggleGroup; import javafx.scene.paint.Color; import javafx.scene.text.Font; @@ -48,6 +45,7 @@ import java.util.Objects; import java.util.Optional; import static org.jackhuang.hmcl.setting.ConfigHolder.config; +import static org.jackhuang.hmcl.util.SelectionModelSelectedItemProperty.selectedItemPropertyFor; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class SettingsPage extends SettingsView implements DecoratorPage { @@ -60,10 +58,12 @@ public final class SettingsPage extends SettingsView implements DecoratorPage { public SettingsPage() { FXUtils.smoothScrolling(scroll); - chkEnableGameList.selectedProperty().bindBidirectional(config().enableMainPageGameListProperty()); + // ==== Download sources ==== + cboDownloadSource.getItems().setAll(DownloadProviders.providersById.keySet()); + selectedItemPropertyFor(cboDownloadSource).bindBidirectional(config().downloadTypeProperty()); + // ==== - cboDownloadSource.getSelectionModel().select(DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(Settings.instance().getDownloadProvider())); - cboDownloadSource.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> Settings.instance().setDownloadProvider(DownloadProviders.getDownloadProvider(newValue.intValue()))); + chkEnableGameList.selectedProperty().bindBidirectional(config().enableMainPageGameListProperty()); cboFont.initValue(Settings.instance().getFont()); cboFont.valueProperty().addListener((a, b, newValue) -> { @@ -84,13 +84,10 @@ public final class SettingsPage extends SettingsView implements DecoratorPage { lblDisplay.setStyle("-fx-font: " + Settings.instance().getFont().getSize() + " \"" + Settings.instance().getFont().getFamily() + "\";"); - ObservableList