diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AdvancedListItem2.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AdvancedListItem2.java new file mode 100644 index 000000000..c09b96ff6 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AdvancedListItem2.java @@ -0,0 +1,92 @@ +/* + * 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; + +import com.jfoenix.controls.JFXButton; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.image.ImageView; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; +import javafx.scene.text.TextAlignment; +import org.jackhuang.hmcl.setting.Theme; + +public class AdvancedListItem2 extends StackPane { + + public AdvancedListItem2(AdvancedListItemViewModel viewModel) { + BorderPane root = new BorderPane(); + root.setPickOnBounds(false); + + HBox left = new HBox(); + left.setAlignment(Pos.CENTER); + left.setMouseTransparent(true); + + StackPane imageViewContainer = new StackPane(); + FXUtils.setLimitWidth(imageViewContainer, 32); + FXUtils.setLimitHeight(imageViewContainer, 32); + + ImageView imageView = new ImageView(); + FXUtils.limitSize(imageView, 32, 32); + imageView.setPreserveRatio(true); + imageView.imageProperty().bind(viewModel.imageProperty()); + imageViewContainer.getChildren().setAll(imageView); + + BorderPane borderPane = new BorderPane(); + borderPane.setPadding(new Insets(0, 0, 0, 10)); + + Label title = new Label(); + title.textProperty().bind(viewModel.titleProperty()); + title.setMaxWidth(90); + title.setStyle("-fx-font-size: 15;"); + title.setTextAlignment(TextAlignment.JUSTIFY); + borderPane.setTop(title); + + if (viewModel.subtitleProperty() != null) { + Label subtitle = new Label(); + subtitle.textProperty().bind(viewModel.subtitleProperty()); + subtitle.setMaxWidth(90); + subtitle.setStyle("-fx-font-size: 10;"); + subtitle.setTextAlignment(TextAlignment.JUSTIFY); + borderPane.setBottom(subtitle); + } else { + title.setWrapText(true); + } + + left.getChildren().setAll(imageViewContainer, borderPane); + root.setLeft(left); + + HBox right = new HBox(); + right.setAlignment(Pos.CENTER); + right.setPickOnBounds(false); + + JFXButton settings = new JFXButton(); + FXUtils.setLimitWidth(settings, 40); + settings.setOnMouseClicked(e -> viewModel.action()); + settings.getStyleClass().setAll("toggle-icon4"); + settings.setGraphic(SVG.gear(Theme.blackFillBinding(), -1, -1)); + right.getChildren().setAll(settings); + root.setRight(right); + + setStyle("-fx-padding: 10 16 10 16;"); + getStyleClass().setAll("transparent"); + setPickOnBounds(false); + getChildren().setAll(root); + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AdvancedListItemViewModel.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AdvancedListItemViewModel.java new file mode 100644 index 000000000..d902c6ae9 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AdvancedListItemViewModel.java @@ -0,0 +1,33 @@ +/* + * 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; + +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.StringProperty; +import javafx.scene.image.Image; + +public abstract class AdvancedListItemViewModel { + + public abstract void action(); + + public abstract ObjectProperty imageProperty(); + + public abstract StringProperty titleProperty(); + + public abstract StringProperty subtitleProperty(); +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameAdvancedListItemViewModel.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameAdvancedListItemViewModel.java new file mode 100644 index 000000000..a65d2e50d --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameAdvancedListItemViewModel.java @@ -0,0 +1,97 @@ +/* + * 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; + +import com.jfoenix.concurrency.JFXUtilities; +import javafx.beans.InvalidationListener; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.beans.value.ChangeListener; +import javafx.scene.image.Image; +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.setting.Profile; +import org.jackhuang.hmcl.setting.Settings; + +import java.io.File; + +public class GameAdvancedListItemViewModel extends AdvancedListItemViewModel { + private final ObjectProperty image = new SimpleObjectProperty<>(); + private final StringProperty title = new SimpleStringProperty(); + private final WeakListenerHelper helper = new WeakListenerHelper(); + + private Profile profile; + private InvalidationListener listener = o -> loadVersion(); + + public GameAdvancedListItemViewModel() { + helper.add(EventBus.EVENT_BUS.channel(ProfileChangedEvent.class).registerWeak(event -> { + JFXUtilities.runInFX(() -> loadProfile(event.getProfile())); + })); + helper.add(EventBus.EVENT_BUS.channel(RefreshedVersionsEvent.class).registerWeak(event -> { + JFXUtilities.runInFX(() -> { + if (profile != null && profile.getRepository() == event.getSource()) + loadVersion(); + }); + })); + loadProfile(Settings.instance().getSelectedProfile()); + } + + private void loadProfile(Profile newProfile) { + if (profile != null) + profile.selectedVersionProperty().removeListener(listener); + profile = newProfile; + profile.selectedVersionProperty().addListener(listener); + loadVersion(); + } + + private void loadVersion() { + Profile profile = this.profile; + if (profile == null || !profile.getRepository().isLoaded()) return; + String version = 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")); + + title.set(version); + } + + @Override + public void action() { + } + + @Override + public ObjectProperty imageProperty() { + return image; + } + + @Override + public StringProperty titleProperty() { + return title; + } + + @Override + public StringProperty subtitleProperty() { + return null; + } +} 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 cf7cbbadd..5db94cebd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java @@ -69,6 +69,7 @@ public final class LeftPaneController { private final VBox profilePane = new VBox(); private final VBox accountPane = new VBox(); private final IconedItem launcherSettingsItem; + private final AdvancedListItem2 gameListItem; private ListProperty accountItems = new SimpleListProperty<>(); private ObjectProperty selectedAccount = new SimpleObjectProperty() { @@ -101,9 +102,11 @@ public final class LeftPaneController { .then(Color.RED) .otherwise(Color.BLACK)); - launcherSettingsItem.prefWidthProperty().bind(leftPane.widthProperty()); + launcherSettingsItem.maxWidthProperty().bind(leftPane.widthProperty()); launcherSettingsItem.setOnMouseClicked(e -> Controllers.navigate(Controllers.getSettingsPage())); + gameListItem = new AdvancedListItem2(new GameAdvancedListItemViewModel()); + leftPane .add(new ClassTitle(i18n("account").toUpperCase(), Lang.apply(new JFXButton(), button -> { button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10)); @@ -112,6 +115,7 @@ public final class LeftPaneController { }))) .add(accountPane) .startCategory(i18n("launcher").toUpperCase()) + .add(gameListItem) .add(launcherSettingsItem) .add(new ClassTitle(i18n("profile.title").toUpperCase(), Lang.apply(new JFXButton(), button -> { button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10));