From 45f55b2075f33b6e915f5a048bb2add77a4a8967 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Wed, 3 Oct 2018 01:32:55 +0800 Subject: [PATCH] Adjust looking of LeftPaneController --- .../jackhuang/hmcl/ui/LeftPaneController.java | 20 ++++--- .../main/java/org/jackhuang/hmcl/ui/SVG.java | 4 ++ .../ui/account/AccountAdvancedListItem.java | 17 +++--- .../hmcl/ui/construct/AdvancedListItem.java | 52 +++++++++++++++++- .../ui/construct/AdvancedListItemSkin.java | 7 +-- .../ui/profile/ProfileAdvancedListItem.java | 9 ++- .../ui/versions/GameAdvancedListItem.java | 12 ++-- .../main/resources/assets/img/bookshelf.png | Bin 0 -> 9674 bytes 8 files changed, 94 insertions(+), 27 deletions(-) create mode 100644 HMCL/src/main/resources/assets/img/bookshelf.png 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 0000000000000000000000000000000000000000..7dc963fefcbe41d6b139363ab656eb3e1dfbb14e GIT binary patch literal 9674 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