fix: sort not work in modrinth. Closes #1274.
This commit is contained in:
@@ -62,6 +62,7 @@ import org.jackhuang.hmcl.util.javafx.BindingMapping;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -152,7 +153,7 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP
|
|||||||
this.loading.set(loading);
|
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;
|
retrySearch = null;
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
setFailed(false);
|
setFailed(false);
|
||||||
@@ -311,17 +312,11 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP
|
|||||||
}).start();
|
}).start();
|
||||||
|
|
||||||
StackPane sortStackPane = new StackPane();
|
StackPane sortStackPane = new StackPane();
|
||||||
JFXComboBox<String> sortComboBox = new JFXComboBox<>();
|
JFXComboBox<RemoteModRepository.SortType> sortComboBox = new JFXComboBox<>();
|
||||||
sortStackPane.getChildren().setAll(sortComboBox);
|
sortStackPane.getChildren().setAll(sortComboBox);
|
||||||
sortComboBox.prefWidthProperty().bind(sortStackPane.widthProperty());
|
sortComboBox.prefWidthProperty().bind(sortStackPane.widthProperty());
|
||||||
sortComboBox.getStyleClass().add("fit-width");
|
sortComboBox.getStyleClass().add("fit-width");
|
||||||
sortComboBox.getItems().setAll(
|
sortComboBox.setConverter(stringConverter(sortType -> i18n("curse.sort." + sortType.name().toLowerCase(Locale.ROOT))));
|
||||||
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.getSelectionModel().select(0);
|
sortComboBox.getSelectionModel().select(0);
|
||||||
searchPane.addRow(rowIndex++, new Label(i18n("mods.category")), categoryStackPane, new Label(i18n("search.sort")), sortStackPane);
|
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),
|
.orElse(null),
|
||||||
0,
|
0,
|
||||||
nameField.getText(),
|
nameField.getText(),
|
||||||
sortComboBox.getSelectionModel().getSelectedIndex());
|
sortComboBox.getSelectionModel().getSelectedItem());
|
||||||
searchButton.setOnAction(searchAction);
|
searchButton.setOnAction(searchAction);
|
||||||
nameField.setOnAction(searchAction);
|
nameField.setOnAction(searchAction);
|
||||||
gameVersionField.setOnAction(searchAction);
|
gameVersionField.setOnAction(searchAction);
|
||||||
|
|||||||
@@ -25,7 +25,16 @@ import java.util.stream.Stream;
|
|||||||
|
|
||||||
public interface RemoteModRepository {
|
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;
|
throws IOException;
|
||||||
|
|
||||||
Optional<RemoteMod.Version> getRemoteVersionByLocalFile(LocalModFile localModFile, Path file) throws IOException;
|
Optional<RemoteMod.Version> getRemoteVersionByLocalFile(LocalModFile localModFile, Path file) throws IOException;
|
||||||
|
|||||||
@@ -63,10 +63,10 @@ public final class CurseForgeRemoteModRepository implements RemoteModRepository
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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;
|
int categoryId = 0;
|
||||||
if (category != null) categoryId = ((Category) category.getSelf()).getId();
|
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);
|
.map(CurseAddon::toMod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,11 +52,29 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository {
|
|||||||
private ModrinthRemoteModRepository() {
|
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(
|
Map<String, String> query = mapOf(
|
||||||
pair("query", searchFilter),
|
pair("query", searchFilter),
|
||||||
pair("offset", Integer.toString(pageOffset)),
|
pair("offset", Integer.toString(pageOffset)),
|
||||||
pair("limit", Integer.toString(pageSize))
|
pair("limit", Integer.toString(pageSize)),
|
||||||
|
pair("index", convertSortType(sort))
|
||||||
);
|
);
|
||||||
if (StringUtils.isNotBlank(gameVersion)) {
|
if (StringUtils.isNotBlank(gameVersion)) {
|
||||||
query.put("version", "versions=" + gameVersion);
|
query.put("version", "versions=" + gameVersion);
|
||||||
@@ -68,8 +86,8 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<RemoteMod> search(String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, int sort) throws IOException {
|
public Stream<RemoteMod> search(String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, SortType sort) throws IOException {
|
||||||
return searchPaginated(gameVersion, pageOffset, pageSize, searchFilter).stream()
|
return searchPaginated(gameVersion, pageOffset, pageSize, searchFilter, sort).stream()
|
||||||
.map(ModResult::toMod);
|
.map(ModResult::toMod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user