From 5c9deb129da4f7dbf6e72fb045bcc028d262cc2f Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sun, 12 Sep 2021 23:38:47 +0800 Subject: [PATCH] feat(download): add import local modpack file button in modpack download page. --- .../jackhuang/hmcl/ui/construct/MDListCell.java | 12 +++++++++++- .../jackhuang/hmcl/ui/download/DownloadPage.java | 13 ++++++++++++- .../org/jackhuang/hmcl/ui/main/FeedbackPage.java | 2 +- .../hmcl/ui/versions/DownloadListPage.java | 14 +++++++++++++- .../hmcl/ui/versions/ModListPageSkin.java | 6 ++++-- .../jackhuang/hmcl/mod/curse/CurseModManager.java | 2 +- .../org/jackhuang/hmcl/mod/modrinth/Modrinth.java | 2 +- 7 files changed, 43 insertions(+), 8 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java index 18c262c2e..1534f5a8b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MDListCell.java @@ -17,8 +17,10 @@ */ package org.jackhuang.hmcl.ui.construct; +import com.jfoenix.controls.JFXListView; import javafx.css.PseudoClass; import javafx.scene.control.ListCell; +import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import org.jackhuang.hmcl.ui.FXUtils; @@ -28,13 +30,21 @@ public abstract class MDListCell extends ListCell { private final StackPane container = new StackPane(); private final StackPane root = new StackPane(); - public MDListCell() { + public MDListCell(JFXListView listView) { setText(null); setGraphic(null); root.getStyleClass().add("md-list-cell"); RipplerContainer ripplerContainer = new RipplerContainer(container); root.getChildren().setAll(ripplerContainer); + + Region clippedContainer = (Region) listView.lookup(".clipped-container"); + setPrefWidth(0); + if (clippedContainer != null) { + maxWidthProperty().bind(clippedContainer.widthProperty()); + prefWidthProperty().bind(clippedContainer.widthProperty()); + minWidthProperty().bind(clippedContainer.widthProperty()); + } } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java index a6a610cee..9a4ebbbcd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.ui.download; +import com.jfoenix.controls.JFXButton; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.scene.Node; @@ -79,7 +80,17 @@ public class DownloadPage extends BorderPane implements DecoratorPage { public DownloadPage() { newGameTab.setNodeSupplier(() -> new VersionsPage(versionPageNavigator, i18n("install.installer.choose", i18n("install.installer.game")), "", DownloadProviders.getDownloadProvider(), "game", versionPageNavigator::onGameSelected)); - modpackTab.setNodeSupplier(() -> new DownloadListPage(CurseModManager.SECTION_MODPACK, Versions::downloadModpackImpl)); + modpackTab.setNodeSupplier(() -> { + DownloadListPage page = new DownloadListPage(CurseModManager.SECTION_MODPACK, Versions::downloadModpackImpl); + + JFXButton installLocalModpackButton = new JFXButton(i18n("install.modpack")); + installLocalModpackButton.setButtonType(JFXButton.ButtonType.RAISED); + installLocalModpackButton.getStyleClass().add("jfx-button-raised"); + installLocalModpackButton.setOnAction(e -> Versions.importModpack()); + + page.getActions().add(installLocalModpackButton); + return page; + }); modTab.setNodeSupplier(() -> new ModDownloadListPage(CurseModManager.SECTION_MOD, (profile, version, file) -> download(profile, version, file, "mods"), true)); resourcePackTab.setNodeSupplier(() -> new DownloadListPage(CurseModManager.SECTION_RESOURCE_PACK, (profile, version, file) -> download(profile, version, file, "resourcepacks"))); // customizationTab.setNodeSupplier(() -> new ModDownloadListPage(CurseModManager.SECTION_CUSTOMIZATION, this::download)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/FeedbackPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/FeedbackPage.java index fe8c5ab6a..88e62dd56 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/FeedbackPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/FeedbackPage.java @@ -101,7 +101,7 @@ public class FeedbackPage extends VBox { JFXListView listView = new JFXListView<>(); spinnerPane.setContent(listView); Bindings.bindContent(listView.getItems(), feedbacks); - listView.setCellFactory(x -> new MDListCell() { + listView.setCellFactory(x -> new MDListCell(listView) { private final TwoLineListItem content = new TwoLineListItem(); private final JFXButton likeButton = new JFXButton(); private final JFXButton unlikeButton = new JFXButton(); 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 bdd342422..9ca6e9a44 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 @@ -30,6 +30,7 @@ import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; +import javafx.scene.Node; import javafx.scene.control.Control; import javafx.scene.control.Label; import javafx.scene.control.Skin; @@ -53,6 +54,7 @@ import org.jackhuang.hmcl.ui.construct.FloatListCell; import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.construct.TwoLineListItem; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; +import org.jackhuang.hmcl.util.AggregatedObservableList; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.i18n.I18n; import org.jackhuang.hmcl.util.javafx.BindingMapping; @@ -79,6 +81,7 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP private final DownloadPage.DownloadCallback callback; private boolean searchInitialized = false; protected final BooleanProperty supportChinese = new SimpleBooleanProperty(); + private final ObservableList actions = FXCollections.observableArrayList(); protected final ListProperty downloadSources = new SimpleListProperty<>(this, "downloadSources", FXCollections.observableArrayList()); protected final StringProperty downloadSource = new SimpleStringProperty(); private final WeakListenerHolder listenerHolder = new WeakListenerHolder(); @@ -104,6 +107,10 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP this.versionSelection = versionSelection; } + public ObservableList getActions() { + return actions; + } + @Override public void loadVersion(Profile profile, String version) { this.version.set(new Profile.ProfileVersion(profile, version)); @@ -213,6 +220,7 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP } private static class ModDownloadListPageSkin extends SkinBase { + private final AggregatedObservableList actions = new AggregatedObservableList<>(); protected ModDownloadListPageSkin(DownloadListPage control) { super(control); @@ -315,7 +323,11 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP searchButton.setText(i18n("search")); searchButton.getStyleClass().add("jfx-button-raised"); searchButton.setButtonType(JFXButton.ButtonType.RAISED); - HBox searchBox = new HBox(searchButton); + ObservableList last = FXCollections.observableArrayList(searchButton); + HBox searchBox = new HBox(8); + actions.appendList(control.actions); + actions.appendList(last); + Bindings.bindContent(searchBox.getChildren(), actions.getAggregatedList()); GridPane.setColumnSpan(searchBox, 4); searchBox.setAlignment(Pos.CENTER_RIGHT); searchPane.addRow(rowIndex++, searchBox); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java index 7c240abc0..7a7623f55 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java @@ -102,7 +102,7 @@ class ModListPageSkin extends SkinBase { center.getStyleClass().add("large-spinner-pane"); center.loadingProperty().bind(skinnable.loadingProperty()); - listView.setCellFactory(x -> new ModInfoListCell()); + listView.setCellFactory(x -> new ModInfoListCell(listView)); listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); Bindings.bindContent(listView.getItems(), skinnable.getItems()); @@ -263,7 +263,9 @@ class ModListPageSkin extends SkinBase { JFXButton revealButton = new JFXButton(); BooleanProperty booleanProperty; - ModInfoListCell() { + ModInfoListCell(JFXListView listView) { + super(listView); + HBox container = new HBox(8); container.setPickOnBounds(false); container.setAlignment(Pos.CENTER_LEFT); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseModManager.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseModManager.java index 3aa4de14e..3158a37e0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseModManager.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseModManager.java @@ -38,7 +38,7 @@ public final class CurseModManager { pair("gameId", "432"), pair("gameVersion", gameVersion), pair("index", Integer.toString(pageOffset)), - pair("pageSize", "25"), + pair("pageSize", "50"), pair("searchFilter", searchFilter), pair("sectionId", Integer.toString(section)), pair("sort", Integer.toString(sort)) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/Modrinth.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/Modrinth.java index eb47f5447..a445894b0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/Modrinth.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/Modrinth.java @@ -41,7 +41,7 @@ public final class Modrinth { Map query = mapOf( pair("query", searchFilter), pair("offset", Integer.toString(pageOffset)), - pair("limit", "25") + pair("limit", "50") ); if (StringUtils.isNotBlank(gameVersion)) { query.put("version", "versions=" + gameVersion);