diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index 272921f0f..c0804cb9d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -31,6 +31,8 @@ import org.jackhuang.hmcl.ui.construct.InputDialogPane; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.construct.MessageDialogPane; import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane; +import org.jackhuang.hmcl.ui.versions.GameListView; +import org.jackhuang.hmcl.ui.versions.GameListViewModel; import org.jackhuang.hmcl.util.FutureCallback; import org.jackhuang.hmcl.util.JavaVersion; @@ -45,6 +47,7 @@ public final class Controllers { private static MainPage mainPage = null; private static SettingsPage settingsPage = null; private static VersionPage versionPage = null; + private static GameListView gameListView = null; private static AuthlibInjectorServersPage serversPage = null; private static LeftPaneController leftPaneController; private static Decorator decorator; @@ -64,6 +67,13 @@ public final class Controllers { return settingsPage; } + // FXThread + public static GameListView getGameListView() { + if (gameListView == null) + gameListView = new GameListView(new GameListViewModel()); + return gameListView; + } + // FXThread public static VersionPage getVersionPage() { if (versionPage == null) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameAdvancedListItemViewModel.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameAdvancedListItemViewModel.java index a65d2e50d..a484888fe 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameAdvancedListItemViewModel.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameAdvancedListItemViewModel.java @@ -78,6 +78,7 @@ public class GameAdvancedListItemViewModel extends AdvancedListItemViewModel { @Override public void action() { + Controllers.navigate(Controllers.getGameListView()); } @Override 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 65f15b6f3..96928efb6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.java @@ -33,6 +33,9 @@ public final class SVG { path.setContent(d); path.fillProperty().bind(fill); + if (width < 0 || height < 0) + return path; + Group svg = new Group(path); double scale = Math.min(width / svg.getBoundsInParent().getWidth(), height / svg.getBoundsInParent().getHeight()); svg.setScaleX(scale); @@ -127,4 +130,7 @@ public final class SVG { return createSVGPath("M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z", fill, width, height); } + public static Node importIcon(ObjectBinding fill, double width, double height) { + return createSVGPath("M14,12L10,8V11H2V13H10V16M20,18V6C20,4.89 19.1,4 18,4H6A2,2 0 0,0 4,6V9H6V6H18V18H6V15H4V18A2,2 0 0,0 6,20H18A2,2 0 0,0 20,18Z", fill, width, height); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemView.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemView.java new file mode 100644 index 000000000..42d6e26c2 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemView.java @@ -0,0 +1,127 @@ +/* + * 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 com.jfoenix.concurrency.JFXUtilities; +import com.jfoenix.controls.*; +import com.jfoenix.effects.JFXDepthManager; +import javafx.geometry.Pos; +import javafx.scene.image.ImageView; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; +import org.jackhuang.hmcl.setting.Theme; +import org.jackhuang.hmcl.ui.FXUtils; +import org.jackhuang.hmcl.ui.SVG; +import org.jackhuang.hmcl.ui.TwoLineListItem; + +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + +public class GameListItemView extends BorderPane { + + public GameListItemView(GameListItemViewModel viewModel) { + JFXRadioButton chkSelected = new JFXRadioButton(); + BorderPane.setAlignment(chkSelected, Pos.CENTER); + chkSelected.setUserData(viewModel); + chkSelected.selectedProperty().bindBidirectional(viewModel.selectedProperty()); + chkSelected.setToggleGroup(viewModel.getToggleGroup()); + setLeft(chkSelected); + + 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(viewModel.imageProperty()); + imageViewContainer.getChildren().setAll(imageView); + + TwoLineListItem item = new TwoLineListItem(); + BorderPane.setAlignment(item, Pos.CENTER); + center.getChildren().setAll(imageView, item); + setCenter(center); + + JFXListView menu = new JFXListView<>(); + menu.getItems().setAll( + i18n("settings"), + i18n("version.manage.rename"), + i18n("version.manage.remove"), + i18n("modpack.export"), + i18n("folder.game"), + i18n("version.launch"), + i18n("version.launch_script")); + JFXPopup popup = new JFXPopup(menu); + menu.setOnMouseClicked(e -> { + popup.hide(); + switch (menu.getSelectionModel().getSelectedIndex()) { + case 0: + viewModel.modifyGameSettings(); + break; + case 1: + viewModel.rename(); + break; + case 2: + viewModel.remove(); + break; + case 3: + viewModel.export(); + break; + case 4: + viewModel.browse(); + break; + case 5: + viewModel.launch(); + break; + case 6: + viewModel.generateLaunchScript(); + break; + } + }); + + HBox right = new HBox(); + right.setAlignment(Pos.CENTER_RIGHT); + if (viewModel.canUpdate()) { + JFXButton btnUpgrade = new JFXButton(); + btnUpgrade.setOnMouseClicked(e -> viewModel.update()); + btnUpgrade.getStyleClass().add("toggle-icon4"); + btnUpgrade.setGraphic(SVG.update(Theme.blackFillBinding(), -1, -1)); + JFXUtilities.runInFX(() -> FXUtils.installTooltip(btnUpgrade, i18n("version.update"))); + right.getChildren().add(btnUpgrade); + } + + JFXButton btnManage = new JFXButton(); + btnManage.setOnMouseClicked(e -> { + menu.getSelectionModel().select(-1); + popup.show(this, JFXPopup.PopupVPosition.TOP, JFXPopup.PopupHPosition.RIGHT, 0, this.getHeight()); + }); + btnManage.getStyleClass().add("toggle-icon4"); + BorderPane.setAlignment(btnManage, Pos.CENTER); + btnManage.setGraphic(SVG.dotsVertical(Theme.blackFillBinding(), -1, -1)); + right.getChildren().add(btnManage); + setRight(right); + + setStyle("-fx-background-color: white; -fx-padding: 8 8 8 0;"); + JFXDepthManager.setDepth(this, 1); + item.titleProperty().bind(viewModel.titleProperty()); + item.subtitleProperty().bind(viewModel.subtitleProperty()); + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemViewModel.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemViewModel.java new file mode 100644 index 000000000..7cee5029a --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListItemViewModel.java @@ -0,0 +1,141 @@ +/* + * 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.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 GameListItemViewModel { + 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 GameListItemViewModel(ToggleGroup toggleGroup, Profile profile, String id) { + this.profile = profile; + this.version = id; + 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(profile.getSelectedVersion().equals(id)); + + 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")); + } + + public ToggleGroup getToggleGroup() { + return toggleGroup; + } + + public Profile getProfile() { + return profile; + } + + public String getVersion() { + 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())); + } + + public void rename() { + Versions.renameVersion(profile, version); + } + + public void remove() { + Versions.deleteVersion(profile, version); + } + + public void export() { + Versions.exportVersion(profile, version); + } + + public void browse() { + Versions.openFolder(profile, version); + } + + public void launch() { + Versions.launch(profile, version); + } + + public void modifyGameSettings() { + Controllers.getVersionPage().load(version, profile); + Controllers.getDecorator().showPage(Controllers.getVersionPage()); + } + + public void generateLaunchScript() { + Versions.generateLaunchScript(profile, version); + } + + public boolean canUpdate() { + return isModpack; + } + + 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/GameListView.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListView.java new file mode 100644 index 000000000..1bca1d9a8 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListView.java @@ -0,0 +1,125 @@ +/* + * 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 com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXSpinner; +import com.jfoenix.effects.JFXDepthManager; +import javafx.beans.binding.Bindings; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.geometry.Insets; +import javafx.scene.Node; +import javafx.scene.control.ScrollPane; +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.wizard.DecoratorPage; +import org.jackhuang.hmcl.util.MappedObservableList; +import org.jackhuang.hmcl.util.i18n.I18n; + +public class GameListView extends BorderPane implements DecoratorPage { + private final StringProperty title = new SimpleStringProperty(I18n.i18n("version.manage")); + + private static Node wrap(Node node) { + StackPane stackPane = new StackPane(); + stackPane.setPadding(new Insets(0, 5, 0, 2)); + stackPane.getChildren().setAll(node); + return stackPane; + } + + public GameListView(GameListViewModel viewModel) { + { + HBox toolbar = new HBox(); + toolbar.getStyleClass().setAll("jfx-tool-bar-second"); + JFXDepthManager.setDepth(toolbar, 1); + toolbar.setPickOnBounds(false); + + JFXButton btnAddNewGame = new JFXButton(); + btnAddNewGame.getStyleClass().add("jfx-tool-bar-button"); + btnAddNewGame.textFillProperty().bind(Theme.foregroundFillBinding()); + btnAddNewGame.setGraphic(wrap(SVG.plus(Theme.foregroundFillBinding(), -1, -1))); + btnAddNewGame.setText(I18n.i18n("install.new_game")); + btnAddNewGame.setOnMouseClicked(e -> viewModel.addNewGame()); + toolbar.getChildren().add(btnAddNewGame); + + JFXButton btnImportModpack = new JFXButton(); + btnImportModpack.getStyleClass().add("jfx-tool-bar-button"); + btnImportModpack.textFillProperty().bind(Theme.foregroundFillBinding()); + btnImportModpack.setGraphic(wrap(SVG.importIcon(Theme.foregroundFillBinding(), -1, -1))); + btnImportModpack.setText(I18n.i18n("install.modpack")); + btnImportModpack.setOnMouseClicked(e -> viewModel.importModpack()); + toolbar.getChildren().add(btnImportModpack); + + JFXButton btnRefresh = new JFXButton(); + btnRefresh.getStyleClass().add("jfx-tool-bar-button"); + btnRefresh.textFillProperty().bind(Theme.foregroundFillBinding()); + btnRefresh.setGraphic(wrap(SVG.refresh(Theme.foregroundFillBinding(), -1, -1))); + btnRefresh.setText(I18n.i18n("button.refresh")); + btnRefresh.setOnMouseClicked(e -> viewModel.refresh()); + toolbar.getChildren().add(btnRefresh); + + JFXButton btnModify = new JFXButton(); + btnModify.getStyleClass().add("jfx-tool-bar-button"); + btnModify.textFillProperty().bind(Theme.foregroundFillBinding()); + btnModify.setGraphic(wrap(SVG.gear(Theme.foregroundFillBinding(), -1, -1))); + btnModify.setText(I18n.i18n("settings.type.global.manage")); + btnModify.setOnMouseClicked(e -> viewModel.modifyGlobalGameSettings()); + toolbar.getChildren().add(btnModify); + + setTop(toolbar); + } + + { + StackPane center = new StackPane(); + + JFXSpinner spinner = new JFXSpinner(); + spinner.getStyleClass().setAll("first-spinner"); + + ScrollPane scrollPane = new ScrollPane(); + scrollPane.setFitToWidth(true); + + VBox gameList = new VBox(); + gameList.maxWidthProperty().bind(scrollPane.widthProperty()); + gameList.setSpacing(10); + gameList.setStyle("-fx-padding: 10 10 10 10;"); + + Bindings.bindContent(gameList.getChildren(), + MappedObservableList.create(viewModel.itemsProperty(), model -> { + GameListItemView view = new GameListItemView(model); + return view; + })); + + scrollPane.setContent(gameList); + + FXUtils.onChangeAndOperate(viewModel.loadingProperty(), + loading -> center.getChildren().setAll(loading ? spinner : scrollPane)); + + setCenter(center); + } + } + + @Override + public StringProperty titleProperty() { + return title; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListViewModel.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListViewModel.java new file mode 100644 index 000000000..c54d64bc7 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListViewModel.java @@ -0,0 +1,113 @@ +/* + * 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 com.jfoenix.concurrency.JFXUtilities; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ListProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.collections.FXCollections; +import javafx.scene.control.ToggleGroup; +import org.jackhuang.hmcl.event.EventBus; +import org.jackhuang.hmcl.event.ProfileChangedEvent; +import org.jackhuang.hmcl.event.RefreshedVersionsEvent; +import org.jackhuang.hmcl.event.RefreshingVersionsEvent; +import org.jackhuang.hmcl.game.HMCLGameRepository; +import org.jackhuang.hmcl.setting.Profile; +import org.jackhuang.hmcl.setting.Settings; +import org.jackhuang.hmcl.ui.Controllers; +import org.jackhuang.hmcl.ui.download.DownloadWizardProvider; +import org.jackhuang.hmcl.util.VersionNumber; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + +public class GameListViewModel { + private final BooleanProperty loading = new SimpleBooleanProperty(true); + private final ListProperty items = new SimpleListProperty<>(FXCollections.observableArrayList()); + + private Profile profile; + private ToggleGroup toggleGroup; + + public GameListViewModel() { + EventBus.EVENT_BUS.channel(RefreshedVersionsEvent.class).register(event -> { + if (event.getSource() == profile.getRepository()) + loadVersions((HMCLGameRepository) event.getSource()); + }); + EventBus.EVENT_BUS.channel(RefreshingVersionsEvent.class).register(event -> { + if (event.getSource() == profile.getRepository()) + JFXUtilities.runInFX(() -> loading.set(true)); + }); + EventBus.EVENT_BUS.channel(ProfileChangedEvent.class).register(event -> { + this.profile = event.getProfile(); + }); + + profile = Settings.instance().getSelectedProfile(); + if (profile.getRepository().isLoaded()) + loadVersions(profile.getRepository()); + else + profile.getRepository().refreshVersionsAsync().start(); + } + + private void loadVersions(HMCLGameRepository repository) { + toggleGroup = new ToggleGroup(); + 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 GameListItemViewModel(toggleGroup, profile, version.getId())) + .collect(Collectors.toList()); + JFXUtilities.runInFX(() -> { + if (profile == repository.getProfile()) { + loading.set(false); + items.setAll(children); + children.forEach(GameListItemViewModel::checkSelection); + } + toggleGroup.selectedToggleProperty().addListener((o, a, toggle) -> { + GameListItemViewModel model = (GameListItemViewModel) toggle.getUserData(); + model.getProfile().setSelectedVersion(model.getVersion()); + }); + }); + } + + public void addNewGame() { + Controllers.getDecorator().startWizard(new DownloadWizardProvider(0), i18n("install.new_game")); + } + + public void importModpack() { + Controllers.getDecorator().startWizard(new DownloadWizardProvider(1), i18n("install.modpack")); + } + + public void refresh() { + profile.getRepository().refreshVersionsAsync().start(); + } + + public void modifyGlobalGameSettings() { + // Controllers.navigate(); + } + + public BooleanProperty loadingProperty() { + return loading; + } + + public ListProperty itemsProperty() { + return items; + } +} diff --git a/HMCL/src/main/resources/assets/css/root.css b/HMCL/src/main/resources/assets/css/root.css index c3e29e931..04ad657a9 100644 --- a/HMCL/src/main/resources/assets/css/root.css +++ b/HMCL/src/main/resources/assets/css/root.css @@ -294,9 +294,39 @@ -jfx-rippler-fill: WHITE; } +.jfx-tool-bar-second { + -fx-padding: 2 2 2 2; + -fx-background-color: -fx-base-check-color; +} + +.jfx-tool-bar-second .jfx-rippler { + -jfx-rippler-fill: WHITE; +} + +.jfx-tool-bar-button { + -fx-toggle-icon4-size: 35px; + -fx-pref-height: -fx-toggle-icon4-size; + -fx-max-height: -fx-toggle-icon4-size; + -fx-min-height: -fx-toggle-icon4-size; + -fx-background-radius: 5px; + -fx-background-color: transparent; + -jfx-toggle-color: white; + -jfx-untoggle-color: transparent; +} + +.jfx-tool-bar-button .icon { + -fx-fill: rgb(204.0, 204.0, 51.0); + -fx-padding: 10.0; +} + +.jfx-tool-bar-button .jfx-rippler { + -jfx-rippler-fill: white; + -jfx-mask-type: CIRCLE; +} + .jfx-decorator-button { -fx-max-width: 35px; - -fx-background-radius: 40px; + -fx-background-radius: 5px; -fx-max-height: 35px; -fx-background-color: transparent; -jfx-toggle-color: rgba(128, 128, 255, 0.2); diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 1709e9db3..2302fd043 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -253,7 +253,7 @@ selector.choose=Choose selector.choose_file=Select a file selector.custom=Custom -settings=Settings +settings=Game Settings settings.advanced=Advanced Settings settings.advanced.dont_check_game_completeness=Don't check game completeness @@ -308,8 +308,9 @@ settings.max_memory=Max Memory/MB settings.physical_memory=Physical Memory Size settings.show_log=Show Logs settings.tabs.installers=Installers -settings.type.global=Global version settings(all shared) settings.type=Version setting type +settings.type.global=Global global settings(all shared) +settings.type.global.manage=Global Game Settings settings.type.special=Specialized version settings(will not affect other versions) update=Update @@ -334,6 +335,7 @@ version.launch_script=Make Launching Script version.launch_script.failed=Unable to make launch script. version.launch_script.save=Save the launch script version.launch_script.success=Finished script creation, %s. +version.manage=Game List version.manage.redownload_assets_index=Redownload Assets Index version.manage.remove=Delete this game version.manage.remove.confirm=Sure to remove game %s? You cannot restore this game again! @@ -344,7 +346,7 @@ version.manage.rename=Rename this game version.manage.rename.message=Please enter the new name version.manage.rename.fail=Failed to rename this game. version.settings=Settings -version.update=Update +version.update=Update modpack wizard.prev=< Prev wizard.failed=Failed diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 1695d20b1..baffe02dc 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -253,7 +253,7 @@ selector.choose=選擇 selector.choose_file=選擇檔案 selector.custom=自訂 -settings=普通設定 +settings=遊戲設定 settings.advanced=進階設定 settings.advanced.dont_check_game_completeness=不檢查遊戲完整性 @@ -308,8 +308,9 @@ settings.max_memory=最大記憶體(MB) settings.physical_memory=實體記憶體大小 settings.show_log=查看記錄 settings.tabs.installers=自動安裝 -settings.type.global=全域版本設定(使用該設定的版本共用一套設定) settings.type=版本設定類型 +settings.type.global=全域版本設定(使用該設定的版本共用一套設定) +settings.type.global.manage=全域遊戲設定 settings.type.special=單獨版本設定(不會影響到其他版本的設定) update=啟動器更新 @@ -334,6 +335,7 @@ version.launch_script=生成啟動腳本 version.launch_script.failed=生成啟動腳本失敗 version.launch_script.save=儲存啟動腳本 version.launch_script.success=啟動腳本已生成完畢:%s +version.manage=遊戲列表 version.manage.redownload_assets_index=重新下載資源設定(assets_index.json) version.manage.remove=刪除該版本 version.manage.remove.confirm=真的要刪除版本 %s 嗎?你將無法找回被刪除的檔案! @@ -344,7 +346,7 @@ version.manage.rename=重新命名該版本 version.manage.rename.message=請輸入新名稱 version.manage.rename.fail=重新命名版本失敗,可能檔案被佔用或者名字有特殊字元 version.settings=遊戲設定 -version.update=更新 +version.update=更新整合包 wizard.prev=< 上一步 wizard.failed=失敗 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 08cec0547..8eee5b0d6 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -253,7 +253,7 @@ selector.choose=选择 selector.choose_file=选择文件 selector.custom=自定义 -settings=普通设置 +settings=游戏设置 settings.advanced=高级设置 settings.advanced.dont_check_game_completeness=不检查游戏完整性 @@ -308,9 +308,10 @@ settings.max_memory=最大内存(MB) settings.physical_memory=物理内存大小 settings.show_log=查看日志 settings.tabs.installers=自动安装 -settings.type.global=全局版本设置(使用该设置的版本共用一套设定) settings.type=版本设置类型 -settings.type.special=单独版本设置(不会影响到其他版本的设定) +settings.type.global=全局版本设置(使用该设置的版本共用一套设定) +settings.type.global.manage=全局游戏设置 +settings.type.special=版本特定设置(不会影响到其他版本的设定) update=启动器更新 update.channel.dev=更新到开发版 @@ -334,6 +335,7 @@ version.launch_script=生成启动脚本 version.launch_script.failed=生成启动脚本失败 version.launch_script.save=保存启动脚本 version.launch_script.success=启动脚本已生成完毕:%s +version.manage=游戏列表 version.manage.redownload_assets_index=重新下载资源配置(assets_index.json) version.manage.remove=删除该版本 version.manage.remove.confirm=真的要删除版本 %s 吗?你将无法找回被删除的文件! @@ -344,7 +346,7 @@ version.manage.rename=重命名该版本 version.manage.rename.message=请输入要改成的名字 version.manage.rename.fail=重命名版本失败,可能文件被占用或者名字有特殊字符 version.settings=游戏设置 -version.update=更新 +version.update=更新整合包 wizard.prev=< 上一步 wizard.failed=失败