Merge 71960e0a9f961bb39e99addc604aa8c5b70c2c29 into 3eddfa23b70f8bd6d64ea5cf576fccbe5a0f35c2

This commit is contained in:
Burning_TNT 2025-07-31 22:55:21 +08:00 committed by GitHub
commit 77cbc67463
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 38 additions and 5 deletions

View File

@ -240,7 +240,7 @@ public final class MultiFileItem<T> extends VBox {
} }
} }
public static final class FileOption<T> extends Option<T> { public static class FileOption<T> extends Option<T> {
private final FileSelector selector = new FileSelector(); private final FileSelector selector = new FileSelector();
public FileOption(String title, T data) { public FileOption(String title, T data) {

View File

@ -23,12 +23,15 @@ import javafx.beans.InvalidationListener;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.property.*; import javafx.beans.property.*;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.collections.ObservableList;
import javafx.geometry.HPos; import javafx.geometry.HPos;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane; import javafx.scene.control.ScrollPane;
import javafx.scene.control.Toggle; import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.*; import javafx.scene.layout.*;
import javafx.scene.text.Text; import javafx.scene.text.Text;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
@ -258,13 +261,38 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
gameDirItem = new MultiFileItem<>(); gameDirItem = new MultiFileItem<>();
gameDirSublist = new ComponentSublist(); gameDirSublist = new ComponentSublist();
{
HintPane gameDirHint = new HintPane(MessageDialogPane.MessageType.INFO);
gameDirHint.setText(i18n("settings.game.working_directory.should_use_game_repo_feature"));
gameDirSublist.getContent().add(gameDirHint);
}
gameDirSublist.getContent().add(gameDirItem); gameDirSublist.getContent().add(gameDirItem);
gameDirSublist.setTitle(i18n("settings.game.working_directory")); gameDirSublist.setTitle(i18n("settings.game.working_directory"));
gameDirSublist.setHasSubtitle(versionId != null); gameDirSublist.setHasSubtitle(versionId != null);
gameDirItem.disableProperty().bind(modpack); gameDirItem.disableProperty().bind(modpack);
gameDirCustomOption = new MultiFileItem.FileOption<>(i18n("settings.custom"), GameDirectoryType.CUSTOM) gameDirCustomOption = new MultiFileItem.FileOption<GameDirectoryType>(i18n("settings.custom"), GameDirectoryType.CUSTOM) {
.setChooserTitle(i18n("settings.game.working_directory.choose")) private final WeakListenerHolder holder = new WeakListenerHolder();
.setDirectory(true);
@Override
protected Node createItem(ToggleGroup group) {
Node node = super.createItem(group);
ObservableList<Node> children = gameDirItem.getChildren();
holder.add(FXUtils.observeWeak(() -> {
boolean exist = children.contains(node);
if (!"".equals(getValue()) || gameDirItem.getSelectedData() == GameDirectoryType.CUSTOM) {
if (!exist) {
children.add(node);
}
} else {
if (exist) {
children.remove(node);
}
}
}, valueProperty(), gameDirItem.selectedDataProperty()));
return node;
}
}.setChooserTitle(i18n("settings.game.working_directory.choose")).setDirectory(true);
gameDirItem.loadChildren(Arrays.asList( gameDirItem.loadChildren(Arrays.asList(
new MultiFileItem.Option<>(i18n("settings.advanced.game_dir.default"), GameDirectoryType.ROOT_FOLDER), new MultiFileItem.Option<>(i18n("settings.advanced.game_dir.default"), GameDirectoryType.ROOT_FOLDER),
@ -537,6 +565,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
this.listenerHolder = new WeakListenerHolder(); this.listenerHolder = new WeakListenerHolder();
if (versionId == null) { if (versionId == null) {
gameDirSublist.setHasSubtitle(false);
enableSpecificSettings.set(true); enableSpecificSettings.set(true);
state.set(State.fromTitle(Profiles.getProfileDisplayName(profile) + " - " + i18n("settings.type.global.manage"))); state.set(State.fromTitle(Profiles.getProfileDisplayName(profile) + " - " + i18n("settings.type.global.manage")));
@ -552,6 +581,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
} }
})); }));
} else { } else {
gameDirSublist.setHasSubtitle(true);
navigateToSpecificSettings.unbind(); navigateToSpecificSettings.unbind();
navigateToSpecificSettings.set(false); navigateToSpecificSettings.set(false);
} }

