diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java index 8e274c1a3..b6651b613 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java @@ -19,6 +19,7 @@ package org.jackhuang.hmcl.ui; import com.jfoenix.concurrency.JFXUtilities; import javafx.application.Platform; +import javafx.scene.image.Image; import javafx.scene.layout.Region; import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.RefreshedVersionsEvent; @@ -36,8 +37,8 @@ import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.account.AccountAdvancedListItem; import org.jackhuang.hmcl.ui.account.AddAccountPane; import org.jackhuang.hmcl.ui.construct.AdvancedListBox; +import org.jackhuang.hmcl.ui.construct.AdvancedListItem; import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; -import org.jackhuang.hmcl.ui.construct.IconedItem; import org.jackhuang.hmcl.ui.profile.ProfileAdvancedListItem; import org.jackhuang.hmcl.ui.versions.GameAdvancedListItem; import org.jackhuang.hmcl.ui.versions.Versions; @@ -61,14 +62,17 @@ public final class LeftPaneController extends AdvancedListBox { profileListItem.setOnAction(e -> Controllers.navigate(Controllers.getProfileListPage())); profileListItem.profileProperty().bind(Profiles.selectedProfileProperty()); - IconedItem gameItem = new IconedItem(FXUtils.limitingSize(SVG.gear(Theme.blackFillBinding(), 20, 20), 32, 20), "iconed-item"); - gameItem.getLabel().setText(i18n("version.manage")); - gameItem.setOnMouseClicked(e -> Controllers.navigate(Controllers.getGameListPage())); + AdvancedListItem gameItem = new AdvancedListItem(); + gameItem.setImage(new Image("/assets/img/bookshelf.png")); + gameItem.setRightGraphic(SVG.viewList(Theme.blackFillBinding(), -1, -1)); + gameItem.setTitle(i18n("version.manage")); + gameItem.setOnAction(e -> Controllers.navigate(Controllers.getGameListPage())); - IconedItem launcherSettingsItem = new IconedItem(FXUtils.limitingSize(SVG.gear(Theme.blackFillBinding(), 20, 20), 32, 20), "iconed-item"); - launcherSettingsItem.getLabel().setText(i18n("settings.launcher")); - - launcherSettingsItem.setOnMouseClicked(e -> Controllers.navigate(Controllers.getSettingsPage())); + AdvancedListItem launcherSettingsItem = new AdvancedListItem(); + launcherSettingsItem.setImage(new Image("/assets/img/command.png")); + launcherSettingsItem.setRightGraphic(SVG.gear(Theme.blackFillBinding(), -1, -1)); + launcherSettingsItem.setTitle(i18n("settings.launcher")); + launcherSettingsItem.setOnAction(e -> Controllers.navigate(Controllers.getSettingsPage())); this .startCategory(i18n("account").toUpperCase()) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.java index 9e0068b6a..531e6247b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.java @@ -158,4 +158,8 @@ public final class SVG { public static Node home(ObjectBinding fill, double width, double height) { return createSVGPath("M10,20V14H14V20H19V12H22L12,3L2,12H5V20H10Z", fill, width, height); } + + public static Node viewList(ObjectBinding fill, double width, double height) { + return createSVGPath("M7,5H21V7H7V5M7,13V11H21V13H7M4,4.5A1.5,1.5 0 0,1 5.5,6A1.5,1.5 0 0,1 4,7.5A1.5,1.5 0 0,1 2.5,6A1.5,1.5 0 0,1 4,4.5M4,10.5A1.5,1.5 0 0,1 5.5,12A1.5,1.5 0 0,1 4,13.5A1.5,1.5 0 0,1 2.5,12A1.5,1.5 0 0,1 4,10.5M7,19V17H21V19H7M4,16.5A1.5,1.5 0 0,1 5.5,18A1.5,1.5 0 0,1 4,19.5A1.5,1.5 0 0,1 2.5,18A1.5,1.5 0 0,1 4,16.5Z", fill, width, height); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java index cbabb6de7..34c176abe 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java @@ -24,7 +24,9 @@ import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.offline.OfflineAccount; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; import org.jackhuang.hmcl.game.AccountHelper; +import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.task.Schedulers; +import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.AdvancedListItem; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -36,21 +38,21 @@ public class AccountAdvancedListItem extends AdvancedListItem { protected void invalidated() { Account account = get(); if (account == null) { - titleProperty().set(i18n("account.missing")); - subtitleProperty().set(i18n("account.missing.add")); - imageProperty().set(new Image("/assets/img/craft_table.png")); + setTitle(i18n("account.missing")); + setSubtitle(i18n("account.missing.add")); + setImage(new Image("/assets/img/craft_table.png")); } else { - titleProperty().set(account.getCharacter()); - subtitleProperty().set(accountSubtitle(account)); + setTitle(account.getCharacter()); + setSubtitle(accountSubtitle(account)); final int scaleRatio = 4; Image defaultSkin = AccountHelper.getDefaultSkin(account.getUUID(), scaleRatio); - imageProperty().set(AccountHelper.getHead(defaultSkin, scaleRatio)); + setImage(AccountHelper.getHead(defaultSkin, scaleRatio)); if (account instanceof YggdrasilAccount) { AccountHelper.loadSkinAsync((YggdrasilAccount) account).subscribe(Schedulers.javafx(), () -> { Image image = AccountHelper.getSkin((YggdrasilAccount) account, scaleRatio); - imageProperty().set(AccountHelper.getHead(image, scaleRatio)); + setImage(AccountHelper.getHead(image, scaleRatio)); }); } } @@ -58,6 +60,7 @@ public class AccountAdvancedListItem extends AdvancedListItem { }; public AccountAdvancedListItem() { + setRightGraphic(SVG.viewList(Theme.blackFillBinding(), -1, -1)); } public ObjectProperty accountProperty() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AdvancedListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AdvancedListItem.java index 37721c253..b3f9cab03 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AdvancedListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AdvancedListItem.java @@ -20,33 +20,83 @@ package org.jackhuang.hmcl.ui.construct; import javafx.beans.property.*; import javafx.event.ActionEvent; import javafx.event.EventHandler; -import javafx.geometry.Rectangle2D; +import javafx.scene.Node; import javafx.scene.control.Control; import javafx.scene.control.Skin; import javafx.scene.image.Image; +import javafx.scene.input.MouseEvent; public class AdvancedListItem extends Control { private final ObjectProperty image = new SimpleObjectProperty<>(this, "image"); + private final ObjectProperty rightGraphic = new SimpleObjectProperty<>(this, "rightGraphic"); private final StringProperty title = new SimpleStringProperty(this, "title"); private final StringProperty subtitle = new SimpleStringProperty(this, "subtitle"); private final BooleanProperty actionButtonVisible = new SimpleBooleanProperty(this, "actionButtonVisible", true); + public AdvancedListItem() { + addEventHandler(MouseEvent.MOUSE_CLICKED, e -> fireEvent(new ActionEvent())); + } + + public Image getImage() { + return image.get(); + } + public ObjectProperty imageProperty() { return image; } + public void setImage(Image image) { + this.image.set(image); + } + + public Node getRightGraphic() { + return rightGraphic.get(); + } + + public ObjectProperty rightGraphicProperty() { + return rightGraphic; + } + + public void setRightGraphic(Node rightGraphic) { + this.rightGraphic.set(rightGraphic); + } + + public String getTitle() { + return title.get(); + } + public StringProperty titleProperty() { return title; } + public void setTitle(String title) { + this.title.set(title); + } + + public String getSubtitle() { + return subtitle.get(); + } + public StringProperty subtitleProperty() { return subtitle; } + public void setSubtitle(String subtitle) { + this.subtitle.set(subtitle); + } + + public boolean isActionButtonVisible() { + return actionButtonVisible.get(); + } + public BooleanProperty actionButtonVisibleProperty() { return actionButtonVisible; } + public void setActionButtonVisible(boolean actionButtonVisible) { + this.actionButtonVisible.set(actionButtonVisible); + } + public final ObjectProperty> onActionProperty() { return onAction; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AdvancedListItemSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AdvancedListItemSkin.java index 1a6f31a77..bba2d3a5c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AdvancedListItemSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AdvancedListItemSkin.java @@ -28,9 +28,7 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.text.TextAlignment; -import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.FXUtils; -import org.jackhuang.hmcl.ui.SVG; public class AdvancedListItemSkin extends SkinBase { @@ -38,6 +36,7 @@ public class AdvancedListItemSkin extends SkinBase { super(skinnable); StackPane stackPane = new StackPane(); + RipplerContainer container = new RipplerContainer(stackPane); BorderPane root = new BorderPane(); root.setPickOnBounds(false); @@ -89,7 +88,7 @@ public class AdvancedListItemSkin extends SkinBase { JFXButton settings = new JFXButton(); FXUtils.setLimitWidth(settings, 40); settings.getStyleClass().setAll("toggle-icon4"); - settings.setGraphic(SVG.gear(Theme.blackFillBinding(), -1, -1)); + settings.graphicProperty().bind(skinnable.rightGraphicProperty()); right.getChildren().setAll(settings); root.setRight(right); @@ -103,6 +102,6 @@ public class AdvancedListItemSkin extends SkinBase { stackPane.setPickOnBounds(false); stackPane.getChildren().setAll(root); - getChildren().setAll(stackPane); + getChildren().setAll(container); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/profile/ProfileAdvancedListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/profile/ProfileAdvancedListItem.java index 86f21e752..6dadaf8d9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/profile/ProfileAdvancedListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/profile/ProfileAdvancedListItem.java @@ -22,6 +22,8 @@ import javafx.beans.property.SimpleObjectProperty; import javafx.scene.image.Image; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Profiles; +import org.jackhuang.hmcl.setting.Theme; +import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.AdvancedListItem; public class ProfileAdvancedListItem extends AdvancedListItem { @@ -32,14 +34,15 @@ public class ProfileAdvancedListItem extends AdvancedListItem { Profile profile = get(); if (profile == null) { } else { - titleProperty().set(Profiles.getProfileDisplayName(profile)); - subtitleProperty().set(profile.getGameDir().toString()); + setTitle(Profiles.getProfileDisplayName(profile)); + setSubtitle(profile.getGameDir().toString()); } } }; public ProfileAdvancedListItem() { - imageProperty().set(new Image("/assets/img/craft_table.png")); + setImage(new Image("/assets/img/craft_table.png")); + setRightGraphic(SVG.viewList(Theme.blackFillBinding(), -1, -1)); } public ObjectProperty profileProperty() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameAdvancedListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameAdvancedListItem.java index f271d7979..29aec77f9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameAdvancedListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameAdvancedListItem.java @@ -24,7 +24,9 @@ import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.RefreshedVersionsEvent; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Profiles; +import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.FXUtils; +import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.WeakListenerHolder; import org.jackhuang.hmcl.ui.construct.AdvancedListItem; @@ -41,13 +43,15 @@ public class GameAdvancedListItem extends AdvancedListItem { imageProperty().set(Profiles.getSelectedProfile().getRepository().getVersionIconImage(version)); if (version != null) { - titleProperty().set(version); - subtitleProperty().set(null); + setTitle(version); + setSubtitle(null); } else { - titleProperty().set(i18n("version.empty")); - subtitleProperty().set(i18n("version.empty.add")); + setTitle(i18n("version.empty")); + setSubtitle(i18n("version.empty.add")); } }); }); + + setRightGraphic(SVG.gear(Theme.blackFillBinding(), -1, -1)); } } diff --git a/HMCL/src/main/resources/assets/img/bookshelf.png b/HMCL/src/main/resources/assets/img/bookshelf.png new file mode 100644 index 000000000..7dc963fef Binary files /dev/null and b/HMCL/src/main/resources/assets/img/bookshelf.png differ