feat(ui): title opacity setting.

This commit is contained in:
huanghongxun
2021-10-06 15:52:31 +08:00
parent 3a2f5a77ef
commit 1cd4470187
14 changed files with 88 additions and 37 deletions

View File

@@ -158,6 +158,9 @@ public final class Config implements Cloneable, Observable {
@SerializedName("logLines") @SerializedName("logLines")
private IntegerProperty logLines = new SimpleIntegerProperty(100); private IntegerProperty logLines = new SimpleIntegerProperty(100);
@SerializedName("titleTransparent")
private BooleanProperty titleTransparent = new SimpleBooleanProperty(false);
@SerializedName("authlibInjectorServers") @SerializedName("authlibInjectorServers")
private ObservableList<AuthlibInjectorServer> authlibInjectorServers = FXCollections.observableArrayList(server -> new Observable[] { server }); private ObservableList<AuthlibInjectorServer> authlibInjectorServers = FXCollections.observableArrayList(server -> new Observable[] { server });
@@ -581,4 +584,15 @@ public final class Config implements Cloneable, Observable {
return preferredLoginType; return preferredLoginType;
} }
public boolean isTitleTransparent() {
return titleTransparent.get();
}
public BooleanProperty titleTransparentProperty() {
return titleTransparent;
}
public void setTitleTransparent(boolean titleTransparent) {
this.titleTransparent.set(titleTransparent);
}
} }

View File

