diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ToolbarListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ToolbarListPageSkin.java index 1faf3572b..b96c99ade 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ToolbarListPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ToolbarListPageSkin.java @@ -18,24 +18,26 @@ package org.jackhuang.hmcl.ui; import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXListView; import javafx.beans.binding.Bindings; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; -import javafx.scene.control.ScrollPane; +import javafx.scene.control.ListCell; import javafx.scene.control.SkinBase; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.StackPane; -import javafx.scene.layout.VBox; import org.jackhuang.hmcl.ui.construct.ComponentList; import org.jackhuang.hmcl.ui.construct.SpinnerPane; import java.util.List; -public abstract class ToolbarListPageSkin> extends SkinBase { +public abstract class ToolbarListPageSkin> extends SkinBase

{ - public ToolbarListPageSkin(T skinnable) { + protected final JFXListView listView; + + public ToolbarListPageSkin(P skinnable) { super(skinnable); SpinnerPane spinnerPane = new SpinnerPane(); @@ -58,18 +60,12 @@ public abstract class ToolbarListPageSkin } { - ScrollPane scrollPane = new ScrollPane(); - ComponentList.setVgrow(scrollPane, Priority.ALWAYS); - scrollPane.setFitToWidth(true); - - VBox content = new VBox(); - - Bindings.bindContent(content.getChildren(), skinnable.itemsProperty()); - - scrollPane.setContent(content); - FXUtils.smoothScrolling(scrollPane); - - root.getContent().add(scrollPane); + this.listView = new JFXListView<>(); + this.listView.setPadding(Insets.EMPTY); + this.listView.setCellFactory(listView -> createListCell((JFXListView) listView)); + ComponentList.setVgrow(listView, Priority.ALWAYS); + Bindings.bindContent(this.listView.getItems(), skinnable.itemsProperty()); + root.getContent().add(listView); } spinnerPane.setContent(root); @@ -102,5 +98,21 @@ public abstract class ToolbarListPageSkin return ret; } - protected abstract List initializeToolbar(T skinnable); + protected abstract List initializeToolbar(P skinnable); + + protected ListCell createListCell(JFXListView listView) { + return new ListCell<>() { + @Override + protected void updateItem(E item, boolean empty) { + super.updateItem(item, empty); + if (!empty && item instanceof Node node) { + setGraphic(node); + setText(null); + } else { + setGraphic(null); + setText(null); + } + } + }; + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ToolbarListPageSkin2.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ToolbarListPageSkin2.java deleted file mode 100644 index c0cd486a5..000000000 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ToolbarListPageSkin2.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2020 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.ui; - -import com.jfoenix.controls.JFXListView; -import javafx.beans.binding.Bindings; -import javafx.geometry.Insets; -import javafx.geometry.Pos; -import javafx.scene.Node; -import javafx.scene.control.SkinBase; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Priority; -import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.ui.construct.ComponentList; -import org.jackhuang.hmcl.ui.construct.SpinnerPane; - -import java.util.List; - -// TODO: Replace ToolbarListPageSkin with this class gradually -public abstract class ToolbarListPageSkin2> extends SkinBase

{ - - protected final JFXListView listView; - - public ToolbarListPageSkin2(P skinnable) { - super(skinnable); - - SpinnerPane spinnerPane = new SpinnerPane(); - spinnerPane.loadingProperty().bind(skinnable.loadingProperty()); - spinnerPane.failedReasonProperty().bind(skinnable.failedReasonProperty()); - spinnerPane.onFailedActionProperty().bind(skinnable.onFailedActionProperty()); - spinnerPane.getStyleClass().add("large-spinner-pane"); - - ComponentList root = new ComponentList(); - root.getStyleClass().add("no-padding"); - StackPane.setMargin(root, new Insets(10)); - - List toolbarButtons = initializeToolbar(skinnable); - if (!toolbarButtons.isEmpty()) { - HBox toolbar = new HBox(); - toolbar.setAlignment(Pos.CENTER_LEFT); - toolbar.setPickOnBounds(false); - toolbar.getChildren().setAll(toolbarButtons); - root.getContent().add(toolbar); - } - - { - this.listView = new JFXListView<>(); - this.listView.setPadding(Insets.EMPTY); - ComponentList.setVgrow(listView, Priority.ALWAYS); - Bindings.bindContent(this.listView.getItems(), skinnable.itemsProperty()); - root.getContent().add(listView); - } - - spinnerPane.setContent(root); - - getChildren().setAll(spinnerPane); - } - - protected abstract List initializeToolbar(P skinnable); -} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java index 9dce27bed..a717021a8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java @@ -295,7 +295,7 @@ public final class JavaManagementPage extends ListPageBase { + private static final class JavaPageSkin extends ToolbarListPageSkin { JavaPageSkin(JavaManagementPage skinnable) { super(skinnable); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaRestorePage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaRestorePage.java index 14110f31d..1b3b4ebaa 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaRestorePage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaRestorePage.java @@ -192,7 +192,7 @@ public final class JavaRestorePage extends ListPageBase { + private static final class JavaRestorePageSkin extends ToolbarListPageSkin { JavaRestorePageSkin(JavaRestorePage skinnable) { super(skinnable); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListPage.java index 1d94e24a3..20829ca17 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListPage.java @@ -17,11 +17,13 @@ */ package org.jackhuang.hmcl.ui.versions; +import com.jfoenix.controls.JFXListView; import javafx.beans.binding.Bindings; import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Node; +import javafx.scene.control.ListCell; import javafx.scene.control.ScrollPane; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; @@ -154,17 +156,21 @@ public class GameListPage extends DecoratorAnimatedPage implements DecoratorPage return new GameListSkin(); } - private class GameListSkin extends ToolbarListPageSkin2 { + private class GameListSkin extends ToolbarListPageSkin { public GameListSkin() { super(GameList.this); - this.listView.setCellFactory(listView -> new GameListCell()); } @Override protected List initializeToolbar(GameList skinnable) { return Collections.emptyList(); } + + @Override + protected ListCell createListCell(JFXListView listView) { + return new GameListCell(); + } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java index 2f487ff1d..e1d14634d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java @@ -165,7 +165,7 @@ public class InstallerListPage extends ListPageBase implements Ve executor.start(); } - private class InstallerListPageSkin extends ToolbarListPageSkin { + private class InstallerListPageSkin extends ToolbarListPageSkin { InstallerListPageSkin() { super(InstallerListPage.this); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/SchematicsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/SchematicsPage.java index 5be8c8cdd..a96e47f7f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/SchematicsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/SchematicsPage.java @@ -599,7 +599,7 @@ public final class SchematicsPage extends ListPageBase impl } } - private final class SchematicsPageSkin extends ToolbarListPageSkin { + private final class SchematicsPageSkin extends ToolbarListPageSkin { SchematicsPageSkin() { super(SchematicsPage.this); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldBackupsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldBackupsPage.java index 00088d5bc..02901d068 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldBackupsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldBackupsPage.java @@ -155,7 +155,7 @@ public final class WorldBackupsPage extends ListPageBase { + private final class WorldBackupsPageSkin extends ToolbarListPageSkin { WorldBackupsPageSkin() { super(WorldBackupsPage.this); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java index bbfac6382..31cf0faa9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java @@ -21,6 +21,7 @@ import com.jfoenix.controls.JFXCheckBox; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.scene.Node; +import javafx.scene.control.Skin; import javafx.stage.FileChooser; import org.jackhuang.hmcl.game.World; import org.jackhuang.hmcl.setting.Profile; @@ -67,7 +68,7 @@ public final class WorldListPage extends ListPageBase implements } @Override - protected ToolbarListPageSkin createDefaultSkin() { + protected Skin createDefaultSkin() { return new WorldListPageSkin(); } @@ -161,7 +162,7 @@ public final class WorldListPage extends ListPageBase implements this.showAll.set(showAll); } - private final class WorldListPageSkin extends ToolbarListPageSkin { + private final class WorldListPageSkin extends ToolbarListPageSkin { WorldListPageSkin() { super(WorldListPage.this);