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")
private IntegerProperty logLines = new SimpleIntegerProperty(100);
@SerializedName("titleTransparent")
private BooleanProperty titleTransparent = new SimpleBooleanProperty(false);
@SerializedName("authlibInjectorServers")
private ObservableList<AuthlibInjectorServer> authlibInjectorServers = FXCollections.observableArrayList(server -> new Observable[] { server });
@ -581,4 +584,15 @@ public final class Config implements Cloneable, Observable {
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);
VBox left = new VBox();
left.setMouseTransparent(true);
Label titleLabel = new Label();
titleLabel.setMouseTransparent(true);
titleLabel.textProperty().bind(title);
Label subtitleLabel = new Label();
subtitleLabel.setMouseTransparent(true);
subtitleLabel.textProperty().bind(subtitle);
pane.setLeft(left);
BorderPane.setAlignment(left, Pos.CENTER_LEFT);
left.setAlignment(Pos.CENTER_LEFT);
JFXToggleButton toggleButton = new JFXToggleButton();
pane.setRight(toggleButton);

View File

@ -52,6 +52,7 @@ public class Decorator extends Control {
private final BooleanProperty canBack = new SimpleBooleanProperty(false);
private final BooleanProperty canClose = new SimpleBooleanProperty(false);
private final BooleanProperty showCloseAsHome = new SimpleBooleanProperty(false);
private final BooleanProperty titleTransparent = new SimpleBooleanProperty(false);
private final Stage primaryStage;
private Navigation.NavigationDirection navigationDirection = Navigation.NavigationDirection.START;
private StackPane drawerWrapper;
@ -204,6 +205,18 @@ public class Decorator extends Control {
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() {
return onBackNavButtonAction;
}

View File

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

View File

@ -106,19 +106,17 @@ public class DecoratorSkin extends SkinBase<Decorator> {
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();
container.backgroundProperty().bind(skinnable.contentBackgroundProperty());
FXUtils.setOverflowHidden(container);
// animation layer at bottom
HBox drawerPane = new HBox();
{
HBox layer = new HBox();
leftPane = new StackPane();
leftPane.setPrefWidth(0);
leftPane.getStyleClass().add("jfx-decorator-drawer");
layer.getChildren().setAll(leftPane);
container.getChildren().add(layer);
drawerPane.getChildren().setAll(leftPane);
}
// content layer at middle
@ -153,7 +151,26 @@ public class DecoratorSkin extends SkinBase<Decorator> {
titleContainer = new StackPane();
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);
BorderPane titleBar = new BorderPane();

View File

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

View File

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

View File

@ -59,10 +59,10 @@ public class PersonalizationPage extends StackPane {
scrollPane.setFitToWidth(true);
getChildren().setAll(scrollPane);
ComponentList themeList = new ComponentList();
{
ComponentList themeList = new ComponentList();
BorderPane themePane = new BorderPane();
themeList.getContent().setAll(themePane);
themeList.getContent().add(themePane);
Label left = new Label(i18n("settings.launcher.theme"));
BorderPane.setAlignment(left, Pos.CENTER_LEFT);
@ -81,9 +81,14 @@ public class PersonalizationPage extends StackPane {
});
themeColorPickerContainer.getChildren().setAll(picker);
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();

View File

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

View File

@ -168,7 +168,7 @@ public class GameListPage extends ListPageBase<GameListItem> implements Decorato
.add(installModpackItem)
.add(refreshItem)
.add(globalManageItem);
FXUtils.setLimitHeight(bottomLeftCornerList, 40 * 3 + 12 * 2);
FXUtils.setLimitHeight(bottomLeftCornerList, 40 * 4 + 12 * 2);
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.Validator;
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.util.Logging;
import org.jackhuang.hmcl.util.StringUtils;
@ -64,10 +63,8 @@ public final class Versions {
}
public static void addNewGame() {
Profile profile = Profiles.getSelectedProfile();
if (profile.getRepository().isLoaded()) {
Controllers.getDecorator().startWizard(new VanillaInstallWizardProvider(profile), i18n("install.new_game"));
}
Controllers.getDownloadPage().showGameDownloads();
Controllers.navigate(Controllers.getDownloadPage());
}
public static void importModpack() {
@ -255,9 +252,6 @@ public final class Versions {
public static void modifyGlobalSettings(Profile profile) {
Controllers.getSettingsPage().showGameSettings(profile);
Controllers.navigate(Controllers.getSettingsPage());
// VersionSettingsPage page = new VersionSettingsPage();
// page.loadVersion(profile, null);
// Controllers.navigate(page);
}
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.relay=Relay Mode
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.motd=HMCL Multiplayer Session - %s
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.prompt=Metaspace on Java 8 and above, MB
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.launcher_visibility.close=Close 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.username=Account
settings.launcher.theme=Theme
settings.launcher.title_transparent=Title transparent
settings.launcher.version_list_source=Version List Source
settings.memory=Game Memory
@ -853,6 +854,7 @@ settings.physical_memory=Physical Memory Size
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.tabs.installers=Installers
settings.take_effect_after_restart=Take effect after restart
settings.type=Version setting type
settings.type.global=Global game settings (all settings shared among games)
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.username=帳戶
settings.launcher.theme=主題
settings.launcher.title_transparent=標題欄透明
settings.launcher.version_list_source=版本列表來源
settings.memory=遊戲記憶體
@ -852,6 +853,7 @@ settings.physical_memory=實體記憶體大小
settings.show_log=查看記錄
settings.skin=現已支持離線帳戶更換皮膚,你可以到帳戶頁面更改離線帳戶的皮膚和披風(多人遊戲下其他玩家無法看到你的皮膚)
settings.tabs.installers=自動安裝
settings.take_effect_after_restart=重啟後生效
settings.type=版本設定類型
settings.type.global=全域版本設定(使用該設定的版本共用一套設定)
settings.type.global.manage=全域遊戲設定

View File

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