From 6c42a582b3ac05da14d79cddad0385e5eaf1bdca Mon Sep 17 00:00:00 2001 From: ToobLac Date: Fri, 7 Aug 2026 11:23:24 +0800 Subject: [PATCH] update --- .../org/jackhuang/hmcl/ui/Controllers.java | 6 ++-- .../java/org/jackhuang/hmcl/ui/FXUtils.java | 2 +- .../java/org/jackhuang/hmcl/ui/WebPage.java | 2 +- .../hmcl/ui/instances/AddonUpdatesPage.java | 2 +- .../hmcl/ui/instances/DownloadPage.java | 2 +- .../HMCLLocalizedDownloadListPage.java | 16 --------- .../hmcl/ui/instances/ModListPageSkin.java | 35 +++++-------------- .../ui/instances/ResourcePackListPage.java | 12 +------ 8 files changed, 16 insertions(+), 61 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index a7937cc967a..ebee0ade961 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -562,12 +562,12 @@ public static void onHyperlinkAction(String href) { } } - public static void openUriInBrowser(@Nullable URI uri) { + public static void openUriOrCopy(@Nullable URI uri) { if (uri == null) return; - openUriInBrowser(uri.toString()); + openUriOrCopy(uri.toString()); } - public static void openUriInBrowser(@Nullable String uri) { + public static void openUriOrCopy(@Nullable String uri) { if (uri == null) return; var dialog = new MessageDialogPane.Builder( i18n("web.open_in_browser", uri), diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java index 6d5b1eeb45e..3a25cfff651 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -1718,7 +1718,7 @@ public static void useJFXContextMenu(TextInputControl control) { } public static TextFlow renderAddonChangelog(String changelogHtml, String baseUri) { - var textFlow = new HTMLRenderer(Controllers::openUriInBrowser).appendNode(Jsoup.parse(changelogHtml, baseUri)).mergeLineBreaks().render(); + var textFlow = new HTMLRenderer(Controllers::openUriOrCopy).appendNode(Jsoup.parse(changelogHtml, baseUri)).mergeLineBreaks().render(); textFlow.getStyleClass().add("addon-changelog"); return textFlow; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebPage.java index 92880c460e4..cd7a8055ada 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebPage.java @@ -47,7 +47,7 @@ public WebPage(String title, String content) { Task.supplyAsync(() -> { Document document = Jsoup.parseBodyFragment(content); - HTMLRenderer renderer = new HTMLRenderer(Controllers::openUriInBrowser); + HTMLRenderer renderer = new HTMLRenderer(Controllers::openUriOrCopy); renderer.appendNode(document); renderer.mergeLineBreaks(); return renderer.render(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/AddonUpdatesPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/AddonUpdatesPage.java index 1b21d70e638..b48622eb98c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/AddonUpdatesPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/AddonUpdatesPage.java @@ -372,7 +372,7 @@ private void loadVersionPageUrl(AddonUpdateObject object, JFXHyperlink button) { return repo == null ? null : repo.getVersionPageUrl(object.data.targetVersion()); }).whenComplete(Schedulers.javafx(), (result, exception) -> { if (exception == null && StringUtils.isNotBlank(result)) { - button.setOnAction(__ -> Controllers.openUriInBrowser(result)); + button.setExternalLink(result); button.setDisable(false); } else { LOG.warning("Failed to load addon version page url", exception); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadPage.java index 5b86e08a86f..29e10fd0868 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadPage.java @@ -647,7 +647,7 @@ private void loadVersionPageUrl(RemoteAddon.Version version, RemoteAddonReposito Task.supplyAsync(() -> repo.getVersionPageUrl(version)) .whenComplete(Schedulers.javafx(), (result, exception) -> { if (exception == null && StringUtils.isNotBlank(result)) { - button.setOnAction(__ -> Controllers.openUriInBrowser(result)); + button.setExternalLink(result); button.setDisable(false); } else { LOG.warning("Failed to load addon version page url", exception); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/HMCLLocalizedDownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/HMCLLocalizedDownloadListPage.java index b2e8dbd76c7..9f20343f10d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/HMCLLocalizedDownloadListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/HMCLLocalizedDownloadListPage.java @@ -35,14 +35,6 @@ public static DownloadListPage ofMod(DownloadPage.DownloadCallback callback, boo return new HMCLLocalizedDownloadListPage(callback, instanceSelection, RemoteAddon.Type.MOD, CurseForgeRemoteAddonRepository.MODS, ModrinthRemoteAddonRepository.MODS); } - public static DownloadListPage ofCurseForgeMod(DownloadPage.DownloadCallback callback, boolean instanceSelection) { - return new HMCLLocalizedDownloadListPage(callback, instanceSelection, RemoteAddon.Type.MOD, CurseForgeRemoteAddonRepository.MODS, null); - } - - public static DownloadListPage ofModrinthMod(DownloadPage.DownloadCallback callback, boolean instanceSelection) { - return new HMCLLocalizedDownloadListPage(callback, instanceSelection, RemoteAddon.Type.MOD, null, ModrinthRemoteAddonRepository.MODS); - } - public static DownloadListPage ofModPack(DownloadPage.DownloadCallback callback, boolean instanceSelection) { return new HMCLLocalizedDownloadListPage(callback, instanceSelection, RemoteAddon.Type.MODPACK, CurseForgeRemoteAddonRepository.MODPACKS, ModrinthRemoteAddonRepository.MODPACKS); } @@ -51,14 +43,6 @@ public static DownloadListPage ofResourcePack(DownloadPage.DownloadCallback call return new HMCLLocalizedDownloadListPage(callback, instanceSelection, RemoteAddon.Type.RESOURCE_PACK, CurseForgeRemoteAddonRepository.RESOURCE_PACKS, ModrinthRemoteAddonRepository.RESOURCE_PACKS); } - public static DownloadListPage ofCurseForgeResourcePack(DownloadPage.DownloadCallback callback, boolean instanceSelection) { - return new HMCLLocalizedDownloadListPage(callback, instanceSelection, RemoteAddon.Type.RESOURCE_PACK, CurseForgeRemoteAddonRepository.RESOURCE_PACKS, null); - } - - public static DownloadListPage ofModrinthResourcePack(DownloadPage.DownloadCallback callback, boolean instanceSelection) { - return new HMCLLocalizedDownloadListPage(callback, instanceSelection, RemoteAddon.Type.RESOURCE_PACK, null, ModrinthRemoteAddonRepository.RESOURCE_PACKS); - } - public static DownloadListPage ofShaderPack(DownloadPage.DownloadCallback callback, boolean instanceSelection) { var page = new HMCLLocalizedDownloadListPage(callback, instanceSelection, RemoteAddon.Type.SHADER_PACK, CurseForgeRemoteAddonRepository.SHADERS, ModrinthRemoteAddonRepository.SHADER_PACKS); page.supportChinese.set(false); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/ModListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/ModListPageSkin.java index 154705397d1..f7011588191 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/ModListPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/ModListPageSkin.java @@ -44,7 +44,6 @@ import org.jackhuang.hmcl.addon.mod.ModLoaderType; import org.jackhuang.hmcl.addon.repository.CurseForgeRemoteAddonRepository; import org.jackhuang.hmcl.addon.repository.ModrinthRemoteAddonRepository; -import org.jackhuang.hmcl.game.HMCLGameRepository; import org.jackhuang.hmcl.setting.DownloadProviders; import org.jackhuang.hmcl.setting.GameInstanceIconType; import org.jackhuang.hmcl.task.Schedulers; @@ -481,15 +480,7 @@ final class ModInfoDialog extends JFXDialogLayout { } } - button.setOnAction(e -> { - fireEvent(new DialogCloseEvent()); - Controllers.navigate(new DownloadPage( - repository instanceof CurseForgeRemoteAddonRepository ? HMCLLocalizedDownloadListPage.ofCurseForgeMod(null, false) : HMCLLocalizedDownloadListPage.ofModrinthMod(null, false), - remoteAddon, - new HMCLGameRepository.InstanceReference(ModListPageSkin.this.getSkinnable().getRepository(), ModListPageSkin.this.getSkinnable().getInstanceId()), - org.jackhuang.hmcl.ui.download.DownloadPage.FOR_MOD - )); - }); + button.setExternalLink(remoteAddon.pageUrl()); button.setDisable(false); }); } @@ -501,31 +492,21 @@ final class ModInfoDialog extends JFXDialogLayout { if (StringUtils.isNotBlank(modInfo.getModInfo().getUrl())) { JFXHyperlink officialPageButton = new JFXHyperlink(i18n("mods.url")); - officialPageButton.setOnAction(e -> { - fireEvent(new DialogCloseEvent()); - FXUtils.openLink(modInfo.getModInfo().getUrl()); - }); - + officialPageButton.setExternalLink(modInfo.getModInfo().getUrl()); getActions().add(officialPageButton); } if (modInfo.getModTranslations() == null || StringUtils.isBlank(modInfo.getModTranslations().getMcmod())) { JFXHyperlink searchButton = new JFXHyperlink(i18n("mods.mcmod.search")); - searchButton.setOnAction(e -> { - fireEvent(new DialogCloseEvent()); - FXUtils.openLink(NetworkUtils.withQuery("https://search.mcmod.cn/s", mapOf( - pair("key", modInfo.getModInfo().getName()), - pair("site", "all"), - pair("filter", "0") - ))); - }); + searchButton.setExternalLink(NetworkUtils.withQuery("https://search.mcmod.cn/s", mapOf( + pair("key", modInfo.getModInfo().getName()), + pair("site", "all"), + pair("filter", "0") + ))); getActions().add(searchButton); } else { JFXHyperlink mcmodButton = new JFXHyperlink(i18n("mods.mcmod.page")); - mcmodButton.setOnAction(e -> { - fireEvent(new DialogCloseEvent()); - FXUtils.openLink(ModTranslations.MOD.getMcmodUrl(modInfo.getModTranslations())); - }); + mcmodButton.setExternalLink(ModTranslations.MOD.getMcmodUrl(modInfo.getModTranslations())); getActions().add(mcmodButton); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/ResourcePackListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/ResourcePackListPage.java index f98fa0fc46e..b5456958962 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/ResourcePackListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/ResourcePackListPage.java @@ -638,17 +638,7 @@ private static final class ResourcePackInfoDialog extends JFXDialogLayout { if (versionOptional.isPresent()) { RemoteAddon remoteAddon = repository.getAddonById(DownloadProviders.getDownloadProvider(), versionOptional.get().projectId()); FXUtils.runInFX(() -> { - button.setOnAction(e -> { - fireEvent(new DialogCloseEvent()); - Controllers.navigate(new DownloadPage( - repository instanceof CurseForgeRemoteAddonRepository - ? HMCLLocalizedDownloadListPage.ofCurseForgeResourcePack(null, false) - : HMCLLocalizedDownloadListPage.ofModrinthResourcePack(null, false), - remoteAddon, - new HMCLGameRepository.InstanceReference(page.repository, page.instanceId), - org.jackhuang.hmcl.ui.download.DownloadPage.FOR_RESOURCE_PACK - )); - }); + button.setExternalLink(remoteAddon.pageUrl()); button.setDisable(false); }); }