@@ -45,14 +45,14 @@ public class OptionToggleButton extends StackPane {
getChildren().setAll(container); getChildren().setAll(container);
VBox left = new VBox(); VBox left = new VBox();
left.setMouseTransparent(true);
Label titleLabel = new Label(); Label titleLabel = new Label();
titleLabel.setMouseTransparent(true);
titleLabel.textProperty().bind(title); titleLabel.textProperty().bind(title);
Label subtitleLabel = new Label(); Label subtitleLabel = new Label();
subtitleLabel.setMouseTransparent(true); subtitleLabel.setMouseTransparent(true);
subtitleLabel.textProperty().bind(subtitle); subtitleLabel.textProperty().bind(subtitle);
pane.setLeft(left); pane.setLeft(left);
BorderPane.setAlignment(left, Pos.CENTER_LEFT); left.setAlignment(Pos.CENTER_LEFT);
JFXToggleButton toggleButton = new JFXToggleButton(); JFXToggleButton toggleButton = new JFXToggleButton();
pane.setRight(toggleButton); pane.setRight(toggleButton);

View File

@@ -52,6 +52,7 @@ public class Decorator extends Control {
private final BooleanProperty canBack = new SimpleBooleanProperty(false); private final BooleanProperty canBack = new SimpleBooleanProperty(false);
private final BooleanProperty canClose = new SimpleBooleanProperty(false); private final BooleanProperty canClose = new SimpleBooleanProperty(false);
private final BooleanProperty showCloseAsHome = new SimpleBooleanProperty(false); private final BooleanProperty showCloseAsHome = new SimpleBooleanProperty(false);
private final BooleanProperty titleTransparent = new SimpleBooleanProperty(false);
private final Stage primaryStage; private final Stage primaryStage;
private Navigation.NavigationDirection navigationDirection = Navigation.NavigationDirection.START; private Navigation.NavigationDirection navigationDirection = Navigation.NavigationDirection.START;
private StackPane drawerWrapper; private StackPane drawerWrapper;
@@ -204,6 +205,18 @@ public class Decorator extends Control {
this.dragging.set(dragging); this.dragging.set(dragging);
} }
public boolean isTitleTransparent() {
return titleTransparent.get();
}
public BooleanProperty titleTransparentProperty() {
return titleTransparent;
}
public void setTitleTransparent(boolean titleTransparent) {
this.titleTransparent.set(titleTransparent);
}
public ObjectProperty<EventHandler<ActionEvent>> onBackNavButtonActionProperty() { public ObjectProperty<EventHandler<ActionEvent>> onBackNavButtonActionProperty() {
return onBackNavButtonAction; return onBackNavButtonAction;
} }

View File

@@ -74,6 +74,7 @@ public class DecoratorController {
public DecoratorController(Stage stage, Node mainPage) { public DecoratorController(Stage stage, Node mainPage) {
decorator = new Decorator(stage); decorator = new Decorator(stage);
decorator.setOnCloseButtonAction(Launcher::stopApplication); decorator.setOnCloseButtonAction(Launcher::stopApplication);
decorator.titleTransparentProperty().bind(config().titleTransparentProperty());
navigator = new Navigator(); navigator = new Navigator();
navigator.setOnNavigated(this::onNavigated); navigator.setOnNavigated(this::onNavigated);

View File

@@ -106,19 +106,17 @@ public class DecoratorSkin extends SkinBase<Decorator> {
parent.getChildren().add(wrapper); parent.getChildren().add(wrapper);
// center node with a animation layer at bottom, a container layer at middle and a "welcome" layer at top. // center node with an animation layer at bottom, a container layer at middle and a "welcome" layer at top.
StackPane container = new StackPane(); StackPane container = new StackPane();
container.backgroundProperty().bind(skinnable.contentBackgroundProperty());
FXUtils.setOverflowHidden(container); FXUtils.setOverflowHidden(container);
// animation layer at bottom // animation layer at bottom
HBox drawerPane = new HBox();
{ {
HBox layer = new HBox();
leftPane = new StackPane(); leftPane = new StackPane();
leftPane.setPrefWidth(0); leftPane.setPrefWidth(0);
leftPane.getStyleClass().add("jfx-decorator-drawer"); leftPane.getStyleClass().add("jfx-decorator-drawer");
layer.getChildren().setAll(leftPane); drawerPane.getChildren().setAll(leftPane);
container.getChildren().add(layer);
} }
// content layer at middle // content layer at middle
@@ -153,7 +151,26 @@ public class DecoratorSkin extends SkinBase<Decorator> {
titleContainer = new StackPane(); titleContainer = new StackPane();
titleContainer.setPickOnBounds(false); titleContainer.setPickOnBounds(false);
titleContainer.getStyleClass().addAll("jfx-tool-bar", "background"); titleContainer.getStyleClass().addAll("jfx-tool-bar");
FXUtils.onChangeAndOperate(skinnable.titleTransparentProperty(), titleTransparent -> {
if (titleTransparent) {
wrapper.backgroundProperty().bind(skinnable.contentBackgroundProperty());
container.backgroundProperty().unbind();
container.setBackground(null);
titleContainer.getStyleClass().remove("background");
container.getChildren().remove(drawerPane);
wrapper.getChildren().add(0, drawerPane);
} else {
container.backgroundProperty().bind(skinnable.contentBackgroundProperty());
wrapper.backgroundProperty().unbind();
wrapper.setBackground(null);
titleContainer.getStyleClass().add("background");
wrapper.getChildren().remove(drawerPane);
container.getChildren().add(0, drawerPane);
}
});
control.capableDraggingWindow(titleContainer); control.capableDraggingWindow(titleContainer);
BorderPane titleBar = new BorderPane(); BorderPane titleBar = new BorderPane();

View File

@@ -99,7 +99,7 @@ public class DownloadPage extends BorderPane implements DecoratorPage {
Profiles.registerVersionsListener(this::loadVersions); Profiles.registerVersionsListener(this::loadVersions);
tab.getSelectionModel().select(newGameTab); tab.select(newGameTab);
FXUtils.onChangeAndOperate(tab.getSelectionModel().selectedItemProperty(), newValue -> { FXUtils.onChangeAndOperate(tab.getSelectionModel().selectedItemProperty(), newValue -> {
if (newValue.initializeIfNeeded()) { if (newValue.initializeIfNeeded()) {
if (newValue.getNode() instanceof VersionPage.VersionLoadable) { if (newValue.getNode() instanceof VersionPage.VersionLoadable) {
@@ -115,37 +115,37 @@ public class DownloadPage extends BorderPane implements DecoratorPage {
item.setTitle(i18n("game")); item.setTitle(i18n("game"));
item.setLeftGraphic(wrap(SVG::gamepad)); item.setLeftGraphic(wrap(SVG::gamepad));
item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(newGameTab)); item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(newGameTab));
item.setOnAction(e -> tab.getSelectionModel().select(newGameTab)); item.setOnAction(e -> tab.select(newGameTab));
}) })
.addNavigationDrawerItem(item -> { .addNavigationDrawerItem(item -> {
item.setTitle(i18n("mods")); item.setTitle(i18n("mods"));
item.setLeftGraphic(wrap(SVG::puzzle)); item.setLeftGraphic(wrap(SVG::puzzle));
item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(modTab)); item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(modTab));
item.setOnAction(e -> tab.getSelectionModel().select(modTab)); item.setOnAction(e -> tab.select(modTab));
}) })
.addNavigationDrawerItem(settingsItem -> { .addNavigationDrawerItem(settingsItem -> {
settingsItem.setTitle(i18n("modpack")); settingsItem.setTitle(i18n("modpack"));
settingsItem.setLeftGraphic(wrap(SVG::pack)); settingsItem.setLeftGraphic(wrap(SVG::pack));
settingsItem.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(modpackTab)); settingsItem.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(modpackTab));
settingsItem.setOnAction(e -> tab.getSelectionModel().select(modpackTab)); settingsItem.setOnAction(e -> tab.select(modpackTab));
}) })
.addNavigationDrawerItem(item -> { .addNavigationDrawerItem(item -> {
item.setTitle(i18n("resourcepack")); item.setTitle(i18n("resourcepack"));
item.setLeftGraphic(wrap(SVG::textureBox)); item.setLeftGraphic(wrap(SVG::textureBox));
item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(resourcePackTab)); item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(resourcePackTab));
item.setOnAction(e -> tab.getSelectionModel().select(resourcePackTab)); item.setOnAction(e -> tab.select(resourcePackTab));
}) })
// .addNavigationDrawerItem(item -> { // .addNavigationDrawerItem(item -> {
// item.setTitle(i18n("download.curseforge.customization")); // item.setTitle(i18n("download.curseforge.customization"));
// item.setLeftGraphic(wrap(SVG::script)); // item.setLeftGraphic(wrap(SVG::script));
// item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(customizationTab)); // item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(customizationTab));
// item.setOnAction(e -> tab.getSelectionModel().select(customizationTab)); // item.setOnAction(e -> tab.select(customizationTab));
// }) // })
.addNavigationDrawerItem(item -> { .addNavigationDrawerItem(item -> {
item.setTitle(i18n("world")); item.setTitle(i18n("world"));
item.setLeftGraphic(wrap(SVG::earth)); item.setLeftGraphic(wrap(SVG::earth));
item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(worldTab)); item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(worldTab));
item.setOnAction(e -> tab.getSelectionModel().select(worldTab)); item.setOnAction(e -> tab.select(worldTab));
}); });
FXUtils.setLimitWidth(sideBar, 200); FXUtils.setLimitWidth(sideBar, 200);
setLeft(sideBar); setLeft(sideBar);
@@ -212,6 +212,10 @@ public class DownloadPage extends BorderPane implements DecoratorPage {
return state.getReadOnlyProperty(); return state.getReadOnlyProperty();
} }
public void showGameDownloads() {
tab.select(newGameTab);
}
private class DownloadNavigator implements Navigation { private class DownloadNavigator implements Navigation {
private final Map<String, Object> settings = new HashMap<>(); private final Map<String, Object> settings = new HashMap<>();

View File

@@ -147,9 +147,10 @@ public class FeedbackPage extends VBox implements PageAware {
if (empty) return; if (empty) return;
content.setTitle(feedback.getTitle()); content.setTitle(feedback.getTitle());
content.setSubtitle(feedback.getAuthor()); content.setSubtitle(feedback.getAuthor());
content.getTags().add("#" + feedback.getId()); content.getTags().setAll(
content.getTags().add(i18n("feedback.state." + feedback.getState().name().toLowerCase(Locale.US))); "#" + feedback.getId(),
content.getTags().add(i18n("feedback.type." + feedback.getType().name().toLowerCase(Locale.US))); i18n("feedback.state." + feedback.getState().name().toLowerCase(Locale.US)),
i18n("feedback.type." + feedback.getType().name().toLowerCase(Locale.US)));
} }
}); });
listView.setOnMouseClicked(e -> { listView.setOnMouseClicked(e -> {

View File

@@ -59,10 +59,10 @@ public class PersonalizationPage extends StackPane {
scrollPane.setFitToWidth(true); scrollPane.setFitToWidth(true);
getChildren().setAll(scrollPane); getChildren().setAll(scrollPane);
ComponentList themeList = new ComponentList();
{ {
ComponentList themeList = new ComponentList();
BorderPane themePane = new BorderPane(); BorderPane themePane = new BorderPane();
themeList.getContent().setAll(themePane); themeList.getContent().add(themePane);
Label left = new Label(i18n("settings.launcher.theme")); Label left = new Label(i18n("settings.launcher.theme"));
BorderPane.setAlignment(left, Pos.CENTER_LEFT); BorderPane.setAlignment(left, Pos.CENTER_LEFT);
@@ -81,9 +81,14 @@ public class PersonalizationPage extends StackPane {
}); });
themeColorPickerContainer.getChildren().setAll(picker); themeColorPickerContainer.getChildren().setAll(picker);
Platform.runLater(() -> JFXDepthManager.setDepth(picker, 0)); Platform.runLater(() -> JFXDepthManager.setDepth(picker, 0));
content.getChildren().addAll(ComponentList.createComponentListTitle(i18n("settings.launcher.appearance")), themeList);
} }
{
OptionToggleButton titleTransparentButton = new OptionToggleButton();
themeList.getContent().add(titleTransparentButton);
titleTransparentButton.selectedProperty().bindBidirectional(config().titleTransparentProperty());
titleTransparentButton.setTitle(i18n("settings.launcher.title_transparent"));
}
content.getChildren().addAll(ComponentList.createComponentListTitle(i18n("settings.launcher.appearance")), themeList);
{ {
ComponentList componentList = new ComponentList(); ComponentList componentList = new ComponentList();

View File

@@ -149,9 +149,6 @@ public class MultiplayerPageSkin extends SkinBase<MultiplayerPage> {
scrollPane.setFitToHeight(true); scrollPane.setFitToHeight(true);
root.setCenter(scrollPane); root.setCenter(scrollPane);
HintPane hint = new HintPane(MessageDialogPane.MessageType.INFO);
hint.setText(i18n("multiplayer.hint"));
ComponentList roomPane = new ComponentList(); ComponentList roomPane = new ComponentList();
{ {
TransitionPane transitionPane = new TransitionPane(); TransitionPane transitionPane = new TransitionPane();
@@ -290,7 +287,6 @@ public class MultiplayerPageSkin extends SkinBase<MultiplayerPage> {
} }
content.getChildren().setAll( content.getChildren().setAll(
hint,
ComponentList.createComponentListTitle(i18n("multiplayer.session")), ComponentList.createComponentListTitle(i18n("multiplayer.session")),
roomPane, roomPane,
ComponentList.createComponentListTitle(i18n("multiplayer.nat")), ComponentList.createComponentListTitle(i18n("multiplayer.nat")),

View File

@@ -168,7 +168,7 @@ public class GameListPage extends ListPageBase<GameListItem> implements Decorato
.add(installModpackItem) .add(installModpackItem)
.add(refreshItem) .add(refreshItem)
.add(globalManageItem); .add(globalManageItem);
FXUtils.setLimitHeight(bottomLeftCornerList, 40 * 3 + 12 * 2); FXUtils.setLimitHeight(bottomLeftCornerList, 40 * 4 + 12 * 2);
left.setBottom(bottomLeftCornerList); left.setBottom(bottomLeftCornerList);
} }
} }

View File

@@ -41,7 +41,6 @@ import org.jackhuang.hmcl.ui.construct.MessageDialogPane;
import org.jackhuang.hmcl.ui.construct.PromptDialogPane; import org.jackhuang.hmcl.ui.construct.PromptDialogPane;
import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.ui.construct.Validator;
import org.jackhuang.hmcl.ui.download.ModpackInstallWizardProvider; import org.jackhuang.hmcl.ui.download.ModpackInstallWizardProvider;
import org.jackhuang.hmcl.ui.download.VanillaInstallWizardProvider;
import org.jackhuang.hmcl.ui.export.ExportWizardProvider; import org.jackhuang.hmcl.ui.export.ExportWizardProvider;
import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.Logging;
import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.StringUtils;
@@ -64,10 +63,8 @@ public final class Versions {
} }
public static void addNewGame() { public static void addNewGame() {
Profile profile = Profiles.getSelectedProfile(); Controllers.getDownloadPage().showGameDownloads();
if (profile.getRepository().isLoaded()) { Controllers.navigate(Controllers.getDownloadPage());
Controllers.getDecorator().startWizard(new VanillaInstallWizardProvider(profile), i18n("install.new_game"));
}
} }
public static void importModpack() { public static void importModpack() {
@@ -255,9 +252,6 @@ public final class Versions {
public static void modifyGlobalSettings(Profile profile) { public static void modifyGlobalSettings(Profile profile) {
Controllers.getSettingsPage().showGameSettings(profile); Controllers.getSettingsPage().showGameSettings(profile);
Controllers.navigate(Controllers.getSettingsPage()); Controllers.navigate(Controllers.getSettingsPage());
// VersionSettingsPage page = new VersionSettingsPage();
// page.loadVersion(profile, null);
// Controllers.navigate(page);
} }
public static void modifyGameSettings(Profile profile, String version) { public static void modifyGameSettings(Profile profile, String version) {

View File

@@ -636,7 +636,7 @@ multiplayer.powered_by=Multiplayer service is provided by <a href="https://noin.
multiplayer.report=Report multiplayer.report=Report
multiplayer.relay=Relay Mode multiplayer.relay=Relay Mode
multiplayer.relay.hint=For users who has a static token, and whose tested NAT type is bad-symmetric multiplayer.relay.hint=For users who has a static token, and whose tested NAT type is bad-symmetric
multiplayer.session=Room multiplayer.session=Session
multiplayer.session.name.format=%1$s's Room multiplayer.session.name.format=%1$s's Room
multiplayer.session.name.motd=HMCL Multiplayer Session - %s multiplayer.session.name.motd=HMCL Multiplayer Session - %s
multiplayer.session.close=Close Room multiplayer.session.close=Close Room
@@ -761,7 +761,7 @@ settings.advanced.game_dir.independent=Independent (.minecraft/versions/<version
settings.advanced.java_permanent_generation_space=PermGen Space/MB settings.advanced.java_permanent_generation_space=PermGen Space/MB
settings.advanced.java_permanent_generation_space.prompt=Metaspace on Java 8 and above, MB settings.advanced.java_permanent_generation_space.prompt=Metaspace on Java 8 and above, MB
settings.advanced.jvm=Java Virtual Machine Settings settings.advanced.jvm=Java Virtual Machine Settings
settings.advanced.jvm_args=Java VM Arguments (overriding defaults) settings.advanced.jvm_args=Java VM Arguments
settings.advanced.jvm_args.prompt=Fill in here to override the default settings settings.advanced.jvm_args.prompt=Fill in here to override the default settings
settings.advanced.launcher_visibility.close=Close the launcher when the game launched. settings.advanced.launcher_visibility.close=Close the launcher when the game launched.
settings.advanced.launcher_visibility.hide=Hide the launcher when the game launched. settings.advanced.launcher_visibility.hide=Hide the launcher when the game launched.
@@ -839,6 +839,7 @@ settings.launcher.proxy.port=Port
settings.launcher.proxy.socks=Socks settings.launcher.proxy.socks=Socks
settings.launcher.proxy.username=Account settings.launcher.proxy.username=Account
settings.launcher.theme=Theme settings.launcher.theme=Theme
settings.launcher.title_transparent=Title transparent
settings.launcher.version_list_source=Version List Source settings.launcher.version_list_source=Version List Source
settings.memory=Game Memory settings.memory=Game Memory
@@ -853,6 +854,7 @@ settings.physical_memory=Physical Memory Size
settings.show_log=Show Logs settings.show_log=Show Logs
settings.skin=Now changing skin of offline account is supported! Go to account page and change your skin now! settings.skin=Now changing skin of offline account is supported! Go to account page and change your skin now!
settings.tabs.installers=Installers settings.tabs.installers=Installers
settings.take_effect_after_restart=Take effect after restart
settings.type=Version setting type settings.type=Version setting type
settings.type.global=Global game settings (all settings shared among games) settings.type.global=Global game settings (all settings shared among games)
settings.type.global.manage=Global Game Settings settings.type.global.manage=Global Game Settings

View File

@@ -838,6 +838,7 @@ settings.launcher.proxy.port=連線埠
settings.launcher.proxy.socks=Socks settings.launcher.proxy.socks=Socks
settings.launcher.proxy.username=帳戶 settings.launcher.proxy.username=帳戶
settings.launcher.theme=主題 settings.launcher.theme=主題
settings.launcher.title_transparent=標題欄透明
settings.launcher.version_list_source=版本列表來源 settings.launcher.version_list_source=版本列表來源
settings.memory=遊戲記憶體 settings.memory=遊戲記憶體
@@ -852,6 +853,7 @@ settings.physical_memory=實體記憶體大小
settings.show_log=查看記錄 settings.show_log=查看記錄
settings.skin=現已支持離線帳戶更換皮膚,你可以到帳戶頁面更改離線帳戶的皮膚和披風(多人遊戲下其他玩家無法看到你的皮膚) settings.skin=現已支持離線帳戶更換皮膚,你可以到帳戶頁面更改離線帳戶的皮膚和披風(多人遊戲下其他玩家無法看到你的皮膚)
settings.tabs.installers=自動安裝 settings.tabs.installers=自動安裝
settings.take_effect_after_restart=重啟後生效
settings.type=版本設定類型 settings.type=版本設定類型
settings.type.global=全域版本設定(使用該設定的版本共用一套設定) settings.type.global=全域版本設定(使用該設定的版本共用一套設定)
settings.type.global.manage=全域遊戲設定 settings.type.global.manage=全域遊戲設定

View File

@@ -838,6 +838,7 @@ settings.launcher.proxy.port=端口
settings.launcher.proxy.socks=Socks settings.launcher.proxy.socks=Socks
settings.launcher.proxy.username=帐户 settings.launcher.proxy.username=帐户
settings.launcher.theme=主题 settings.launcher.theme=主题
settings.launcher.title_transparent=标题栏透明
settings.launcher.version_list_source=版本列表源 settings.launcher.version_list_source=版本列表源
settings.memory=游戏内存 settings.memory=游戏内存
@@ -852,6 +853,7 @@ settings.physical_memory=物理内存大小
settings.show_log=查看日志 settings.show_log=查看日志
settings.skin=现已支持离线账户更换皮肤,你可以到账户页面更改离线账户的皮肤和披风(多人游戏下其他玩家无法看到你的皮肤) settings.skin=现已支持离线账户更换皮肤,你可以到账户页面更改离线账户的皮肤和披风(多人游戏下其他玩家无法看到你的皮肤)
settings.tabs.installers=自动安装 settings.tabs.installers=自动安装
settings.take_effect_after_restart=重启后生效
settings.type=版本设置类型 settings.type=版本设置类型
settings.type.global=全局版本设置(使用该设置的版本共用一套设定) settings.type.global=全局版本设置(使用该设置的版本共用一套设定)
settings.type.global.manage=全局游戏设置 settings.type.global.manage=全局游戏设置