From 276ef23e56cab0c44416311df6ea7350e56ef158 Mon Sep 17 00:00:00 2001 From: KSSJW <165921128+KSSJW@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:29:04 +0800 Subject: [PATCH 1/7] Refactor: InstallersPageSkin --- .../ui/download/AbstractInstallersPage.java | 25 ++++++++++++++++--- .../hmcl/ui/download/InstallersPage.java | 7 +++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java index b1c2a97d590..955bfc699bb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java @@ -27,16 +27,20 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.FlowPane; import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; + import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.LibraryAnalyzer; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.InstallerItem; +import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.MessageDialogPane; import org.jackhuang.hmcl.ui.wizard.Navigation; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.SettingsMap; +import org.jackhuang.hmcl.util.i18n.I18n; import static org.jackhuang.hmcl.setting.SettingsManager.state; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -127,11 +131,26 @@ protected InstallersPageSkin(AbstractInstallersPage control) { { HBox versionNamePane = new HBox(8); versionNamePane.getStyleClass().add("card-non-transparent"); - versionNamePane.setStyle("-fx-padding: 20 8 20 16"); + versionNamePane.setStyle("-fx-padding: 20 16 20 16"); versionNamePane.setAlignment(Pos.CENTER_LEFT); - control.txtName.setMaxWidth(300); - versionNamePane.getChildren().setAll(new Label(i18n("version.name")), control.txtName); + HBox.setHgrow(control.txtName, Priority.ALWAYS); + + JFXButton clearButton = FXUtils.newToggleButton4(SVG.CLOSE); + FXUtils.installFastTooltip(clearButton, i18n("button.clear")); + clearButton.setOnAction(e -> { + control.txtName.clear(); + }); + + JFXButton resetButton = FXUtils.newToggleButton4(SVG.RESTORE); + FXUtils.installFastTooltip(resetButton, i18n("button.reset")); + resetButton.setOnAction(e -> { + if (control instanceof InstallersPage page) { + page.resetDefaultName(); + } + }); + + versionNamePane.getChildren().setAll(new Label(i18n("version.name")), control.txtName, clearButton, resetButton); root.setTop(versionNamePane); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index 3d07ed74b61..c357c69f60c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -111,7 +111,7 @@ protected void onInstall() { } } - private void setTxtNameWithLoaders() { + public void setTxtNameWithLoaders() { StringBuilder nameBuilder = new StringBuilder(getTitle()); for (InstallerItem library : group.getLibraries()) { @@ -143,4 +143,9 @@ private void setTxtNameWithLoaders() { txtName.setText(nameBuilder.toString()); isNameModifiedByUser = false; } + + public void resetDefaultName() { + isNameModifiedByUser = false; + setTxtNameWithLoaders(); + } } From 570ed78ab3aecf2f28d9d172f1af96d981b44aca Mon Sep 17 00:00:00 2001 From: KSSJW <165921128+KSSJW@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:42:44 +0800 Subject: [PATCH 2/7] Refactor: EmptyCheck Import --- .../ui/download/AbstractInstallersPage.java | 27 +++++++++---------- .../hmcl/ui/download/InstallersPage.java | 2 +- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java index 955bfc699bb..8a86c5db674 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java @@ -40,7 +40,6 @@ import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.SettingsMap; -import org.jackhuang.hmcl.util.i18n.I18n; import static org.jackhuang.hmcl.setting.SettingsManager.state; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -138,19 +137,19 @@ protected InstallersPageSkin(AbstractInstallersPage control) { JFXButton clearButton = FXUtils.newToggleButton4(SVG.CLOSE); FXUtils.installFastTooltip(clearButton, i18n("button.clear")); - clearButton.setOnAction(e -> { - control.txtName.clear(); - }); - - JFXButton resetButton = FXUtils.newToggleButton4(SVG.RESTORE); - FXUtils.installFastTooltip(resetButton, i18n("button.reset")); - resetButton.setOnAction(e -> { - if (control instanceof InstallersPage page) { - page.resetDefaultName(); - } - }); - - versionNamePane.getChildren().setAll(new Label(i18n("version.name")), control.txtName, clearButton, resetButton); + clearButton.disableProperty().bind(control.txtName.textProperty().isEmpty()); + clearButton.setOnAction(e -> control.txtName.clear()); + + versionNamePane.getChildren().addAll(new Label(i18n("version.name")), control.txtName, clearButton); + + if (control instanceof InstallersPage page) { + JFXButton resetButton = FXUtils.newToggleButton4(SVG.RESTORE); + FXUtils.installFastTooltip(resetButton, i18n("button.reset")); + resetButton.setOnAction(e -> page.resetDefaultName()); + + versionNamePane.getChildren().add(resetButton); + } + root.setTop(versionNamePane); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index c357c69f60c..9862d1b06f4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -111,7 +111,7 @@ protected void onInstall() { } } - public void setTxtNameWithLoaders() { + private void setTxtNameWithLoaders() { StringBuilder nameBuilder = new StringBuilder(getTitle()); for (InstallerItem library : group.getLibraries()) { From 105eba5865af773cba6f2cfe7fb45baff49d61b3 Mon Sep 17 00:00:00 2001 From: KSSJW <165921128+KSSJW@users.noreply.github.com> Date: Thu, 9 Jul 2026 17:24:13 +0800 Subject: [PATCH 3/7] Refactor: Abstract methods --- .../ui/download/AbstractInstallersPage.java | 21 +++++++++++-------- .../ui/download/AdditionalInstallersPage.java | 9 ++++++++ .../hmcl/ui/download/InstallersPage.java | 6 ++++++ 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java index 8a86c5db674..ee62eb40d48 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java @@ -115,6 +115,9 @@ protected Skin createDefaultSkin() { return new InstallersPageSkin(this); } + protected abstract boolean showExpendPane(); + protected abstract void resetDefaultName(); + protected static class InstallersPageSkin extends SkinBase { /** * Constructor for all SkinBase instances. @@ -135,19 +138,19 @@ protected InstallersPageSkin(AbstractInstallersPage control) { HBox.setHgrow(control.txtName, Priority.ALWAYS); - JFXButton clearButton = FXUtils.newToggleButton4(SVG.CLOSE); - FXUtils.installFastTooltip(clearButton, i18n("button.clear")); - clearButton.disableProperty().bind(control.txtName.textProperty().isEmpty()); - clearButton.setOnAction(e -> control.txtName.clear()); - - versionNamePane.getChildren().addAll(new Label(i18n("version.name")), control.txtName, clearButton); + versionNamePane.getChildren().addAll(new Label(i18n("version.name")), control.txtName); - if (control instanceof InstallersPage page) { + if (control.showExpendPane()) { + JFXButton clearButton = FXUtils.newToggleButton4(SVG.CLOSE); + FXUtils.installFastTooltip(clearButton, i18n("button.clear")); + clearButton.disableProperty().bind(control.txtName.textProperty().isEmpty()); + clearButton.setOnAction(e -> control.txtName.clear()); + JFXButton resetButton = FXUtils.newToggleButton4(SVG.RESTORE); FXUtils.installFastTooltip(resetButton, i18n("button.reset")); - resetButton.setOnAction(e -> page.resetDefaultName()); + resetButton.setOnAction(e -> control.resetDefaultName()); - versionNamePane.getChildren().add(resetButton); + versionNamePane.getChildren().addAll(clearButton, resetButton); } root.setTop(versionNamePane); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java index 7464556d7d6..57fbcd3d764 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java @@ -111,4 +111,13 @@ protected void reload() { @Override public void cleanup(SettingsMap settings) { } + + @Override + protected boolean showExpendPane() { + return false; + } + + @Override + public void resetDefaultName() { + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index 9862d1b06f4..07196307332 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -144,6 +144,12 @@ private void setTxtNameWithLoaders() { isNameModifiedByUser = false; } + @Override + public boolean showExpendPane() { + return true; + } + + @Override public void resetDefaultName() { isNameModifiedByUser = false; setTxtNameWithLoaders(); From 404c1e2b92f1d1c30271847012fca65d114d2d7b Mon Sep 17 00:00:00 2001 From: KSSJW <165921128+KSSJW@users.noreply.github.com> Date: Thu, 9 Jul 2026 17:30:35 +0800 Subject: [PATCH 4/7] Refactor: Method name, protected method --- .../jackhuang/hmcl/ui/download/AbstractInstallersPage.java | 4 ++-- .../jackhuang/hmcl/ui/download/AdditionalInstallersPage.java | 4 ++-- .../java/org/jackhuang/hmcl/ui/download/InstallersPage.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java index ee62eb40d48..ea2fd335305 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java @@ -115,7 +115,7 @@ protected Skin createDefaultSkin() { return new InstallersPageSkin(this); } - protected abstract boolean showExpendPane(); + protected abstract boolean showExtendPane(); protected abstract void resetDefaultName(); protected static class InstallersPageSkin extends SkinBase { @@ -140,7 +140,7 @@ protected InstallersPageSkin(AbstractInstallersPage control) { versionNamePane.getChildren().addAll(new Label(i18n("version.name")), control.txtName); - if (control.showExpendPane()) { + if (control.showExtendPane()) { JFXButton clearButton = FXUtils.newToggleButton4(SVG.CLOSE); FXUtils.installFastTooltip(clearButton, i18n("button.clear")); clearButton.disableProperty().bind(control.txtName.textProperty().isEmpty()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java index 57fbcd3d764..49701af04e6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java @@ -113,11 +113,11 @@ public void cleanup(SettingsMap settings) { } @Override - protected boolean showExpendPane() { + protected boolean showExtendPane() { return false; } @Override - public void resetDefaultName() { + protected void resetDefaultName() { } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index 07196307332..ff8beb5b951 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -145,12 +145,12 @@ private void setTxtNameWithLoaders() { } @Override - public boolean showExpendPane() { + protected boolean showExtendPane() { return true; } @Override - public void resetDefaultName() { + protected void resetDefaultName() { isNameModifiedByUser = false; setTxtNameWithLoaders(); } From ab34342d1f1f412b7ba1a4fe0228ed04ea9b89f1 Mon Sep 17 00:00:00 2001 From: KSSJW <165921128+KSSJW@users.noreply.github.com> Date: Thu, 9 Jul 2026 17:40:27 +0800 Subject: [PATCH 5/7] Style: Blank --- .../org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java | 1 + 1 file changed, 1 insertion(+) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java index ea2fd335305..9841e793eb0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java @@ -116,6 +116,7 @@ protected Skin createDefaultSkin() { } protected abstract boolean showExtendPane(); + protected abstract void resetDefaultName(); protected static class InstallersPageSkin extends SkinBase { From 2c7f6d1b0ddf85405741a25451e0571bbccc7102 Mon Sep 17 00:00:00 2001 From: KSSJW <165921128+KSSJW@users.noreply.github.com> Date: Thu, 9 Jul 2026 17:47:36 +0800 Subject: [PATCH 6/7] Fix: Bind control.txtName.disableProperty --- .../jackhuang/hmcl/ui/download/AbstractInstallersPage.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java index 9841e793eb0..5fd8b292bda 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java @@ -116,7 +116,7 @@ protected Skin createDefaultSkin() { } protected abstract boolean showExtendPane(); - + protected abstract void resetDefaultName(); protected static class InstallersPageSkin extends SkinBase { @@ -144,11 +144,12 @@ protected InstallersPageSkin(AbstractInstallersPage control) { if (control.showExtendPane()) { JFXButton clearButton = FXUtils.newToggleButton4(SVG.CLOSE); FXUtils.installFastTooltip(clearButton, i18n("button.clear")); - clearButton.disableProperty().bind(control.txtName.textProperty().isEmpty()); + clearButton.disableProperty().bind(control.txtName.textProperty().isEmpty().or(control.txtName.disableProperty())); clearButton.setOnAction(e -> control.txtName.clear()); JFXButton resetButton = FXUtils.newToggleButton4(SVG.RESTORE); FXUtils.installFastTooltip(resetButton, i18n("button.reset")); + resetButton.disableProperty().bind(control.txtName.disableProperty()); resetButton.setOnAction(e -> control.resetDefaultName()); versionNamePane.getChildren().addAll(clearButton, resetButton); From 1c3175862731f2d58668a25dd12d2c8567c54903 Mon Sep 17 00:00:00 2001 From: KSSJW <165921128+KSSJW@users.noreply.github.com> Date: Fri, 10 Jul 2026 12:27:46 +0800 Subject: [PATCH 7/7] Chore: Docs --- .../ui/download/AbstractInstallersPage.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java index 5fd8b292bda..96fec6ccfc3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AbstractInstallersPage.java @@ -115,8 +115,28 @@ protected Skin createDefaultSkin() { return new InstallersPageSkin(this); } + /** + * Determines whether to display the extension pane. + *

+ * This method controls the visibility of the extension pane in the UI. + * When this method returns {@code true} and the pane is visible, users can + * interact with the features inside it, which includes triggering the + * "Reset to Default Name" button handled by {@link #resetDefaultName()}. + *

+ * + * @return {@code true} if the extension pane should be displayed; {@code false} otherwise. + */ protected abstract boolean showExtendPane(); + /** + * Resets the name to its default value. + *

+ * This method contains the business logic for the "Reset to Default Name" button + * located within the extension pane. This logic can only be triggered by the user + * clicking the corresponding button after {@link #showExtendPane()} returns + * {@code true} and the extension pane is successfully displayed. + *

+ */ protected abstract void resetDefaultName(); protected static class InstallersPageSkin extends SkinBase {