mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-16 15:26:27 -04:00
Add an entrance to game list page
This commit is contained in:
parent
1566e069ed
commit
ec2b9b19be
@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* Hello Minecraft! Launcher.
|
||||||
|
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||||
|
*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Hello Minecraft! Launcher.
|
||||||
|
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||||
|
*
|
||||||
|
* 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<Image> imageProperty();
|
||||||
|
|
||||||
|
public abstract StringProperty titleProperty();
|
||||||
|
|
||||||
|
public abstract StringProperty subtitleProperty();
|
||||||
|
}
|
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Hello Minecraft! Launcher.
|
||||||
|
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||||
|
*
|
||||||
|
* 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> 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<Image> imageProperty() {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StringProperty titleProperty() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StringProperty subtitleProperty() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -69,6 +69,7 @@ public final class LeftPaneController {
|
|||||||
private final VBox profilePane = new VBox();
|
private final VBox profilePane = new VBox();
|
||||||
private final VBox accountPane = new VBox();
|
private final VBox accountPane = new VBox();
|
||||||
private final IconedItem launcherSettingsItem;
|
private final IconedItem launcherSettingsItem;
|
||||||
|
private final AdvancedListItem2 gameListItem;
|
||||||
|
|
||||||
private ListProperty<RipplerContainer> accountItems = new SimpleListProperty<>();
|
private ListProperty<RipplerContainer> accountItems = new SimpleListProperty<>();
|
||||||
private ObjectProperty<Account> selectedAccount = new SimpleObjectProperty<Account>() {
|
private ObjectProperty<Account> selectedAccount = new SimpleObjectProperty<Account>() {
|
||||||
@ -101,9 +102,11 @@ public final class LeftPaneController {
|
|||||||
.then(Color.RED)
|
.then(Color.RED)
|
||||||
.otherwise(Color.BLACK));
|
.otherwise(Color.BLACK));
|
||||||
|
|
||||||
launcherSettingsItem.prefWidthProperty().bind(leftPane.widthProperty());
|
launcherSettingsItem.maxWidthProperty().bind(leftPane.widthProperty());
|
||||||
launcherSettingsItem.setOnMouseClicked(e -> Controllers.navigate(Controllers.getSettingsPage()));
|
launcherSettingsItem.setOnMouseClicked(e -> Controllers.navigate(Controllers.getSettingsPage()));
|
||||||
|
|
||||||
|
gameListItem = new AdvancedListItem2(new GameAdvancedListItemViewModel());
|
||||||
|
|
||||||
leftPane
|
leftPane
|
||||||
.add(new ClassTitle(i18n("account").toUpperCase(), Lang.apply(new JFXButton(), button -> {
|
.add(new ClassTitle(i18n("account").toUpperCase(), Lang.apply(new JFXButton(), button -> {
|
||||||
button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10));
|
button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10));
|
||||||
@ -112,6 +115,7 @@ public final class LeftPaneController {
|
|||||||
})))
|
})))
|
||||||
.add(accountPane)
|
.add(accountPane)
|
||||||
.startCategory(i18n("launcher").toUpperCase())
|
.startCategory(i18n("launcher").toUpperCase())
|
||||||
|
.add(gameListItem)
|
||||||
.add(launcherSettingsItem)
|
.add(launcherSettingsItem)
|
||||||
.add(new ClassTitle(i18n("profile.title").toUpperCase(), Lang.apply(new JFXButton(), button -> {
|
.add(new ClassTitle(i18n("profile.title").toUpperCase(), Lang.apply(new JFXButton(), button -> {
|
||||||
button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10));
|
button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user