Skip to content

Commit 2855df3

Browse files
authored
Feat: Implement dynamic folder icon and use to game directory list (HMCL-dev#6435)
1 parent 8184dc6 commit 2855df3

2 files changed

Lines changed: 14 additions & 7 deletions

File tree

HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public enum SVG {
6666
FILE_OPEN("M6 22q-0.825 0-1.4125-0.5875T4 20v-16q0-0.825 0.5875-1.4125T6 2h8l6 6v6h-2v-5H13v-5H6v16h9v2H6Zm15.95 0.375L19 19.425v2.225h-2v-5.65h5.65v2h-2.25l2.95 2.95-1.4 1.425Zm-15.95-2.375v-16 16Z"),
6767
FOLDER("M4 20Q3.175 20 2.5875 19.4125T2 18V6Q2 5.175 2.5875 4.5875T4 4H10L12 6H20Q20.825 6 21.4125 6.5875T22 8V18Q22 18.825 21.4125 19.4125T20 20H4ZM4 18H20V8H11.175L9.175 6H4V18ZM4 18V6 18Z"),
6868
FOLDER_COPY("M3 21Q2.175 21 1.5875 20.4125T1 19V6H3V19H20V21H3ZM7 17Q6.175 17 5.5875 16.4125T5 15V4Q5 3.175 5.5875 2.5875T7 2H12L14 4H21Q21.825 4 22.4125 4.5875T23 6V15Q23 15.825 22.4125 16.4125T21 17H7ZM7 15H21V6H13.175L11.175 4H7V15ZM7 15V4 15Z"),
69+
FOLDER_FILL("M4 20q-.825 0-1.4125-.5875T2 18v-12q0-.825.5875-1.4125T4 4h6l2 2h8q.825 0 1.4125.5875T22 8v10q0 .825-.5875 1.4125T20 20H4Z"),
6970
FOLDER_OPEN("M4 20Q3.175 20 2.5875 19.4125T2 18V6Q2 5.175 2.5875 4.5875T4 4H10L12 6H20Q20.825 6 21.4125 6.5875T22 8H11.175L9.175 6H4V18L6.4 10H23.5L20.925 18.575Q20.725 19.225 20.1875 19.6125T19 20H4ZM6.1 18H19L20.8 12H7.9L6.1 18ZM6.1 18 7.9 12 6.1 18ZM4 8V6 8Z"),
7071
FORMAT_LIST_BULLETED("M9 19V17H21V19H9ZM9 13V11H21V13H9ZM9 7V5H21V7H9ZM5 20Q4.175 20 3.5875 19.4125T3 18Q3 17.175 3.5875 16.5875T5 16Q5.825 16 6.4125 16.5875T7 18Q7 18.825 6.4125 19.4125T5 20ZM5 14Q4.175 14 3.5875 13.4125T3 12Q3 11.175 3.5875 10.5875T5 10Q5.825 10 6.4125 10.5875T7 12Q7 12.825 6.4125 13.4125T5 14ZM5 8Q4.175 8 3.5875 7.4125T3 6Q3 5.175 3.5875 4.5875T5 4Q5.825 4 6.4125 4.5875T7 6Q7 6.825 6.4125 7.4125T5 8Z"),
7172
FORT("M1 21V17l2-2V9L1 7V3H3V5H5V3H7V5H9V3h2V7L9 9v1h6V9L13 7V3h2V5h2V3h2V5h2V3h2V7L21 9v6l2 2v4H14V18q0-.825-.5875-1.4125T12 16q-.825 0-1.4125.5875T10 18v3H1Zm2-2H8V18q0-1.65 1.175-2.825T12 14q1.65 0 2.825 1.175T16 18v1h5V17.825l-2-2V8.175L20.175 7h-4.35L17 8.175V12H7V8.175L8.175 7H3.825L5 8.175v7.65l-2 2V19Zm9-6Z"),

HMCL/src/main/java/org/jackhuang/hmcl/ui/directory/GameDirectoryListItemSkin.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@
2121
import javafx.css.PseudoClass;
2222
import javafx.geometry.Insets;
2323
import javafx.geometry.Pos;
24-
import javafx.scene.Node;
2524
import javafx.scene.control.SkinBase;
2625
import javafx.scene.layout.BorderPane;
2726
import javafx.scene.layout.HBox;
2827
import org.jackhuang.hmcl.setting.GameDirectoryManager;
2928
import org.jackhuang.hmcl.ui.FXUtils;
3029
import org.jackhuang.hmcl.ui.SVG;
30+
import org.jackhuang.hmcl.ui.SVGContainer;
31+
import org.jackhuang.hmcl.ui.animation.Motion;
3132
import org.jackhuang.hmcl.ui.construct.RipplerContainer;
3233
import org.jackhuang.hmcl.ui.construct.TwoLineListItem;
3334
import org.jetbrains.annotations.NotNullByDefault;
@@ -48,18 +49,23 @@ public GameDirectoryListItemSkin(GameDirectoryListItem skinnable) {
4849
root.setPickOnBounds(false);
4950
RipplerContainer container = new RipplerContainer(root);
5051

52+
SVGContainer left = (skinnable.isSelected() ? SVG.FOLDER_FILL : SVG.FOLDER).createIcon(20);
53+
left.setMouseTransparent(true);
54+
BorderPane.setMargin(left, new Insets(0, 6, 0, 6));
55+
BorderPane.setAlignment(left, Pos.CENTER_LEFT);
56+
root.setLeft(left);
57+
5158
FXUtils.onChangeAndOperate(skinnable.selectedProperty(), active -> {
5259
skinnable.pseudoClassStateChanged(SELECTED, active);
60+
61+
SVG targetIcon = active ? SVG.FOLDER_FILL : SVG.FOLDER;
62+
if (left.getIcon() != targetIcon) {
63+
left.setIcon(targetIcon, Motion.SHORT4);
64+
}
5365
});
5466

5567
FXUtils.onClicked(getSkinnable(), () -> GameDirectoryManager.setSelectedGameDirectory(skinnable.getGameDirectory()));
5668

57-
Node left = SVG.FOLDER.createIcon(20);
58-
left.setMouseTransparent(true);
59-
BorderPane.setMargin(left, new Insets(0, 6, 0, 6));
60-
root.setLeft(left);
61-
BorderPane.setAlignment(left, Pos.CENTER_LEFT);
62-
6369
TwoLineListItem item = new TwoLineListItem();
6470
item.setPickOnBounds(false);
6571
BorderPane.setAlignment(item, Pos.CENTER);

0 commit comments

Comments
 (0)