fix: sort not work in modrinth. Closes #1274.

This commit is contained in:
huanghongxun
2022-01-02 00:41:21 +08:00
parent 42a667c0ef
commit 56538623a5
4 changed files with 39 additions and 17 deletions

View File

@@ -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<String> sortComboBox = new JFXComboBox<>();
JFXComboBox<RemoteModRepository.SortType> 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);

View File

@@ -25,7 +25,16 @@ import java.util.stream.Stream;
public interface RemoteModRepository {
Stream<RemoteMod> 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<RemoteMod> search(String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, SortType sort)
throws IOException;
Optional<RemoteMod.Version> getRemoteVersionByLocalFile(LocalModFile localModFile, Path file) throws IOException;

View File

@@ -63,10 +63,10 @@ public final class CurseForgeRemoteModRepository implements RemoteModRepository
}
@Override
public Stream<RemoteMod> search(String gameVersion, RemoteModRepository.Category category, int pageOffset, int pageSize, String searchFilter, int sort) throws IOException {
public Stream<RemoteMod> 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);
}

View File

@@ -52,11 +52,29 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository {
private ModrinthRemoteModRepository() {
}
public List<ModResult> 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<ModResult> searchPaginated(String gameVersion, int pageOffset, int pageSize, String searchFilter, SortType sort) throws IOException {
Map<String, String> 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<RemoteMod> search(String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, int sort) throws IOException {
return searchPaginated(gameVersion, pageOffset, pageSize, searchFilter).stream()
public Stream<RemoteMod> 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);
}