From c33ef5170b2cc726f01674fe6fca28035b1eef8b Mon Sep 17 00:00:00 2001 From: Burning_TNT Date: Wed, 9 Apr 2025 11:35:56 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20#3644:=20=E4=BF=AE=E5=A4=8D=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=20-=20=E6=A8=A1=E7=BB=84=E7=95=8C=E9=9D=A2=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=AD=A3=E5=B8=B8=E7=BF=BB=E9=A1=B5=E3=80=81Category?= =?UTF-8?q?=20=E4=BC=9A=E5=9C=A8=E5=88=87=E6=8D=A2=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=BA=90=E6=97=B6=E5=87=BA=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#3768)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/ui/versions/DownloadListPage.java | 35 ++++++++++++------- .../HMCLLocalizedDownloadListPage.java | 2 +- .../curse/CurseForgeRemoteModRepository.java | 4 ++- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java index 53a972c74..f353da485 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java @@ -60,10 +60,7 @@ import org.jackhuang.hmcl.util.i18n.I18n; import org.jackhuang.hmcl.util.javafx.BindingMapping; import org.jackhuang.hmcl.util.versioning.GameVersionNumber; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import static org.jackhuang.hmcl.ui.FXUtils.ignoreEvent; @@ -156,7 +153,7 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP FXUtils.runInFX(() -> selectedVersion.set(versionID)); } - public void search(String userGameVersion, RemoteModRepository.Category category, int pageOffset, String searchFilter, RemoteModRepository.SortType sort) { + private void search(String userGameVersion, RemoteModRepository.Category category, int pageOffset, String searchFilter, RemoteModRepository.SortType sort) { retrySearch = null; setLoading(true); setFailed(false); @@ -171,7 +168,9 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP ? version.getProfile().getRepository().getGameVersion(version.getVersion()).orElse("") : ""; } - }).thenApplyAsync(gameVersion -> repository.search(gameVersion, category, pageOffset, 50, searchFilter, sort, RemoteModRepository.SortOrder.DESC)).whenComplete(Schedulers.javafx(), (result, exception) -> { + }).thenApplyAsync( + gameVersion -> repository.search(gameVersion, category, pageOffset, 50, searchFilter, sort, RemoteModRepository.SortOrder.DESC) + ).whenComplete(Schedulers.javafx(), (result, exception) -> { if (searchID != currentSearchID) { return; } @@ -312,7 +311,7 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP StackPane categoryStackPane = new StackPane(); JFXComboBox categoryComboBox = new JFXComboBox<>(); - categoryComboBox.getItems().setAll(new CategoryIndented(0, null)); + categoryComboBox.getItems().setAll(CategoryIndented.ALL); categoryStackPane.getChildren().setAll(categoryComboBox); categoryComboBox.prefWidthProperty().bind(categoryStackPane.widthProperty()); categoryComboBox.getStyleClass().add("fit-width"); @@ -320,14 +319,22 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP categoryComboBox.getSelectionModel().select(0); categoryComboBox.setConverter(stringConverter(getSkinnable()::getLocalizedCategoryIndent)); FXUtils.onChangeAndOperate(getSkinnable().downloadSource, downloadSource -> { + categoryComboBox.getItems().setAll(CategoryIndented.ALL); + categoryComboBox.getSelectionModel().select(0); + Task.supplyAsync(() -> getSkinnable().repository.getCategories()) .thenAcceptAsync(Schedulers.javafx(), categories -> { + if (!Objects.equals(getSkinnable().downloadSource.get(), downloadSource)) { + return; + } + List result = new ArrayList<>(); - result.add(new CategoryIndented(0, null)); + result.add(CategoryIndented.ALL); for (RemoteModRepository.Category category : Lang.toIterable(categories)) { resolveCategory(category, 0, result); } categoryComboBox.getItems().setAll(result); + categoryComboBox.getSelectionModel().select(0); }).start(); }); @@ -344,7 +351,7 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP IntegerProperty filterID = new SimpleIntegerProperty(this, "Filter ID", 0); IntegerProperty currentFilterID = new SimpleIntegerProperty(this, "Current Filter ID", -1); EventHandler searchAction = e -> { - if (currentFilterID.get() != filterID.get()) { + if (currentFilterID.get() != -1 && currentFilterID.get() != filterID.get()) { control.pageOffset.set(0); } currentFilterID.set(filterID.get()); @@ -379,8 +386,8 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP JFXButton firstPageButton = FXUtils.newBorderButton(i18n("search.first_page")); firstPageButton.setOnAction(event -> { control.pageOffset.set(0); - changeButton.value.run(); searchAction.handle(event); + changeButton.value.run(); }); JFXButton previousPageButton = FXUtils.newBorderButton(i18n("search.previous_page")); @@ -388,8 +395,8 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP int pageOffset = control.pageOffset.get(); if (pageOffset > 0) { control.pageOffset.set(pageOffset - 1); - changeButton.value.run(); searchAction.handle(event); + changeButton.value.run(); } }); @@ -404,16 +411,16 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP int nv = control.pageOffset.get() + 1; if (nv < control.pageCount.get()) { control.pageOffset.set(nv); - changeButton.value.run(); searchAction.handle(event); + changeButton.value.run(); } }); JFXButton lastPageButton = FXUtils.newBorderButton(i18n("search.last_page")); lastPageButton.setOnAction(event -> { control.pageOffset.set(control.pageCount.get() - 1); - changeButton.value.run(); searchAction.handle(event); + changeButton.value.run(); }); firstPageButton.setDisable(true); @@ -529,6 +536,8 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP } private static class CategoryIndented { + private static final CategoryIndented ALL = new CategoryIndented(0, null); + private final int indent; private final RemoteModRepository.Category category; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/HMCLLocalizedDownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/HMCLLocalizedDownloadListPage.java index e00db972b..ab92b07e0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/HMCLLocalizedDownloadListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/HMCLLocalizedDownloadListPage.java @@ -110,7 +110,7 @@ public final class HMCLLocalizedDownloadListPage extends DownloadListPage { try { return I18n.getResourceBundle().getString(key); } catch (MissingResourceException e) { - LOG.warning("Cannot find key " + key + " in resource bundle", e); + LOG.warning("Cannot find key " + key + " in resource bundle"); return category; } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java index 3913ef7f0..087f8a0c1 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java @@ -102,7 +102,9 @@ public final class CurseForgeRemoteModRepository implements RemoteModRepository @Override public SearchResult search(String gameVersion, @Nullable RemoteModRepository.Category category, int pageOffset, int pageSize, String searchFilter, SortType sortType, SortOrder sortOrder) throws IOException { int categoryId = 0; - if (category != null) categoryId = ((CurseAddon.Category) category.getSelf()).getId(); + if (category != null && category.getSelf() instanceof CurseAddon.Category) { + categoryId = ((CurseAddon.Category) category.getSelf()).getId(); + } Response> response = HttpRequest.GET(PREFIX + "/v1/mods/search", pair("gameId", "432"), pair("classId", Integer.toString(section)),