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 408559039..12ae6c9f5 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 @@ -62,6 +62,7 @@ import org.jackhuang.hmcl.util.javafx.BindingMapping; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.stream.Collectors; @@ -152,7 +153,7 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP this.loading.set(loading); } - public void search(String userGameVersion, RemoteModRepository.Category category, int pageOffset, String searchFilter, int sort) { + public void search(String userGameVersion, RemoteModRepository.Category category, int pageOffset, String searchFilter, RemoteModRepository.SortType sort) { retrySearch = null; setLoading(true); setFailed(false); @@ -311,17 +312,11 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP }).start(); StackPane sortStackPane = new StackPane(); - JFXComboBox sortComboBox = new JFXComboBox<>(); + JFXComboBox sortComboBox = new JFXComboBox<>(); sortStackPane.getChildren().setAll(sortComboBox); sortComboBox.prefWidthProperty().bind(sortStackPane.widthProperty()); sortComboBox.getStyleClass().add("fit-width"); - sortComboBox.getItems().setAll( - i18n("curse.sort.date_created"), - i18n("curse.sort.popularity"), - i18n("curse.sort.last_updated"), - i18n("curse.sort.name"), - i18n("curse.sort.author"), - i18n("curse.sort.total_downloads")); + sortComboBox.setConverter(stringConverter(sortType -> i18n("curse.sort." + sortType.name().toLowerCase(Locale.ROOT)))); sortComboBox.getSelectionModel().select(0); searchPane.addRow(rowIndex++, new Label(i18n("mods.category")), categoryStackPane, new Label(i18n("search.sort")), sortStackPane); @@ -345,7 +340,7 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP .orElse(null), 0, nameField.getText(), - sortComboBox.getSelectionModel().getSelectedIndex()); + sortComboBox.getSelectionModel().getSelectedItem()); searchButton.setOnAction(searchAction); nameField.setOnAction(searchAction); gameVersionField.setOnAction(searchAction); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteModRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteModRepository.java index fcac406e5..f491d4f6b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteModRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteModRepository.java @@ -25,7 +25,16 @@ import java.util.stream.Stream; public interface RemoteModRepository { - Stream search(String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, int sort) + enum SortType { + DATE_CREATED, + POPULARITY, + LAST_UPDATED, + NAME, + AUTHOR, + TOTAL_DOWNLOADS + } + + Stream search(String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, SortType sort) throws IOException; Optional getRemoteVersionByLocalFile(LocalModFile localModFile, Path file) throws IOException; 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 b5f7ff4da..f8e162573 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 @@ -63,10 +63,10 @@ public final class CurseForgeRemoteModRepository implements RemoteModRepository } @Override - public Stream search(String gameVersion, RemoteModRepository.Category category, int pageOffset, int pageSize, String searchFilter, int sort) throws IOException { + public Stream search(String gameVersion, RemoteModRepository.Category category, int pageOffset, int pageSize, String searchFilter, SortType sort) throws IOException { int categoryId = 0; if (category != null) categoryId = ((Category) category.getSelf()).getId(); - return searchPaginated(gameVersion, categoryId, pageOffset, pageSize, searchFilter, sort).stream() + return searchPaginated(gameVersion, categoryId, pageOffset, pageSize, searchFilter, sort.ordinal()).stream() .map(CurseAddon::toMod); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java index b301ea5e9..2fcb0f529 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java @@ -52,11 +52,29 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { private ModrinthRemoteModRepository() { } - public List searchPaginated(String gameVersion, int pageOffset, int pageSize, String searchFilter) throws IOException { + private static String convertSortType(SortType sortType) { + switch (sortType) { + case DATE_CREATED: + return "newest"; + case POPULARITY: + case NAME: + case AUTHOR: + return "relevance"; + case LAST_UPDATED: + return "updated"; + case TOTAL_DOWNLOADS: + return "downloads"; + default: + throw new IllegalArgumentException("Unsupported sort type " + sortType); + } + } + + public List searchPaginated(String gameVersion, int pageOffset, int pageSize, String searchFilter, SortType sort) throws IOException { Map query = mapOf( pair("query", searchFilter), pair("offset", Integer.toString(pageOffset)), - pair("limit", Integer.toString(pageSize)) + pair("limit", Integer.toString(pageSize)), + pair("index", convertSortType(sort)) ); if (StringUtils.isNotBlank(gameVersion)) { query.put("version", "versions=" + gameVersion); @@ -68,8 +86,8 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { } @Override - public Stream search(String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, int sort) throws IOException { - return searchPaginated(gameVersion, pageOffset, pageSize, searchFilter).stream() + public Stream search(String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, SortType sort) throws IOException { + return searchPaginated(gameVersion, pageOffset, pageSize, searchFilter, sort).stream() .map(ModResult::toMod); }