diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 5ae8b0d88..c49c18f19 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -19,6 +19,7 @@ package org.jackhuang.hmcl.game; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import javafx.scene.image.Image; import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.RefreshedVersionsEvent; import org.jackhuang.hmcl.event.RefreshingVersionsEvent; @@ -144,10 +145,24 @@ public class HMCLGameRepository extends DefaultGameRepository { return setting; } - public File getVersionIcon(String id) { + public File getVersionIconFile(String id) { return new File(getVersionRoot(id), "icon.png"); } + public Image getVersionIconImage(String id) { + if (id == null) + return new Image("/assets/img/grass.png"); + + Version version = getVersion(id); + File iconFile = getVersionIconFile(id); + if (iconFile.exists()) + return new Image("file:" + iconFile.getAbsolutePath()); + else if ("net.minecraft.launchwrapper.Launch".equals(version.getMainClass())) + return new Image("/assets/img/furnace.png"); + else + return new Image("/assets/img/grass.png"); + } + public boolean saveVersionSetting(String id) { if (!versionSettings.containsKey(id)) return false; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java index 47f15f58a..e9be8246b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -32,12 +32,13 @@ import javafx.scene.shape.Rectangle; import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.RefreshedVersionsEvent; import org.jackhuang.hmcl.game.HMCLGameRepository; -import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Profiles; import org.jackhuang.hmcl.setting.Theme; -import org.jackhuang.hmcl.ui.construct.IconedMenuItem; +import org.jackhuang.hmcl.ui.construct.PopupMenu; +import org.jackhuang.hmcl.ui.construct.RipplerContainer; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; +import org.jackhuang.hmcl.ui.versions.GameItem; import org.jackhuang.hmcl.ui.versions.Versions; import org.jackhuang.hmcl.util.VersionNumber; @@ -49,7 +50,7 @@ import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class MainPage extends StackPane implements DecoratorPage { private final ReadOnlyStringWrapper title = new ReadOnlyStringWrapper(this, "title", i18n("main_page")); - private final VBox menu = new VBox(); + private final PopupMenu menu = new PopupMenu(); private final JFXPopup popup = new JFXPopup(menu); @FXML @@ -69,7 +70,7 @@ public final class MainPage extends StackPane implements DecoratorPage { btnLaunch.setClip(new Rectangle(-100, -100, 310, 200)); btnMenu.setClip(new Rectangle(211, -100, 100, 200)); - menu.getStyleClass().setAll("menu"); + menu.setMaxHeight(400); StackPane graphic = new StackPane(); Node svg = SVG.triangle(Theme.whiteFillBinding(), 10, 10); @@ -102,17 +103,26 @@ public final class MainPage extends StackPane implements DecoratorPage { } private void loadVersions(HMCLGameRepository repository) { - List children = repository.getVersions().parallelStream() + List children = repository.getVersions().parallelStream() .filter(version -> !version.isHidden()) .sorted((a, b) -> VersionNumber.COMPARATOR.compare(VersionNumber.asVersion(a.getId()), VersionNumber.asVersion(b.getId()))) - .map(version -> new IconedMenuItem(null, version.getId(), () -> { - repository.getProfile().setSelectedVersion(version.getId()); - popup.hide(); - })) + .map(version -> { + StackPane pane = new StackPane(); + GameItem item = new GameItem(repository.getProfile(), version.getId()); + pane.getChildren().setAll(item); + pane.getStyleClass().setAll("menu-container"); + item.setMouseTransparent(true); + RipplerContainer container = new RipplerContainer(pane); + container.setOnMouseClicked(e -> { + repository.getProfile().setSelectedVersion(version.getId()); + popup.hide(); + }); + return container; + }) .collect(Collectors.toList()); JFXUtilities.runInFX(() -> { if (profile == repository.getProfile()) - menu.getChildren().setAll(children); + menu.getContent().setAll(children); }); } 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 901693879..e97311143 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 @@ -90,7 +90,7 @@ public class AdvancedListItemSkin extends SkinBase { JFXButton settings = new JFXButton(); FXUtils.setLimitWidth(settings, 40); settings.getStyleClass().setAll("toggle-icon4"); - settings.setGraphic(SVG.dotsVertical(Theme.blackFillBinding(), -1, -1)); + settings.setGraphic(SVG.gear(Theme.blackFillBinding(), -1, -1)); right.getChildren().setAll(settings); root.setRight(right); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/PopupMenu.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/PopupMenu.java new file mode 100644 index 000000000..3d4c9166a --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/PopupMenu.java @@ -0,0 +1,66 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2017 huangyuhui + * + * 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 {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.ui.construct; + +import javafx.beans.binding.Bindings; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.scene.Node; +import javafx.scene.control.Control; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.Skin; +import javafx.scene.control.SkinBase; +import javafx.scene.layout.VBox; +import org.jackhuang.hmcl.ui.FXUtils; + +public class PopupMenu extends Control { + + private final ObservableList content = FXCollections.observableArrayList(); + + public PopupMenu() { + } + + public ObservableList getContent() { + return content; + } + + @Override + protected Skin createDefaultSkin() { + return new PopupMenuSkin(); + } + + private class PopupMenuSkin extends SkinBase { + + protected PopupMenuSkin() { + super(PopupMenu.this); + + ScrollPane scrollPane = new ScrollPane(); + scrollPane.setFitToHeight(true); + scrollPane.setFitToWidth(true); + + VBox content = new VBox(); + content.getStyleClass().add("menu"); + Bindings.bindContent(content.getChildren(), PopupMenu.this.getContent()); + scrollPane.setContent(content); + + FXUtils.smoothScrolling(scrollPane); + + getChildren().setAll(scrollPane); + } + } +} 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 ab652618d..f271d7979 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 @@ -38,11 +38,7 @@ public class GameAdvancedListItem extends AdvancedListItem { public GameAdvancedListItem() { FXUtils.onChangeAndOperate(Profiles.selectedVersionProperty(), version -> { FXUtils.runLaterIf(() -> !Objects.nonNull(Profiles.getSelectedProfile()), () -> { - File iconFile = Profiles.getSelectedProfile().getRepository().getVersionIcon(version); - if (iconFile.exists()) - imageProperty().set(new Image("file:" + iconFile.getAbsolutePath())); - else - imageProperty().set(new Image("/assets/img/grass.png")); + imageProperty().set(Profiles.getSelectedProfile().getRepository().getVersionIconImage(version)); if (version != null) { titleProperty().set(version); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java new file mode 100644 index 000000000..7c1ae7708 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java @@ -0,0 +1,84 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2017 huangyuhui + * + * 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 {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.ui.versions; + +import javafx.beans.property.*; +import javafx.scene.control.Control; +import javafx.scene.control.Skin; +import javafx.scene.image.Image; +import org.jackhuang.hmcl.download.LibraryAnalyzer; +import org.jackhuang.hmcl.game.GameVersion; +import org.jackhuang.hmcl.setting.Profile; + +import static org.jackhuang.hmcl.util.StringUtils.removePrefix; +import static org.jackhuang.hmcl.util.StringUtils.removeSuffix; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + +public class GameItem extends Control { + private final Profile profile; + private final String version; + private final StringProperty title = new SimpleStringProperty(); + private final StringProperty subtitle = new SimpleStringProperty(); + private final ObjectProperty image = new SimpleObjectProperty<>(); + + public GameItem(Profile profile, String id) { + this.profile = profile; + this.version = id; + + String game = GameVersion.minecraftVersion(profile.getRepository().getVersionJar(id)).orElse("Unknown"); + + StringBuilder libraries = new StringBuilder(game); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(profile.getRepository().getVersion(id)); + analyzer.getForge().ifPresent(library -> libraries.append(", ").append(i18n("install.installer.forge")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)forge", "")))); + analyzer.getLiteLoader().ifPresent(library -> libraries.append(", ").append(i18n("install.installer.liteloader")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)liteloader", "")))); + analyzer.getOptiFine().ifPresent(library -> libraries.append(", ").append(i18n("install.installer.optifine")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)optifine", "")))); + + title.set(id); + subtitle.set(libraries.toString()); + image.set(profile.getRepository().getVersionIconImage(version)); + } + + @Override + protected Skin createDefaultSkin() { + return new GameItemSkin(this); + } + + public Profile getProfile() { + return profile; + } + + public String getVersion() { + return version; + } + + public StringProperty titleProperty() { + return title; + } + + public StringProperty subtitleProperty() { + return subtitle; + } + + public ObjectProperty imageProperty() { + return image; + } + + private static String modifyVersion(String gameVersion, String version) { + return removeSuffix(removePrefix(removeSuffix(removePrefix(version.replace(gameVersion, "").trim(), "-"), "-"), "_"), "_"); + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItemSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItemSkin.java new file mode 100644 index 000000000..9a616edcc --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItemSkin.java @@ -0,0 +1,36 @@ +package org.jackhuang.hmcl.ui.versions; + +import javafx.geometry.Pos; +import javafx.scene.control.SkinBase; +import javafx.scene.image.ImageView; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; +import org.jackhuang.hmcl.ui.FXUtils; +import org.jackhuang.hmcl.ui.construct.TwoLineListItem; + +public class GameItemSkin extends SkinBase { + public GameItemSkin(GameItem skinnable) { + super(skinnable); + + HBox center = new HBox(); + center.setSpacing(8); + center.setAlignment(Pos.CENTER_LEFT); + + StackPane imageViewContainer = new StackPane(); + FXUtils.setLimitWidth(imageViewContainer, 32); + FXUtils.setLimitHeight(imageViewContainer, 32); + + ImageView imageView = new ImageView(); + FXUtils.limitSize(imageView, 32, 32); + imageView.imageProperty().bind(skinnable.imageProperty()); + imageViewContainer.getChildren().setAll(imageView); + + TwoLineListItem item = new TwoLineListItem(); + item.titleProperty().bind(skinnable.titleProperty()); + item.subtitleProperty().bind(skinnable.subtitleProperty()); + BorderPane.setAlignment(item, Pos.CENTER); + center.getChildren().setAll(imageView, item); + getChildren().setAll(center); + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItem.java index 9edcdf80c..ca6059702 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItem.java @@ -21,27 +21,16 @@ import javafx.beans.property.*; import javafx.scene.control.Control; import javafx.scene.control.Skin; import javafx.scene.control.ToggleGroup; -import javafx.scene.image.Image; -import org.jackhuang.hmcl.download.LibraryAnalyzer; -import org.jackhuang.hmcl.game.GameVersion; + import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.ui.Controllers; -import java.io.File; - -import static org.jackhuang.hmcl.util.StringUtils.removePrefix; -import static org.jackhuang.hmcl.util.StringUtils.removeSuffix; -import static org.jackhuang.hmcl.util.i18n.I18n.i18n; - public class GameListItem extends Control { private final Profile profile; private final String version; private final boolean isModpack; private final ToggleGroup toggleGroup; - private final StringProperty title = new SimpleStringProperty(); - private final StringProperty subtitle = new SimpleStringProperty(); private final BooleanProperty selected = new SimpleBooleanProperty(); - private final ObjectProperty image = new SimpleObjectProperty<>(); public GameListItem(ToggleGroup toggleGroup, Profile profile, String id) { this.profile = profile; @@ -49,23 +38,7 @@ public class GameListItem extends Control { this.toggleGroup = toggleGroup; this.isModpack = profile.getRepository().isModpack(id); - String game = GameVersion.minecraftVersion(profile.getRepository().getVersionJar(id)).orElse("Unknown"); - - StringBuilder libraries = new StringBuilder(game); - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(profile.getRepository().getVersion(id)); - analyzer.getForge().ifPresent(library -> libraries.append(", ").append(i18n("install.installer.forge")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)forge", "")))); - analyzer.getLiteLoader().ifPresent(library -> libraries.append(", ").append(i18n("install.installer.liteloader")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)liteloader", "")))); - analyzer.getOptiFine().ifPresent(library -> libraries.append(", ").append(i18n("install.installer.optifine")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)optifine", "")))); - - title.set(id); - subtitle.set(libraries.toString()); selected.set(id.equals(profile.getSelectedVersion())); - - File iconFile = profile.getRepository().getVersionIcon(version); - if (iconFile.exists()) - image.set(new Image("file:" + iconFile.getAbsolutePath())); - else - image.set(new Image("/assets/img/grass.png")); } @Override @@ -85,22 +58,10 @@ public class GameListItem extends Control { return version; } - public StringProperty titleProperty() { - return title; - } - - public StringProperty subtitleProperty() { - return subtitle; - } - public BooleanProperty selectedProperty() { return selected; } - public ObjectProperty imageProperty() { - return image; - } - public void checkSelection() { selected.set(version.equals(profile.getSelectedVersion())); } @@ -141,8 +102,4 @@ public class GameListItem extends Control { public void update() { Versions.updateVersion(profile, version); } - - private static String modifyVersion(String gameVersion, String version) { - return removeSuffix(removePrefix(removeSuffix(removePrefix(version.replace(gameVersion, "").trim(), "-"), "-"), "_"), "_"); - } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemSkin.java index 6ad6eb59b..cafe976b9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemSkin.java @@ -24,17 +24,14 @@ import com.jfoenix.controls.JFXRadioButton; import com.jfoenix.effects.JFXDepthManager; import javafx.geometry.Pos; import javafx.scene.control.SkinBase; -import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; -import javafx.scene.layout.StackPane; -import javafx.scene.layout.VBox; import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.IconedMenuItem; import org.jackhuang.hmcl.ui.construct.MenuSeparator; -import org.jackhuang.hmcl.ui.construct.TwoLineListItem; +import org.jackhuang.hmcl.ui.construct.PopupMenu; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -52,29 +49,12 @@ public class GameListItemSkin extends SkinBase { chkSelected.setToggleGroup(skinnable.getToggleGroup()); root.setLeft(chkSelected); - HBox center = new HBox(); - center.setSpacing(8); - center.setAlignment(Pos.CENTER_LEFT); + root.setCenter(new GameItem(skinnable.getProfile(), skinnable.getVersion())); - StackPane imageViewContainer = new StackPane(); - FXUtils.setLimitWidth(imageViewContainer, 32); - FXUtils.setLimitHeight(imageViewContainer, 32); - - ImageView imageView = new ImageView(); - FXUtils.limitSize(imageView, 32, 32); - imageView.imageProperty().bind(skinnable.imageProperty()); - imageViewContainer.getChildren().setAll(imageView); - - TwoLineListItem item = new TwoLineListItem(); - BorderPane.setAlignment(item, Pos.CENTER); - center.getChildren().setAll(imageView, item); - root.setCenter(center); - - VBox menu = new VBox(); - menu.getStyleClass().setAll("menu"); + PopupMenu menu = new PopupMenu(); JFXPopup popup = new JFXPopup(menu); - menu.getChildren().setAll( + menu.getContent().setAll( new IconedMenuItem(FXUtils.limitingSize(SVG.gear(Theme.blackFillBinding(), 14, 14), 14, 14), i18n("version.manage.manage"), FXUtils.withJFXPopupClosing(skinnable::modifyGameSettings, popup)), new MenuSeparator(), new IconedMenuItem(FXUtils.limitingSize(SVG.pencil(Theme.blackFillBinding(), 14, 14), 14, 14), i18n("version.manage.rename"), FXUtils.withJFXPopupClosing(skinnable::rename, popup)), @@ -109,8 +89,6 @@ public class GameListItemSkin extends SkinBase { root.setStyle("-fx-background-color: white; -fx-padding: 8 8 8 0;"); JFXDepthManager.setDepth(root, 1); - item.titleProperty().bind(skinnable.titleProperty()); - item.subtitleProperty().bind(skinnable.subtitleProperty()); getChildren().setAll(root); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java index 967bed484..e1daed4a3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java @@ -30,6 +30,7 @@ import org.jackhuang.hmcl.download.game.GameAssetIndexDownloadTask; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.construct.IconedMenuItem; +import org.jackhuang.hmcl.ui.construct.PopupMenu; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; import org.jackhuang.hmcl.util.FileUtils; @@ -74,10 +75,9 @@ public final class VersionPage extends StackPane implements DecoratorPage { { FXUtils.loadFXML(this, "/assets/fxml/version/version.fxml"); - VBox browseList = new VBox(); - browseList.getStyleClass().setAll("menu"); + PopupMenu browseList = new PopupMenu(); browsePopup = new JFXPopup(browseList); - browseList.getChildren().setAll( + browseList.getContent().setAll( new IconedMenuItem(null, i18n("folder.game"), FXUtils.withJFXPopupClosing(() -> onBrowse(""), browsePopup)), new IconedMenuItem(null, i18n("folder.mod"), FXUtils.withJFXPopupClosing(() -> onBrowse("mods"), browsePopup)), new IconedMenuItem(null, i18n("folder.config"), FXUtils.withJFXPopupClosing(() -> onBrowse("config"), browsePopup)), @@ -86,10 +86,9 @@ public final class VersionPage extends StackPane implements DecoratorPage { new IconedMenuItem(null, i18n("folder.saves"), FXUtils.withJFXPopupClosing(() -> onBrowse("resourcepacks"), browsePopup)) ); - VBox managementList = new VBox(); - managementList.getStyleClass().setAll("menu"); + PopupMenu managementList = new PopupMenu(); managementPopup = new JFXPopup(managementList); - managementList.getChildren().setAll( + managementList.getContent().setAll( new IconedMenuItem(null, i18n("version.manage.rename"), FXUtils.withJFXPopupClosing(() -> Versions.renameVersion(profile, version), managementPopup)), new IconedMenuItem(null, i18n("version.manage.remove"), FXUtils.withJFXPopupClosing(() -> Versions.deleteVersion(profile, version), managementPopup)), new IconedMenuItem(null, i18n("version.manage.redownload_assets_index"), FXUtils.withJFXPopupClosing(() -> new GameAssetIndexDownloadTask(profile.getDependency(), profile.getRepository().getResolvedVersion(version)).start(), managementPopup)), diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java index fdec7553c..f06abb7c7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java @@ -276,7 +276,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("extension.png"), "*.png")); File selectedFile = chooser.showOpenDialog(Controllers.getStage()); if (selectedFile != null) { - File iconFile = profile.getRepository().getVersionIcon(versionId); + File iconFile = profile.getRepository().getVersionIconFile(versionId); try { FileUtils.copyFile(selectedFile, iconFile); loadIcon(); @@ -291,7 +291,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag if (versionId == null) return; - File iconFile = profile.getRepository().getVersionIcon(versionId); + File iconFile = profile.getRepository().getVersionIconFile(versionId); if (iconFile.exists()) iconFile.delete(); loadIcon(); @@ -303,7 +303,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag return; } - File iconFile = profile.getRepository().getVersionIcon(versionId); + File iconFile = profile.getRepository().getVersionIconFile(versionId); if (iconFile.exists()) iconPickerItem.setImage(new Image("file:" + iconFile.getAbsolutePath())); else diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItemSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItemSkin.java index 96edc0efd..48a4d274a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItemSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItemSkin.java @@ -9,11 +9,11 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; -import javafx.scene.layout.VBox; import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.IconedMenuItem; +import org.jackhuang.hmcl.ui.construct.PopupMenu; import org.jackhuang.hmcl.ui.construct.TwoLineListItem; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -43,11 +43,10 @@ public class WorldListItemSkin extends SkinBase { center.getChildren().setAll(imageView, item); root.setCenter(center); - VBox menu = new VBox(); - menu.getStyleClass().setAll("menu"); + PopupMenu menu = new PopupMenu(); JFXPopup popup = new JFXPopup(menu); - menu.getChildren().setAll( + menu.getContent().setAll( new IconedMenuItem(FXUtils.limitingSize(SVG.gear(Theme.blackFillBinding(), 14, 14), 14, 14), i18n("world.datapack"), FXUtils.withJFXPopupClosing(skinnable::manageDatapacks, popup)), new IconedMenuItem(FXUtils.limitingSize(SVG.export(Theme.blackFillBinding(), 14, 14), 14, 14), i18n("world.export"), FXUtils.withJFXPopupClosing(skinnable::export, popup))); diff --git a/HMCL/src/main/resources/assets/css/root.css b/HMCL/src/main/resources/assets/css/root.css index 3c99506aa..6d66c04e0 100644 --- a/HMCL/src/main/resources/assets/css/root.css +++ b/HMCL/src/main/resources/assets/css/root.css @@ -81,6 +81,10 @@ -fx-alignment: CENTER_LEFT; } +.menu-container { + -fx-padding: 8 16 8 16; +} + .menu { -fx-padding: 4 0 4 0; } diff --git a/HMCL/src/main/resources/assets/fxml/main.fxml b/HMCL/src/main/resources/assets/fxml/main.fxml index 48e42b2f3..d4c105133 100644 --- a/HMCL/src/main/resources/assets/fxml/main.fxml +++ b/HMCL/src/main/resources/assets/fxml/main.fxml @@ -14,7 +14,7 @@ diff --git a/HMCL/src/main/resources/assets/img/furnace.png b/HMCL/src/main/resources/assets/img/furnace.png new file mode 100644 index 000000000..4fc95fc2c Binary files /dev/null and b/HMCL/src/main/resources/assets/img/furnace.png differ diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 7aab875fc..98287626a 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -269,7 +269,7 @@ world.time=yyyy 年 MM 月 dd 日 HH:mm:ss profile=遊戲目錄 profile.default=目前目錄 -profile.home=官方啟動器目錄 +profile.home=官方啟動器 profile.instance_directory=遊戲路徑 profile.instance_directory.choose=選擇遊戲路徑 profile.manage=遊戲目錄列表 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 12cccf98d..a6036fef8 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -269,7 +269,7 @@ world.time=yyyy 年 MM 月 dd 日 HH:mm:ss profile=游戏目录 profile.default=当前目录 -profile.home=官方启动器目录 +profile.home=官方启动器 profile.instance_directory=游戏路径 profile.instance_directory.choose=选择游戏路径 profile.manage=游戏目录列表