mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-02-05 16:44:47 +08:00
feat(ui): title opacity setting.
This commit is contained in:
parent
3a2f5a77ef
commit
1cd4470187
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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<>();
|
||||
|
||||
|
@ -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 -> {
|
||||
|
@ -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();
|
||||
|
@ -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")),
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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=全域遊戲設定
|
||||
|
@ -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=全局游戏设置
|
||||
|
Loading…
Reference in New Issue
Block a user