View File

@ -1306,6 +1306,7 @@ settings.game.working_directory.choose=Choose the working directory
settings.game.working_directory.hint=Enable the "Isolated" option in "Working Directory" to allow the current instance to store its settings, saves, and mods in a separate directory.\n\ settings.game.working_directory.hint=Enable the "Isolated" option in "Working Directory" to allow the current instance to store its settings, saves, and mods in a separate directory.\n\
\n\ \n\
It is recommended to enable this option to avoid mod conflicts, but you will need to move your saves manually. It is recommended to enable this option to avoid mod conflicts, but you will need to move your saves manually.
settings.game.working_directory.should_use_game_repo_feature=Willing to change the game storage path? Go to HMCL Homepage - Version List, and click [Add game repository].
settings.icon=Icon settings.icon=Icon

View File

@ -950,7 +950,7 @@ world.name=世界名稱
world.name.enter=輸入世界名稱 world.name.enter=輸入世界名稱
world.show_all=全部顯示 world.show_all=全部顯示
profile=遊戲目錄 profile=遊戲倉庫
profile.already_exists=該名稱已存在 profile.already_exists=該名稱已存在
profile.default=目前目錄 profile.default=目前目錄
profile.home=官方啟動器目錄 profile.home=官方啟動器目錄
@ -1103,6 +1103,7 @@ settings.game.management=管理
settings.game.working_directory=執行路徑 (建議使用模組時選取「各實例獨立」。修改後請自行移動相關遊戲檔案,如存檔、模組設定等) settings.game.working_directory=執行路徑 (建議使用模組時選取「各實例獨立」。修改後請自行移動相關遊戲檔案,如存檔、模組設定等)
settings.game.working_directory.choose=選取執行目錄 settings.game.working_directory.choose=選取執行目錄
settings.game.working_directory.hint=在「執行路徑」選項中選取「各實例獨立」使目前實例獨立存放設定、存檔、模組等資料。使用模組時建議開啟此選項以避免不同版本模組衝突。修改此選項後需自行移動存檔等檔案。 settings.game.working_directory.hint=在「執行路徑」選項中選取「各實例獨立」使目前實例獨立存放設定、存檔、模組等資料。使用模組時建議開啟此選項以避免不同版本模組衝突。修改此選項後需自行移動存檔等檔案。
settings.game.working_directory.should_use_game_repo_feature=想要更改遊戲的儲存路徑?進入 HMCL 首頁 - 版本列表,點選【添加游戏仓库】
settings.icon=遊戲圖示 settings.icon=遊戲圖示

View File

@ -1113,6 +1113,7 @@ settings.game.management=管理
settings.game.working_directory=版本隔离 (建议使用模组时选择“各版本独立”。改后需移动存档、模组等相关游戏文件) settings.game.working_directory=版本隔离 (建议使用模组时选择“各版本独立”。改后需移动存档、模组等相关游戏文件)
settings.game.working_directory.choose=选择运行文件夹 settings.game.working_directory.choose=选择运行文件夹
settings.game.working_directory.hint=在“版本隔离”中选择“各版本独立”使当前版本独立存放设置、存档、模组等数据。使用模组时建议启用此选项以避免不同版本模组冲突。修改此选项后需自行移动存档等文件。 settings.game.working_directory.hint=在“版本隔离”中选择“各版本独立”使当前版本独立存放设置、存档、模组等数据。使用模组时建议启用此选项以避免不同版本模组冲突。修改此选项后需自行移动存档等文件。
settings.game.working_directory.should_use_game_repo_feature=想要更改游戏的存储路径?进入 HMCL 主页 - 版本列表,点击【添加游戏仓库】
settings.icon=游戏图标 settings.icon=游戏图标