From cabba821184b8151f7f39434b271223f722e08da Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sat, 4 Sep 2021 01:26:05 +0800 Subject: [PATCH] feat: move custom commands settings to individual section. --- .../hmcl/ui/construct/ComponentList.java | 1 - .../hmcl/ui/versions/VersionSettingsPage.java | 139 ++++++++++++------ .../resources/assets/lang/I18N.properties | 10 +- .../resources/assets/lang/I18N_zh.properties | 29 +++- .../assets/lang/I18N_zh_CN.properties | 21 ++- 5 files changed, 140 insertions(+), 60 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ComponentList.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ComponentList.java index eba0250c9..5e6b93f66 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ComponentList.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ComponentList.java @@ -168,7 +168,6 @@ public class ComponentList extends Control { node.setPadding(new Insets(8, 0, 0, 0)); { Label advanced = new Label(title); - advanced.setStyle("-fx-text-fill: #616161"); node.getChildren().setAll(advanced); } return node; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java index 265180a7a..cad9395fb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java @@ -22,9 +22,9 @@ import javafx.application.Platform; import javafx.beans.InvalidationListener; import javafx.beans.binding.Bindings; import javafx.beans.property.*; +import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.geometry.Pos; -import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.image.Image; @@ -82,7 +82,6 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag private final JFXTextField txtWrapper; private final JFXTextField txtPrecallingCommand; private final JFXTextField txtServerIP; - private final ComponentList advancedSettingsPane; private final ComponentList componentList; private final ComponentList iconPickerItemWrapper; private final JFXComboBox cboLauncherVisibility; @@ -192,7 +191,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag JFXSlider slider = new JFXSlider(0, 1, 0); HBox.setMargin(slider, new Insets(0, 0, 0, 8)); HBox.setHgrow(slider, Priority.ALWAYS); - slider.setValueFactory(self -> Bindings.createStringBinding(() -> (int)(self.getValue() * 100) + "%", self.valueProperty())); + slider.setValueFactory(self -> Bindings.createStringBinding(() -> (int) (self.getValue() * 100) + "%", self.valueProperty())); AtomicBoolean changedByTextField = new AtomicBoolean(false); FXUtils.onChangeAndOperate(maxMemoryProperty, maxMemory -> { changedByTextField.set(true); @@ -201,7 +200,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag }); slider.valueProperty().addListener((value, oldVal, newVal) -> { if (changedByTextField.get()) return; - maxMemoryProperty.set((int)(value.getValue().doubleValue() * OperatingSystem.TOTAL_MEMORY)); + maxMemoryProperty.set((int) (value.getValue().doubleValue() * OperatingSystem.TOTAL_MEMORY)); }); JFXTextField txtMaxMemory = new JFXTextField(); @@ -231,7 +230,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag allocateMemory.maxWidthProperty().bind(Bindings.createDoubleBinding(() -> progressBarPane.getWidth() * Math.min(1.0, - (double)(HMCLGameRepository.getAllocatedMemory(maxMemoryProperty.get() * 1024L * 1024L, memoryStatusProperty.get().getAvailable(), chkAutoAllocate.isSelected()) + (double) (HMCLGameRepository.getAllocatedMemory(maxMemoryProperty.get() * 1024L * 1024L, memoryStatusProperty.get().getAvailable(), chkAutoAllocate.isSelected()) + memoryStatusProperty.get().getUsed()) / memoryStatusProperty.get().getTotal()), progressBarPane.widthProperty(), maxMemoryProperty, memoryStatusProperty, chkAutoAllocate.selectedProperty())); @@ -331,14 +330,6 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag FXUtils.setLimitHeight(chkShowLogs, 20); } - componentList.getContent().setAll(javaItem, gameDirItem, maxMemoryPane, launcherVisibilityPane, dimensionPane, showLogsPane); - } - - Node advancedHintPane = ComponentList.createComponentListTitle(i18n("settings.advanced")); - - advancedSettingsPane = new ComponentList(); - advancedSettingsPane.setDepth(1); - { BorderPane processPriorityPane = new BorderPane(); { Label label = new Label(i18n("settings.advanced.process_priority")); @@ -351,44 +342,99 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag FXUtils.setLimitWidth(cboProcessPriority, 300); } - txtJVMArgs = new JFXTextField(); - txtJVMArgs.setLabelFloat(true); - txtJVMArgs.setPromptText(i18n("settings.advanced.jvm_args")); - txtJVMArgs.getStyleClass().add("fit-width"); - StackPane.setMargin(txtJVMArgs, new Insets(0, 0, 8, 0)); + GridPane serverPane = new GridPane(); + { + ColumnConstraints title = new ColumnConstraints(); + ColumnConstraints value = new ColumnConstraints(); + value.setFillWidth(true); + value.setHgrow(Priority.ALWAYS); + value.setHalignment(HPos.RIGHT); + serverPane.setHgap(16); + serverPane.setVgap(8); + serverPane.getColumnConstraints().setAll(title, value); + + txtServerIP = new JFXTextField(); + txtServerIP.setLabelFloat(true); + txtServerIP.setPromptText(i18n("settings.advanced.server_ip.prompt")); + txtServerIP.getStyleClass().add("fit-width"); + FXUtils.setLimitWidth(txtServerIP, 300); + serverPane.addRow(0, new Label(i18n("settings.advanced.server_ip")), txtServerIP); + } + + componentList.getContent().setAll(javaItem, gameDirItem, maxMemoryPane, launcherVisibilityPane, dimensionPane, showLogsPane, processPriorityPane, serverPane); + } + + HBox advancedHintPane = new HBox(); + advancedHintPane.setAlignment(Pos.CENTER); + advancedHintPane.setPadding(new Insets(16, 0, 8, 0)); + { + Label advanced = new Label(i18n("settings.advanced")); + advanced.setStyle("-fx-font-size: 12px;"); + advancedHintPane.getChildren().setAll(advanced); + } + + ComponentList customCommandsPane = new ComponentList(); + customCommandsPane.disableProperty().bind(chkEnableSpecificSettings.selectedProperty().not()); + { + GridPane pane = new GridPane(); + ColumnConstraints title = new ColumnConstraints(); + ColumnConstraints value = new ColumnConstraints(); + value.setFillWidth(true); + value.setHgrow(Priority.ALWAYS); + pane.setHgap(16); + pane.setVgap(8); + pane.getColumnConstraints().setAll(title, value); txtGameArgs = new JFXTextField(); txtGameArgs.setLabelFloat(true); - txtGameArgs.setPromptText(i18n("settings.advanced.minecraft_arguments")); + txtGameArgs.setPromptText(i18n("settings.advanced.minecraft_arguments.prompt")); txtGameArgs.getStyleClass().add("fit-width"); - StackPane.setMargin(txtGameArgs, new Insets(0, 0, 8, 0)); - - txtMetaspace = new JFXTextField(); - txtMetaspace.setLabelFloat(true); - txtMetaspace.setPromptText(i18n("settings.advanced.java_permanent_generation_space")); - txtMetaspace.getStyleClass().add("fit-width"); - StackPane.setMargin(txtMetaspace, new Insets(0, 0, 8, 0)); - FXUtils.setValidateWhileTextChanged(txtMetaspace, true); - txtMetaspace.setValidators(new NumberValidator(i18n("input.number"), true)); - - txtWrapper = new JFXTextField(); - txtWrapper.setLabelFloat(true); - txtWrapper.setPromptText(i18n("settings.advanced.wrapper_launcher")); - txtWrapper.getStyleClass().add("fit-width"); - StackPane.setMargin(txtWrapper, new Insets(0, 0, 8, 0)); + pane.addRow(0, new Label(i18n("settings.advanced.minecraft_arguments")), txtGameArgs); txtPrecallingCommand = new JFXTextField(); - txtPrecallingCommand.setLabelFloat(true); - txtPrecallingCommand.setPromptText(i18n("settings.advanced.precall_command")); + txtPrecallingCommand.setPromptText(i18n("settings.advanced.precall_command.prompt")); txtPrecallingCommand.getStyleClass().add("fit-width"); - StackPane.setMargin(txtPrecallingCommand, new Insets(0, 0, 8, 0)); + pane.addRow(1, new Label(i18n("settings.advanced.precall_command")), txtPrecallingCommand); - txtServerIP = new JFXTextField(); - txtServerIP.setLabelFloat(true); - txtServerIP.setPromptText(i18n("settings.advanced.server_ip")); - txtServerIP.getStyleClass().add("fit-width"); - StackPane.setMargin(txtServerIP, new Insets(0, 0, 8, 0)); + txtWrapper = new JFXTextField(); + txtWrapper.setPromptText(i18n("settings.advanced.wrapper_launcher.prompt")); + txtWrapper.getStyleClass().add("fit-width"); + pane.addRow(2, new Label(i18n("settings.advanced.wrapper_launcher")), txtWrapper); + customCommandsPane.getContent().setAll(pane); + } + + ComponentList jvmPane = new ComponentList(); + jvmPane.disableProperty().bind(chkEnableSpecificSettings.selectedProperty().not()); + { + GridPane pane = new GridPane(); + ColumnConstraints title = new ColumnConstraints(); + ColumnConstraints value = new ColumnConstraints(); + value.setFillWidth(true); + value.setHgrow(Priority.ALWAYS); + pane.setHgap(16); + pane.setVgap(8); + pane.getColumnConstraints().setAll(title, value); + + txtJVMArgs = new JFXTextField(); + txtJVMArgs.setLabelFloat(true); + txtJVMArgs.setPromptText(i18n("settings.advanced.jvm_args.prompt")); + txtJVMArgs.getStyleClass().add("fit-width"); + pane.addRow(0, new Label(i18n("settings.advanced.jvm_args")), txtJVMArgs); + + txtMetaspace = new JFXTextField(); + txtMetaspace.setPromptText(i18n("settings.advanced.java_permanent_generation_space.prompt")); + txtMetaspace.getStyleClass().add("fit-width"); + FXUtils.setValidateWhileTextChanged(txtMetaspace, true); + txtMetaspace.setValidators(new NumberValidator(i18n("input.number"), true)); + pane.addRow(1, new Label(i18n("settings.advanced.java_permanent_generation_space")), txtMetaspace); + + jvmPane.getContent().setAll(pane); + } + + ComponentList workaroundPane = new ComponentList(); + workaroundPane.disableProperty().bind(chkEnableSpecificSettings.selectedProperty().not()); + { nativesDirItem = new MultiFileItem<>(true); nativesDirItem.setTitle(i18n("settings.advanced.natives_directory")); nativesDirItem.setChooserTitle(i18n("settings.advanced.natives_directory.choose")); @@ -456,10 +502,14 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag FXUtils.setLimitHeight(chkUseNativeOpenAL, 20); } - advancedSettingsPane.getContent().setAll(processPriorityPane, txtJVMArgs, txtGameArgs, txtMetaspace, txtWrapper, txtPrecallingCommand, txtServerIP, nativesDirItem, noJVMArgsPane, noGameCheckPane, noJVMCheckPane, useNativeGLFWPane, useNativeOpenALPane); + workaroundPane.getContent().setAll(nativesDirItem, noJVMArgsPane, noGameCheckPane, noJVMCheckPane, useNativeGLFWPane, useNativeOpenALPane); } - rootPane.getChildren().setAll(iconPickerItemWrapper, settingsTypePane, componentList, advancedHintPane, advancedSettingsPane); + rootPane.getChildren().setAll(iconPickerItemWrapper, settingsTypePane, componentList, + advancedHintPane, + ComponentList.createComponentListTitle(i18n("settings.advanced.custom_commands")), customCommandsPane, + ComponentList.createComponentListTitle(i18n("settings.advanced.jvm")), jvmPane, + ComponentList.createComponentListTitle(i18n("settings.advanced.workaround")), workaroundPane); initialize(); @@ -519,7 +569,6 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag }); componentList.disableProperty().bind(chkEnableSpecificSettings.selectedProperty().not()); - advancedSettingsPane.disableProperty().bind(chkEnableSpecificSettings.selectedProperty().not()); } @Override diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 2e678fa68..904757b4a 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -510,6 +510,8 @@ settings.advanced.dont_check_jvm_validity=Don't check whether JVM can launch the settings.advanced.game_dir.default=Standard (.minecraft/) settings.advanced.game_dir.independent=Independent (.minecraft/versions//, except for assets and libraries) 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.launcher_visibility.close=Close the launcher when the game launched. settings.advanced.launcher_visibility.hide=Hide the launcher when the game launched. @@ -521,7 +523,8 @@ settings.advanced.natives_directory=Local Library Path (LWJGL) settings.advanced.natives_directory.choose=Choose Local Library Path settings.advanced.natives_directory.default=Standerd (.minecraft/versions//natives/) settings.advanced.no_jvm_args=No Default JVM Args -settings.advanced.precall_command=Pre-Launch command (will be executed before game starts) +settings.advanced.precall_command=Pre-launch command +settings.advanced.precall_command.prompt=Will be executed before game starts settings.advanced.process_priority=Process Priority settings.advanced.process_priority.low=Low settings.advanced.process_priority.below_normal=Below Normal @@ -529,9 +532,12 @@ settings.advanced.process_priority.normal=Normal settings.advanced.process_priority.above_normal=Above Normal settings.advanced.process_priority.high=High settings.advanced.server_ip=Server Address +settings.advanced.server_ip.prompt=Join server when game launched settings.advanced.use_native_glfw=[Linux] Use system GLFW settings.advanced.use_native_openal=[Linux] Use system OpenAL -settings.advanced.wrapper_launcher=Wrapper Launcher (i.e. optirun...) +settings.advanced.workaround=Workarounds +settings.advanced.wrapper_launcher=Wrapper command +settings.advanced.wrapper_launcher.prompt=Allows launching using an extra wrapper program like 'optirun' on Linux. settings.custom=Custom diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 023948986..6f8db0075 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -357,25 +357,42 @@ selector.custom=自訂 settings=遊戲設定 settings.advanced=進階設定 +settings.advanced.custom_commands=自訂命令 settings.advanced.dont_check_game_completeness=不檢查遊戲完整性 settings.advanced.dont_check_jvm_validity=不檢查 JVM 與遊戲的相容性 settings.advanced.game_dir.default=預設(.minecraft/) settings.advanced.game_dir.independent=各版本獨立(.minecraft/versions/<版本名>/,除 assets、libraries) -settings.advanced.java_permanent_generation_space=記憶體永久儲存區域(不必填寫,格式: MB) -settings.advanced.jvm_args=Java 虛擬機參數(不必填寫,覆蓋默認設置) +settings.advanced.java_permanent_generation_space=記憶體永久儲存區域 +settings.advanced.java_permanent_generation_space.prompt=格式: MB +settings.advanced.jvm=Java 虛擬機設定 +settings.advanced.jvm_args=Java 虛擬機參數 +settings.advanced.jvm_args.prompt=填寫此處可以覆蓋默認設定 settings.advanced.launcher_visibility.close=遊戲啟動後結束啟動器 settings.advanced.launcher_visibility.hide=遊戲啟動後隱藏啟動器 settings.advanced.launcher_visibility.hide_and_reopen=隱藏啟動器並在遊戲結束後重新開啟 settings.advanced.launcher_visibility.keep=不隱藏啟動器 settings.advanced.launcher_visible=啟動器可見性 -settings.advanced.minecraft_arguments=Minecraft 額外參數(不必填寫) +settings.advanced.minecraft_arguments=Minecraft 額外參數 +settings.advanced.minecraft_arguments.prompt=默認 settings.advanced.natives_directory=本地庫路徑(LWJGL) settings.advanced.natives_directory.choose=選擇本地庫路徑 settings.advanced.natives_directory.default=預設(.minecraft/versions/<版本名>/natives/) settings.advanced.no_jvm_args=不使用預設的 JVM 參數 -settings.advanced.precall_command=啟動前執行指令(不必填寫,將在遊戲啟動前呼叫使用) -settings.advanced.server_ip=直接進入伺服器 IP 位址(不必填寫,啟動遊戲後直接進入對應伺服器) -settings.advanced.wrapper_launcher=前置指令(不必填寫,如 optirun) +settings.advanced.precall_command=啟動前執行指令 +settings.advanced.precall_command.prompt=將在遊戲啟動前呼叫使用 +settings.advanced.process_priority=進程優先度 +settings.advanced.process_priority.low=低(節省遊戲占用資源,可能會造成遊戲卡頓) +settings.advanced.process_priority.below_normal=較低(節省遊戲占用資源,可能會造成遊戲卡頓) +settings.advanced.process_priority.normal=中(平衡) +settings.advanced.process_priority.above_normal=較高(優先保證遊戲運行,但可能會導致其他程序卡頓) +settings.advanced.process_priority.high=高(優先保證遊戲運行,但可能會導致其他程序卡頓) +settings.advanced.server_ip=伺服器位址 +settings.advanced.server_ip.prompt=默認,啟動遊戲後直接進入對應伺服器 +settings.advanced.use_native_glfw=[Linux] 使用系統 GLFW +settings.advanced.use_native_openal=[Linux] 使用系統 OpenAL +settings.advanced.workaround=除錯選項 +settings.advanced.wrapper_launcher=前置指令 +settings.advanced.wrapper_launcher.prompt=如填寫 optirun 後,啟動命令將從 "java ..." 變為 "optirun java ..." settings.custom=自訂 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index dc08a5428..c812d59e9 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -518,33 +518,42 @@ selector.custom=自定义 settings=设置 settings.advanced=高级设置 +settings.advanced.custom_commands=自定义命令 settings.advanced.dont_check_game_completeness=不检查游戏完整性 settings.advanced.dont_check_jvm_validity=不检查 JVM 与游戏的兼容性 settings.advanced.game_dir.default=默认(.minecraft/) settings.advanced.game_dir.independent=各版本独立(.minecraft/versions/<版本名>/,除 assets、libraries) -settings.advanced.java_permanent_generation_space=内存永久保存区域(不必填写,单位 MB) -settings.advanced.jvm_args=Java 虚拟机参数(不必填写,覆盖默认设置) +settings.advanced.java_permanent_generation_space=内存永久保存区域 +settings.advanced.java_permanent_generation_space.prompt=单位 MB +settings.advanced.jvm=Java 虚拟机设置 +settings.advanced.jvm_args=Java 虚拟机参数 +settings.advanced.jvm_args.prompt=填写此处可以覆盖默认设置 settings.advanced.launcher_visibility.close=游戏启动后结束启动器 settings.advanced.launcher_visibility.hide=游戏启动后隐藏启动器 settings.advanced.launcher_visibility.hide_and_reopen=隐藏启动器并在游戏结束后重新打开 settings.advanced.launcher_visibility.keep=保持启动器可见 settings.advanced.launcher_visible=启动器可见性 -settings.advanced.minecraft_arguments=Minecraft 额外参数(不必填写) +settings.advanced.minecraft_arguments=游戏参数 +settings.advanced.minecraft_arguments.prompt=默认 settings.advanced.natives_directory=本地库路径(LWJGL) settings.advanced.natives_directory.choose=选择本地库路径 settings.advanced.natives_directory.default=预设(.minecraft/versions/<版本名>/natives/) settings.advanced.no_jvm_args=不添加默认的 JVM 参数 -settings.advanced.precall_command=启动前执行命令(不必填写,将在游戏启动前调用) +settings.advanced.precall_command=启动前执行命令 +settings.advanced.precall_command.prompt=将在游戏启动前调用 settings.advanced.process_priority=进程优先级 settings.advanced.process_priority.low=低(节省游戏占用资源,可能会造成游戏卡顿) settings.advanced.process_priority.below_normal=较低(节省游戏占用资源,可能会造成游戏卡顿) settings.advanced.process_priority.normal=中(平衡) settings.advanced.process_priority.above_normal=较高(优先保证游戏运行,但可能会导致其他程序卡顿) settings.advanced.process_priority.high=高(优先保证游戏运行,但可能会导致其他程序卡顿) -settings.advanced.server_ip=直入服务器 IP 地址(不必填写,启动游戏后直接进入对应服务器) +settings.advanced.server_ip=服务器地址 +settings.advanced.server_ip.prompt=默认,启动游戏后可以直接进入对应服务器 settings.advanced.use_native_glfw=[Linux] 使用系统 GLFW settings.advanced.use_native_openal=[Linux] 使用系统 OpenAL -settings.advanced.wrapper_launcher=前置指令(不必填写,如 optirun) +settings.advanced.workaround=调试选项 +settings.advanced.wrapper_launcher=包装命令 +settings.advanced.wrapper_launcher.prompt=如填写 optirun 后,启动命令将从 "java ..." 变为 "optirun java ..." settings.custom=自定义