diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java index 7b2822f32..a4a0c0b37 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java @@ -36,6 +36,7 @@ import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.util.StringUtils; import java.util.Collection; +import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -61,7 +62,7 @@ public class MultiFileItem extends VBox { }); selectedData.addListener((a, b, newValue) -> { Optional selecting = group.getToggles().stream() - .filter(it -> it.getUserData() == newValue) + .filter(it -> Objects.equals(it.getUserData(), newValue)) .findFirst(); if (!selecting.isPresent()) { selecting = group.getToggles().stream() diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java index 76d416148..35353a80d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java @@ -45,6 +45,7 @@ import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.Pair; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.javafx.BindingMapping; import org.jackhuang.hmcl.util.javafx.SafeStringConverter; @@ -66,6 +67,7 @@ import java.util.stream.Collectors; import static org.jackhuang.hmcl.ui.FXUtils.newImage; import static org.jackhuang.hmcl.ui.FXUtils.stringConverter; +import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class VersionSettingsPage extends StackPane implements DecoratorPage, VersionPage.VersionLoadable, PageAware { @@ -99,9 +101,9 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag private final OptionToggleButton useNativeGLFWPane; private final OptionToggleButton useNativeOpenALPane; private final ComponentSublist javaSublist; - private final MultiFileItem javaItem; - private final MultiFileItem.Option javaAutoDeterminedOption; - private final MultiFileItem.FileOption javaCustomOption; + private final MultiFileItem> javaItem; + private final MultiFileItem.Option> javaAutoDeterminedOption; + private final MultiFileItem.FileOption> javaCustomOption; private final ComponentSublist gameDirSublist; private final MultiFileItem gameDirItem; private final MultiFileItem.FileOption gameDirCustomOption; @@ -116,7 +118,6 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag private final InvalidationListener javaListener = any -> initJavaSubtitle(); - private boolean uiVisible = false; private final StringProperty selectedVersion = new SimpleStringProperty(); private final BooleanProperty navigateToSpecificSettings = new SimpleBooleanProperty(false); private final BooleanProperty enableSpecificSettings = new SimpleBooleanProperty(true); @@ -201,8 +202,8 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag javaSublist.getContent().add(javaItem); javaSublist.setTitle(i18n("settings.game.java_directory")); javaSublist.setHasSubtitle(true); - javaAutoDeterminedOption = new MultiFileItem.Option<>(i18n("settings.game.java_directory.auto"), null); - javaCustomOption = new MultiFileItem.FileOption(i18n("settings.custom"), null) + javaAutoDeterminedOption = new MultiFileItem.Option<>(i18n("settings.game.java_directory.auto"), pair(JavaVersionType.AUTO, null)); + javaCustomOption = new MultiFileItem.FileOption>(i18n("settings.custom"), pair(JavaVersionType.CUSTOM, null)) .setChooserTitle(i18n("settings.game.java_directory.choose")); gameDirItem = new MultiFileItem<>(); @@ -212,8 +213,8 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag gameDirSublist.setHasSubtitle(true); gameDirItem.disableProperty().bind(modpack); gameDirCustomOption = new MultiFileItem.FileOption<>(i18n("settings.custom"), GameDirectoryType.CUSTOM) - .setChooserTitle(i18n("settings.game.working_directory.choose")) - .setDirectory(true); + .setChooserTitle(i18n("settings.game.working_directory.choose")) + .setDirectory(true); gameDirItem.loadChildren(Arrays.asList( new MultiFileItem.Option<>(i18n("settings.advanced.game_dir.default"), GameDirectoryType.ROOT_FOLDER), @@ -547,12 +548,13 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag Task.supplyAsync(JavaVersion::getJavas).thenAcceptAsync(Schedulers.javafx(), list -> { boolean isX86 = Architecture.SYSTEM_ARCH.isX86() && list.stream().allMatch(java -> java.getArchitecture().isX86()); - List> options = list.stream() + List>> options = list.stream() .map(javaVersion -> new MultiFileItem.Option<>( - i18n("settings.game.java_directory.template", - javaVersion.getVersion(), - isX86 ? i18n("settings.game.java_directory.bit",javaVersion.getBits().getBit()) - : javaVersion.getPlatform().getArchitecture().getDisplayName()), javaVersion) + i18n("settings.game.java_directory.template", + javaVersion.getVersion(), + isX86 ? i18n("settings.game.java_directory.bit", javaVersion.getBits().getBit()) + : javaVersion.getPlatform().getArchitecture().getDisplayName()), + pair(JavaVersionType.DETECTED, javaVersion)) .setSubtitle(javaVersion.getBinary().toString())) .collect(Collectors.toList()); options.add(0, javaAutoDeterminedOption); @@ -563,7 +565,6 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag }).start(); javaItem.setSelectedData(null); - javaItem.setFallbackData(JavaVersion.fromCurrentEnvironment()); if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) javaCustomOption.getExtensionFilters().add(new FileChooser.ExtensionFilter("Java", "java.exe", "javaw.exe")); @@ -689,7 +690,8 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag } else if (javaAutoDeterminedOption.isSelected()) { versionSetting.setJavaAutoSelected(); } else { - versionSetting.setJavaVersion((JavaVersion) newValue.getUserData()); + //noinspection unchecked + versionSetting.setJavaVersion(((Pair) newValue.getUserData()).getValue()); } }); @@ -700,7 +702,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag gameDirItem.selectedDataProperty().bindBidirectional(versionSetting.gameDirTypeProperty()); gameDirSublist.subtitleProperty().bind(Bindings.createStringBinding(() -> Paths.get(profile.getRepository().getRunDirectory(versionId).getAbsolutePath()).normalize().toString(), versionSetting.gameDirProperty(), versionSetting.gameDirTypeProperty())); - + nativesDirItem.selectedDataProperty().bindBidirectional(versionSetting.nativesDirTypeProperty()); nativesDirSublist.subtitleProperty().bind(Bindings.createStringBinding(() -> Paths.get(profile.getRepository().getRunDirectory(versionId).getAbsolutePath() + "/natives").normalize().toString(), versionSetting.nativesDirProperty(), versionSetting.nativesDirTypeProperty())); @@ -726,7 +728,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag // javaLoading.set(true); lastVersionSetting.getJavaVersion(null, null) .thenAcceptAsync(Schedulers.javafx(), javaVersion -> { - javaItem.setSelectedData(javaVersion); + javaItem.setSelectedData(pair(JavaVersionType.DETECTED, javaVersion)); // javaLoading.set(false); }).start(); } @@ -756,7 +758,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag profile.getRepository().getVersion(versionId)); } }).thenAcceptAsync(Schedulers.javafx(), javaVersion -> javaSublist.setSubtitle(Optional.ofNullable(javaVersion) - .map(JavaVersion::getBinary).map(Path::toString).orElse("Invalid Java Path"))) + .map(JavaVersion::getBinary).map(Path::toString).orElse(i18n("settings.game.java_directory.invalid")))) .start(); } @@ -813,4 +815,10 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag public ReadOnlyObjectProperty stateProperty() { return state.getReadOnlyProperty(); } + + private enum JavaVersionType { + DETECTED, + CUSTOM, + AUTO, + } } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 30ee4735b..32325c858 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -850,6 +850,7 @@ settings.game.java_directory=Java Directory settings.game.java_directory.auto=Automatically selected settings.game.java_directory.bit=%s-Bit settings.game.java_directory.choose=Choose Java Directory. +settings.game.java_directory.invalid=Invalid Java Path settings.game.java_directory.template=%s (%s) settings.game.management=Manage settings.game.working_directory=Working Directory diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index eaefadc01..fa92a635e 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -849,6 +849,7 @@ settings.game.java_directory=Java 路徑 settings.game.java_directory.auto=自動選擇合適的 Java settings.game.java_directory.bit=%s 位 settings.game.java_directory.choose=選擇 Java 路徑 +settings.game.java_directory.invalid=Java 路徑不正確 settings.game.java_directory.template=%s(%s) settings.game.management=管理 settings.game.working_directory=執行路徑(版本隔離,修改後請自行移動相關遊戲檔案,如存檔模組設定等) diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 31c7a5e4d..b2c40baf4 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -849,6 +849,7 @@ settings.game.java_directory=Java 路径 settings.game.java_directory.auto=自动选择合适的 Java settings.game.java_directory.bit=%s 位 settings.game.java_directory.choose=选择 Java 路径 +settings.game.java_directory.invalid=Java 路径不正确 settings.game.java_directory.template=%s(%s) settings.game.management=管理 settings.game.working_directory=版本隔离(修改后请自行移动相关游戏文件,如存档模组配置等)