From c00677a0ad4fbbe58cc24037291bd06b0c98268b Mon Sep 17 00:00:00 2001 From: CiiLu <109708109+CiiLu@users.noreply.github.com> Date: Wed, 12 Aug 2026 12:37:38 +0800 Subject: [PATCH 1/4] =?UTF-8?q?(55)=20=E5=8D=83=E8=BD=BD=E6=B3=A8=E8=BF=B0?= =?UTF-8?q?=E4=B8=80=E8=89=98=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/ui/download/DownloadPage.java | 10 +++------- .../org/jackhuang/hmcl/ui/instances/Instances.java | 10 ++-------- .../main/java/org/jackhuang/hmcl/ui/main/MainPage.java | 4 +--- .../java/org/jackhuang/hmcl/upgrade/UpdateHandler.java | 4 +--- 4 files changed, 7 insertions(+), 21 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java index e961c901bfd..5fde19f4267 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java @@ -44,8 +44,8 @@ import org.jackhuang.hmcl.ui.decorator.DecoratorAnimatedPage; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; import org.jackhuang.hmcl.ui.instances.DownloadListPage; -import org.jackhuang.hmcl.ui.instances.HMCLLocalizedDownloadListPage; import org.jackhuang.hmcl.ui.instances.GameInstancePage; +import org.jackhuang.hmcl.ui.instances.HMCLLocalizedDownloadListPage; import org.jackhuang.hmcl.ui.instances.Instances; import org.jackhuang.hmcl.ui.wizard.Navigation; import org.jackhuang.hmcl.ui.wizard.WizardController; @@ -170,12 +170,8 @@ public static void download(DownloadProvider downloadProvider, HMCLGameRepositor task.setName(file.name()); return task; }).whenComplete(Schedulers.javafx(), exception -> { - if (exception != null) { - if (exception instanceof CancellationException) { - Controllers.showToast(i18n("message.cancelled")); - } else { - Controllers.dialog(DownloadProviders.localizeErrorMessage(exception), i18n("install.failed.downloading"), MessageDialogPane.MessageType.ERROR); - } + if (exception != null && !(exception instanceof CancellationException)) { + Controllers.dialog(DownloadProviders.localizeErrorMessage(exception), i18n("install.failed.downloading"), MessageDialogPane.MessageType.ERROR); } else { Controllers.showToast(i18n("install.success")); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/Instances.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/Instances.java index 4d62e3263b3..4a21f09d365 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/Instances.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/Instances.java @@ -28,11 +28,7 @@ import org.jackhuang.hmcl.download.game.GameAssetDownloadTask; import org.jackhuang.hmcl.download.game.GameDownloadTask; import org.jackhuang.hmcl.download.game.GameLibrariesTask; -import org.jackhuang.hmcl.game.GameInstanceID; -import org.jackhuang.hmcl.game.GameInstanceManifest; -import org.jackhuang.hmcl.game.HMCLGameRepository; -import org.jackhuang.hmcl.game.LauncherHelper; -import org.jackhuang.hmcl.game.QuickPlayOption; +import org.jackhuang.hmcl.game.*; import org.jackhuang.hmcl.setting.*; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Schedulers; @@ -106,9 +102,7 @@ public static void downloadModpackImpl(DownloadProvider downloadProvider, HMCLGa if (StringUtils.isNotBlank(mod.iconUrl())) installWizardProvider.setIconUrl(mod.iconUrl()); Controllers.getDecorator().startWizard(installWizardProvider); - } else if (e instanceof CancellationException) { - Controllers.showToast(i18n("message.cancelled")); - } else { + } else if (!(e instanceof CancellationException)) { Controllers.dialog( i18n("install.failed.downloading.detail", file.file().url()) + "\n" + StringUtils.getStackTrace(e), i18n("download.failed.no_code"), MessageDialogPane.MessageType.ERROR); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java index 72cc6dea4bf..81577186c57 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java @@ -380,9 +380,7 @@ private void launchNoGame() { if (exception == null) { GameDirectoryManager.getSelectedRepository().setSelectedInstance(instanceHolder.value); launch(); - } else if (exception instanceof CancellationException) { - Controllers.showToast(i18n("message.cancelled")); - } else { + } else if (!(exception instanceof CancellationException)) { LOG.warning("Failed to install game", exception); Controllers.dialog(StringUtils.getStackTrace(exception), i18n("install.failed"), diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java index 4688264a03c..444da330c00 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java @@ -159,9 +159,7 @@ public static void updateFrom(RemoteVersion version) { } else { Exception e = executor.getException(); LOG.warning("Failed to update to " + version, e); - if (e instanceof CancellationException) { - Platform.runLater(() -> Controllers.showToast(i18n("message.cancelled"))); - } else { + if (!(e instanceof CancellationException)) { Platform.runLater(() -> Controllers.dialog(e.toString(), i18n("update.failed"), MessageType.ERROR)); } } From a101aebeea4e5a5688e7cdbe431840172875bca2 Mon Sep 17 00:00:00 2001 From: CiiLu <109708109+CiiLu@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:42:38 +0800 Subject: [PATCH 2/4] =?UTF-8?q?(64)=20=E5=A3=AE=E5=A3=AB=E5=8A=A8=20?= =?UTF-8?q?=E7=88=B7=E5=A8=98=E5=A6=BB=E5=84=BF=E7=AE=AA=E5=A3=B6=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/ui/instances/SchematicsPage.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java index b7e21447c37..afe8b20a5da 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java @@ -54,6 +54,7 @@ import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.*; +import java.util.stream.Collectors; import java.util.stream.Stream; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; @@ -161,14 +162,24 @@ public void onCreateDirectory() { return; Path parent = currentDirectory.path; + + Set existingFolders; + + try (var list = Files.list(parent)) { + existingFolders = list.map(Path::getFileName) + .map(Path::toString) + .collect(Collectors.toSet()); + } catch (IOException e) { + LOG.warning("Failed to list folders in " + parent, e); + existingFolders = Set.of(); + } + + Set finalExistingFolders = existingFolders; + Controllers.prompt( i18n("schematics.create_directory.prompt"), (result, handler) -> { Path targetDir = parent.resolve(result); - if (Files.exists(targetDir)) { - handler.reject(i18n("schematics.create_directory.failed.already_exists")); - return; - } try { Files.createDirectories(targetDir); @@ -178,7 +189,7 @@ public void onCreateDirectory() { LOG.warning("Failed to create directory: " + targetDir, e); handler.reject(i18n("schematics.create_directory.failed", targetDir)); } - }, "", new RequiredValidator(), new Validator(i18n("schematics.create_directory.failed.invalid_name"), FileUtils::isNameValid)); + }, "", new RequiredValidator(), new Validator(i18n("schematics.create_directory.failed.invalid_name"), FileUtils::isNameValid), new Validator(i18n("schematics.create_directory.failed.already_exists"), (it) -> !finalExistingFolders.contains(it))); } private DirItem loadAll(Path dir, @Nullable DirItem parent) { From ce789a1ad814fbdfb0936a965f0e633a38a93ed1 Mon Sep 17 00:00:00 2001 From: CiiLu <109708109+CiiLu@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:44:36 +0800 Subject: [PATCH 3/4] hyw --- .../org/jackhuang/hmcl/ui/download/DownloadPage.java | 10 +++++++--- .../org/jackhuang/hmcl/ui/instances/Instances.java | 10 ++++++++-- .../main/java/org/jackhuang/hmcl/ui/main/MainPage.java | 4 +++- .../java/org/jackhuang/hmcl/upgrade/UpdateHandler.java | 4 +++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java index 5fde19f4267..e961c901bfd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java @@ -44,8 +44,8 @@ import org.jackhuang.hmcl.ui.decorator.DecoratorAnimatedPage; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; import org.jackhuang.hmcl.ui.instances.DownloadListPage; -import org.jackhuang.hmcl.ui.instances.GameInstancePage; import org.jackhuang.hmcl.ui.instances.HMCLLocalizedDownloadListPage; +import org.jackhuang.hmcl.ui.instances.GameInstancePage; import org.jackhuang.hmcl.ui.instances.Instances; import org.jackhuang.hmcl.ui.wizard.Navigation; import org.jackhuang.hmcl.ui.wizard.WizardController; @@ -170,8 +170,12 @@ public static void download(DownloadProvider downloadProvider, HMCLGameRepositor task.setName(file.name()); return task; }).whenComplete(Schedulers.javafx(), exception -> { - if (exception != null && !(exception instanceof CancellationException)) { - Controllers.dialog(DownloadProviders.localizeErrorMessage(exception), i18n("install.failed.downloading"), MessageDialogPane.MessageType.ERROR); + if (exception != null) { + if (exception instanceof CancellationException) { + Controllers.showToast(i18n("message.cancelled")); + } else { + Controllers.dialog(DownloadProviders.localizeErrorMessage(exception), i18n("install.failed.downloading"), MessageDialogPane.MessageType.ERROR); + } } else { Controllers.showToast(i18n("install.success")); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/Instances.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/Instances.java index 4a21f09d365..4d62e3263b3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/Instances.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/Instances.java @@ -28,7 +28,11 @@ import org.jackhuang.hmcl.download.game.GameAssetDownloadTask; import org.jackhuang.hmcl.download.game.GameDownloadTask; import org.jackhuang.hmcl.download.game.GameLibrariesTask; -import org.jackhuang.hmcl.game.*; +import org.jackhuang.hmcl.game.GameInstanceID; +import org.jackhuang.hmcl.game.GameInstanceManifest; +import org.jackhuang.hmcl.game.HMCLGameRepository; +import org.jackhuang.hmcl.game.LauncherHelper; +import org.jackhuang.hmcl.game.QuickPlayOption; import org.jackhuang.hmcl.setting.*; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Schedulers; @@ -102,7 +106,9 @@ public static void downloadModpackImpl(DownloadProvider downloadProvider, HMCLGa if (StringUtils.isNotBlank(mod.iconUrl())) installWizardProvider.setIconUrl(mod.iconUrl()); Controllers.getDecorator().startWizard(installWizardProvider); - } else if (!(e instanceof CancellationException)) { + } else if (e instanceof CancellationException) { + Controllers.showToast(i18n("message.cancelled")); + } else { Controllers.dialog( i18n("install.failed.downloading.detail", file.file().url()) + "\n" + StringUtils.getStackTrace(e), i18n("download.failed.no_code"), MessageDialogPane.MessageType.ERROR); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java index 81577186c57..72cc6dea4bf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java @@ -380,7 +380,9 @@ private void launchNoGame() { if (exception == null) { GameDirectoryManager.getSelectedRepository().setSelectedInstance(instanceHolder.value); launch(); - } else if (!(exception instanceof CancellationException)) { + } else if (exception instanceof CancellationException) { + Controllers.showToast(i18n("message.cancelled")); + } else { LOG.warning("Failed to install game", exception); Controllers.dialog(StringUtils.getStackTrace(exception), i18n("install.failed"), diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java index 444da330c00..4688264a03c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java @@ -159,7 +159,9 @@ public static void updateFrom(RemoteVersion version) { } else { Exception e = executor.getException(); LOG.warning("Failed to update to " + version, e); - if (!(e instanceof CancellationException)) { + if (e instanceof CancellationException) { + Platform.runLater(() -> Controllers.showToast(i18n("message.cancelled"))); + } else { Platform.runLater(() -> Controllers.dialog(e.toString(), i18n("update.failed"), MessageType.ERROR)); } } From d2a070ea8eca39bc7c2801f27ca6a3406aa31cf8 Mon Sep 17 00:00:00 2001 From: CiiLu <109708109+CiiLu@users.noreply.github.com> Date: Wed, 12 Aug 2026 22:27:27 +0800 Subject: [PATCH 4/4] qwq --- .../java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java index afe8b20a5da..f1d4b666b87 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java @@ -181,6 +181,11 @@ public void onCreateDirectory() { (result, handler) -> { Path targetDir = parent.resolve(result); + if (Files.exists(targetDir)) { + handler.reject(i18n("schematics.create_directory.failed.already_exists")); + return; + } + try { Files.createDirectories(targetDir); handler.resolve();