From 6223ceedffec896fc086be27eac2289ca6cdce80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=AB=E4=B9=90=E5=87=A4=E7=88=AA=E7=8E=8B?= <165921128+KSSJW@users.noreply.github.com> Date: Tue, 30 Jun 2026 20:51:14 +0800 Subject: [PATCH] Feat: Add name validation for preset creation and renaming (#6258) --- .../hmcl/ui/game/PresetManagementPane.java | 24 ++++++++++++++++++- .../resources/assets/lang/I18N.properties | 1 + .../resources/assets/lang/I18N_zh.properties | 1 + .../assets/lang/I18N_zh_CN.properties | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/PresetManagementPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/PresetManagementPane.java index 54f0a3b1ba..fefcffabfd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/PresetManagementPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/PresetManagementPane.java @@ -180,6 +180,13 @@ final class PresetManagementPane extends ComponentSublist { setDescription(setting != null ? getPresetDisplayName(setting) : ""); } + // Used to check the preset name. + private boolean isPresetNameExists(String name, @Nullable GameSettings.Preset excludeSetting) { + return SettingsManager.getGameSettings().stream() + .filter(setting -> excludeSetting == null || setting != excludeSetting) + .anyMatch(setting -> Objects.equals(name, getPresetDisplayName(setting))); + } + /// Creates a new preset and selects it for editing. private void createPreset() { int number = createDefaultPresetNumber(); @@ -188,6 +195,15 @@ final class PresetManagementPane extends ComponentSublist { .setPromptText(i18n("settings.type.global.preset.auto_name", number)); Controllers.prompt(new PromptDialogPane.Builder(i18n("settings.type.global.preset.create"), (questions, handler) -> { String name = (String) questions.get(0).getValue(); + + if (StringUtils.isNotBlank(name)) { + String trimmedName = name.trim(); + if (isPresetNameExists(trimmedName, null)) { + handler.reject(i18n("settings.type.global.preset.duplicate_name")); + return; + } + } + GameSettings.Preset setting = new GameSettings.Preset(SettingsManager.gameSettingsPresets().newPresetId()); if (StringUtils.isBlank(name)) { setting.autoNameNumberProperty().setValue(number); @@ -233,7 +249,13 @@ final class PresetManagementPane extends ComponentSublist { return; } - setting.nameProperty().setValue(LocalizedText.plain(name.trim())); + String trimmedName = name.trim(); + if (isPresetNameExists(trimmedName, setting)) { + handler.reject(i18n("settings.type.global.preset.duplicate_name")); + return; + } + + setting.nameProperty().setValue(LocalizedText.plain(trimmedName)); setting.autoNameNumberProperty().setValue(null); handler.resolve(); }).addQuestion(nameQuestion)); diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 059ce2252a..26cd9a47e7 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1630,6 +1630,7 @@ settings.type.global.manage=Global Settings settings.type.global.preset=Preset settings.type.global.preset.create=Create Preset settings.type.global.preset.default=Use Default Preset +settings.type.global.preset.duplicate_name=Preset name already exists settings.type.global.preset.manage_all=Default Preset settings.type.global.preset.name=Preset Name settings.type.global.preset.rename=Rename Preset diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index d1bee5973f..56f6f492bb 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1421,6 +1421,7 @@ settings.type.global.manage=全域遊戲設定 settings.type.global.preset=預設 settings.type.global.preset.create=新增預設 settings.type.global.preset.default=使用預設項目 +settings.type.global.preset.duplicate_name=預設名稱已存在 settings.type.global.preset.manage_all=預設項目 settings.type.global.preset.name=預設名稱 settings.type.global.preset.rename=重新命名預設 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 bfc427da68..6c7cd849bb 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1426,6 +1426,7 @@ settings.type.global.manage=全局游戏设置 settings.type.global.preset=预设 settings.type.global.preset.create=新建预设 settings.type.global.preset.default=使用默认预设 +settings.type.global.preset.duplicate_name=预设名称已存在 settings.type.global.preset.manage_all=默认预设 settings.type.global.preset.name=预设名称 settings.type.global.preset.rename=重命名预设