From 96f2d011cac527cc36ec53daaa21dd83d756d3c8 Mon Sep 17 00:00:00 2001 From: Glavo Date: Thu, 21 Aug 2025 16:45:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20TaskListPane=20=E7=9A=84?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=95=88=E6=9E=9C=20(#4306)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 3gf8jv4dv <3gf8jv4dv@gmail.com> --- .../jackhuang/hmcl/game/ModpackHelper.java | 14 ++++++------- .../hmcl/ui/construct/TaskListPane.java | 4 ++++ .../UpdateInstallerWizardProvider.java | 1 + .../hmcl/ui/export/ExportWizardProvider.java | 20 +++++++++++++++++++ .../resources/assets/lang/I18N.properties | 2 ++ .../resources/assets/lang/I18N_zh.properties | 2 ++ .../assets/lang/I18N_zh_CN.properties | 2 ++ .../hmcl/download/DefaultGameBuilder.java | 1 + .../hmcl/download/game/GameLibrariesTask.java | 11 +++++++++- 9 files changed, 49 insertions(+), 8 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java index 56ffd9ba2..491502744 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java @@ -50,10 +50,7 @@ import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.stream.Stream; import static org.jackhuang.hmcl.util.Lang.mapOf; @@ -210,14 +207,17 @@ public final class ModpackHelper { if (modpack.getManifest() instanceof MultiMCInstanceConfiguration) return modpack.getInstallTask(profile.getDependency(), zipFile, name) .whenComplete(Schedulers.defaultScheduler(), success, failure) - .thenComposeAsync(createMultiMCPostInstallTask(profile, (MultiMCInstanceConfiguration) modpack.getManifest(), name)); + .thenComposeAsync(createMultiMCPostInstallTask(profile, (MultiMCInstanceConfiguration) modpack.getManifest(), name)) + .withStagesHint(List.of("hmcl.modpack", "hmcl.modpack.download")); else if (modpack.getManifest() instanceof McbbsModpackManifest) return modpack.getInstallTask(profile.getDependency(), zipFile, name) .whenComplete(Schedulers.defaultScheduler(), success, failure) - .thenComposeAsync(createMcbbsPostInstallTask(profile, (McbbsModpackManifest) modpack.getManifest(), name)); + .thenComposeAsync(createMcbbsPostInstallTask(profile, (McbbsModpackManifest) modpack.getManifest(), name)) + .withStagesHint(List.of("hmcl.modpack", "hmcl.modpack.download")); else return modpack.getInstallTask(profile.getDependency(), zipFile, name) - .whenComplete(Schedulers.javafx(), success, failure); + .whenComplete(Schedulers.javafx(), success, failure) + .withStagesHint(List.of("hmcl.modpack", "hmcl.modpack.download")); } public static Task getUpdateTask(Profile profile, ServerModpackManifest manifest, Charset charset, String name, ModpackConfiguration configuration) throws UnsupportedModpackException { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java index 5087a287a..578069b37 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java @@ -97,6 +97,7 @@ public final class TaskListPane extends StackPane { public TaskListPane() { listView.setPadding(new Insets(12, 0, 0, 0)); listView.setCellFactory(l -> new Cell()); + listView.setSelectionModel(null); FXUtils.onChangeAndOperate(listView.widthProperty(), width -> { double w = width.doubleValue(); cellWidth.set(w <= 12.0 ? w : w - 12.0); @@ -160,6 +161,8 @@ public final class TaskListPane extends StackPane { if (task instanceof GameAssetDownloadTask) { task.setName(i18n("assets.download_all")); } else if (task instanceof GameInstallTask) { + if (task.getInheritedStage() != null && task.getInheritedStage().startsWith("hmcl.install.game")) + return; task.setName(i18n("install.installer.install", i18n("install.installer.game"))); } else if (task instanceof ForgeNewInstallTask || task instanceof ForgeOldInstallTask) { task.setName(i18n("install.installer.install", i18n("install.installer.forge"))); @@ -433,6 +436,7 @@ public final class TaskListPane extends StackPane { case "hmcl.modpack": message = i18n("install.modpack"); break; case "hmcl.modpack.download": message = i18n("launch.state.modpack"); break; case "hmcl.install.assets": message = i18n("assets.download"); break; + case "hmcl.install.libraries": message = i18n("libraries.download"); break; case "hmcl.install.game": message = i18n("install.installer.install", i18n("install.installer.game") + " " + stageValue); break; case "hmcl.install.forge": message = i18n("install.installer.install", i18n("install.installer.forge") + " " + stageValue); break; case "hmcl.install.neoforge": message = i18n("install.installer.install", i18n("install.installer.neoforge") + " " + stageValue); break; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/UpdateInstallerWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/UpdateInstallerWizardProvider.java index 1458d835f..4695673b1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/UpdateInstallerWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/UpdateInstallerWizardProvider.java @@ -85,6 +85,7 @@ public final class UpdateInstallerWizardProvider implements WizardProvider { ret = ret.thenComposeAsync(version -> dependencyManager.installLibraryAsync(version, remoteVersion)); stages.add(String.format("hmcl.install.%s:%s", remoteVersion.getLibraryId(), remoteVersion.getSelfVersion())); if ("game".equals(remoteVersion.getLibraryId())) { + stages.add("hmcl.install.libraries"); stages.add("hmcl.install.assets"); } } else if (value instanceof RemoveVersionAction) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java index 4e5b06e72..2e7648faf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java @@ -77,6 +77,10 @@ public final class ExportWizardProvider implements WizardProvider { File tempModpack; Task exportTask; + { + setSignificance(TaskSignificance.MODERATE); + } + @Override public boolean doPreExecute() { return true; @@ -165,6 +169,10 @@ public final class ExportWizardProvider implements WizardProvider { return new Task() { Task dependency = null; + { + setSignificance(TaskSignificance.MODERATE); + } + @Override public void execute() { dependency = new McbbsModpackExportTask(profile.getRepository(), version, exportInfo, modpackFile); @@ -181,6 +189,10 @@ public final class ExportWizardProvider implements WizardProvider { return new Task() { Task dependency; + { + setSignificance(TaskSignificance.MODERATE); + } + @Override public void execute() { VersionSetting vs = profile.getVersionSetting(version); @@ -225,6 +237,10 @@ public final class ExportWizardProvider implements WizardProvider { return new Task() { Task dependency; + { + setSignificance(TaskSignificance.MODERATE); + } + @Override public void execute() { dependency = new ServerModpackExportTask(profile.getRepository(), version, exportInfo, modpackFile); @@ -241,6 +257,10 @@ public final class ExportWizardProvider implements WizardProvider { return new Task() { Task dependency; + { + setSignificance(TaskSignificance.MODERATE); + } + @Override public void execute() { dependency = new ModrinthModpackExportTask( diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 49df8d743..6a3ea4d69 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -827,6 +827,8 @@ launcher.crash.java_internal_error=Hello Minecraft! Launcher has encountered a f launcher.crash.hmcl_out_dated=Hello Minecraft! Launcher has encountered a fatal error! Your launcher is outdated. Please update your launcher! launcher.update_java=Please update your Java version. +libraries.download=Downloading Libraries + login.empty_username=You have not set your username yet! login.enter_password=Please enter your password. diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index c64350d4d..16f3f1158 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -643,6 +643,8 @@ launcher.crash.java_internal_error=Hello Minecraft! Launcher 由於目前 Java launcher.crash.hmcl_out_dated=Hello Minecraft! Launcher 遇到了無法處理的錯誤。已偵測到你的啟動器不是最新版本,請更新後重試! launcher.update_java=請更新你的 Java +libraries.download=下載依賴庫 + login.empty_username=你還未設定使用者名稱! login.enter_password=請輸入你的密碼 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 86e8730c5..fe3f560ab 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -653,6 +653,8 @@ launcher.crash.java_internal_error=Hello Minecraft! Launcher 由于当前 Java launcher.crash.hmcl_out_dated=Hello Minecraft! Launcher 遇到了无法处理的错误。已检测到你的启动器不是最新版本,请更新后再试。 launcher.update_java=请更新你的 Java。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 +libraries.download=下载依赖库 + login.empty_username=你还未设置用户名! login.enter_password=请输入你的密码 diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultGameBuilder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultGameBuilder.java index 1f80d44b1..0827030d1 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultGameBuilder.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultGameBuilder.java @@ -48,6 +48,7 @@ public class DefaultGameBuilder extends GameBuilder { Task libraryTask = Task.supplyAsync(() -> new Version(name)); libraryTask = libraryTask.thenComposeAsync(libraryTaskHelper(gameVersion, "game", gameVersion)); stages.add("hmcl.install.game:" + gameVersion); + stages.add("hmcl.install.libraries"); stages.add("hmcl.install.assets"); for (Map.Entry entry : toolVersions.entrySet()) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java index f177e1348..f8ca81e78 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java @@ -75,6 +75,7 @@ public final class GameLibrariesTask extends Task { this.integrityCheck = integrityCheck; this.libraries = libraries; + setStage("hmcl.install.libraries"); setSignificance(TaskSignificance.MODERATE); } @@ -115,6 +116,7 @@ public final class GameLibrariesTask extends Task { @Override public void execute() throws IOException { + int progress = 0; GameRepository gameRepository = dependencyManager.getGameRepository(); for (Library library : libraries) { if (!library.appliesToCurrentEnvironment()) { @@ -135,10 +137,17 @@ public final class GameLibrariesTask extends Task { } } if (shouldDownloadLibrary(gameRepository, version, library, integrityCheck) && (library.hasDownloadURL() || !"optifine".equals(library.getGroupId()))) { - dependencies.add(new LibraryDownloadTask(dependencyManager, file, library)); + dependencies.add(new LibraryDownloadTask(dependencyManager, file, library).withCounter("hmcl.install.libraries")); } else { dependencyManager.getCacheRepository().tryCacheLibrary(library, file.toPath()); } + + updateProgress(++progress, libraries.size()); + } + + if (!dependencies.isEmpty()) { + getProperties().put("total", dependencies.size()); + notifyPropertiesChanged(); } }