Skip to content

Commit 11d182f

Browse files
CiiLuGlavo
andauthored
优化输入框校验 (#5129)
Co-authored-by: Glavo <zjx001202@gmail.com>
1 parent e25e58c commit 11d182f

7 files changed

Lines changed: 42 additions & 30 deletions

File tree

HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import com.jfoenix.controls.JFXButton;
2121
import com.jfoenix.controls.JFXDialogLayout;
22+
import com.jfoenix.validation.base.ValidatorBase;
2223
import javafx.animation.KeyFrame;
2324
import javafx.animation.KeyValue;
2425
import javafx.animation.Timeline;
@@ -72,9 +73,10 @@
7273
import java.util.List;
7374
import java.util.concurrent.CompletableFuture;
7475

75-
import static org.jackhuang.hmcl.setting.ConfigHolder.*;
76-
import static org.jackhuang.hmcl.util.logging.Logger.LOG;
76+
import static org.jackhuang.hmcl.setting.ConfigHolder.config;
77+
import static org.jackhuang.hmcl.setting.ConfigHolder.globalConfig;
7778
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
79+
import static org.jackhuang.hmcl.util.logging.Logger.LOG;
7880

7981
public final class Controllers {
8082
public static final String JAVA_VERSION_TIP = "javaVersion";
@@ -505,8 +507,8 @@ public static CompletableFuture<String> prompt(String title, FutureCallback<Stri
505507
return prompt(title, onResult, "");
506508
}
507509

508-
public static CompletableFuture<String> prompt(String title, FutureCallback<String> onResult, String initialValue) {
509-
InputDialogPane pane = new InputDialogPane(title, initialValue, onResult);
510+
public static CompletableFuture<String> prompt(String title, FutureCallback<String> onResult, String initialValue, ValidatorBase... validators) {
511+
InputDialogPane pane = new InputDialogPane(title, initialValue, onResult, validators);
510512
dialog(pane);
511513
return pane.getCompletableFuture();
512514
}

HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AddAuthlibInjectorServerPane.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@
2525
import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer;
2626
import org.jackhuang.hmcl.task.Schedulers;
2727
import org.jackhuang.hmcl.task.Task;
28+
import org.jackhuang.hmcl.ui.FXUtils;
2829
import org.jackhuang.hmcl.ui.animation.ContainerAnimations;
2930
import org.jackhuang.hmcl.ui.animation.TransitionPane;
30-
import org.jackhuang.hmcl.ui.construct.DialogAware;
31-
import org.jackhuang.hmcl.ui.construct.DialogCloseEvent;
32-
import org.jackhuang.hmcl.ui.construct.SpinnerPane;
31+
import org.jackhuang.hmcl.ui.construct.*;
3332
import org.jackhuang.hmcl.util.Lang;
3433

3534
import javax.net.ssl.SSLException;
@@ -88,6 +87,10 @@ public AddAuthlibInjectorServerPane() {
8887

8988
addServerPane.setBody(txtServerUrl);
9089
addServerPane.setActions(lblCreationWarning, actions);
90+
91+
txtServerUrl.getValidators().addAll(new RequiredValidator(), new URLValidator());
92+
FXUtils.setValidateWhileTextChanged(txtServerUrl, true);
93+
btnAddNext.disableProperty().bind(txtServerUrl.activeValidatorProperty().isNotNull());
9194
}
9295

9396
confirmServerPane = new JFXDialogLayout();
@@ -149,7 +152,6 @@ public AddAuthlibInjectorServerPane() {
149152
this.setContent(addServerPane, ContainerAnimations.NONE);
150153

151154
lblCreationWarning.maxWidthProperty().bind(((FlowPane) lblCreationWarning.getParent()).widthProperty());
152-
btnAddNext.disableProperty().bind(txtServerUrl.textProperty().isEmpty());
153155
nextPane.hideSpinner();
154156

155157
onEscPressed(this, this::onAddCancel);

HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/InputDialogPane.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
import com.jfoenix.controls.JFXButton;
2121
import com.jfoenix.controls.JFXDialogLayout;
2222
import com.jfoenix.controls.JFXTextField;
23+
import com.jfoenix.validation.base.ValidatorBase;
2324
import javafx.scene.control.Label;
2425
import javafx.scene.layout.HBox;
2526
import javafx.scene.layout.VBox;
27+
import org.jackhuang.hmcl.ui.FXUtils;
2628
import org.jackhuang.hmcl.util.FutureCallback;
2729

2830
import java.util.concurrent.CompletableFuture;
@@ -36,6 +38,16 @@ public class InputDialogPane extends JFXDialogLayout implements DialogAware {
3638
private final JFXTextField textField;
3739
private final Label lblCreationWarning;
3840
private final SpinnerPane acceptPane;
41+
private final JFXButton acceptButton;
42+
43+
public InputDialogPane(String text, String initialValue, FutureCallback<String> onResult, ValidatorBase... validators) {
44+
this(text, initialValue, onResult);
45+
if (validators != null && validators.length > 0) {
46+
textField.getValidators().addAll(validators);
47+
FXUtils.setValidateWhileTextChanged(textField, true);
48+
acceptButton.disableProperty().bind(textField.activeValidatorProperty().isNotNull());
49+
}
50+
}
3951

4052
public InputDialogPane(String text, String initialValue, FutureCallback<String> onResult) {
4153
textField = new JFXTextField(initialValue);
@@ -47,7 +59,7 @@ public InputDialogPane(String text, String initialValue, FutureCallback<String>
4759

4860
acceptPane = new SpinnerPane();
4961
acceptPane.getStyleClass().add("small-spinner-pane");
50-
JFXButton acceptButton = new JFXButton(i18n("button.ok"));
62+
acceptButton = new JFXButton(i18n("button.ok"));
5163
acceptButton.getStyleClass().add("dialog-accept");
5264
acceptPane.setContent(acceptButton);
5365

@@ -69,7 +81,6 @@ public InputDialogPane(String text, String initialValue, FutureCallback<String>
6981
lblCreationWarning.setText(msg);
7082
});
7183
});
72-
7384
textField.setOnAction(event -> acceptButton.fire());
7485
onEscPressed(this, cancelButton::fire);
7586
}

HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.jackhuang.hmcl.ui.construct.AdvancedListBox;
4040
import org.jackhuang.hmcl.ui.construct.MessageDialogPane;
4141
import org.jackhuang.hmcl.ui.construct.TabHeader;
42+
import org.jackhuang.hmcl.ui.construct.Validator;
4243
import org.jackhuang.hmcl.ui.decorator.DecoratorAnimatedPage;
4344
import org.jackhuang.hmcl.ui.decorator.DecoratorPage;
4445
import org.jackhuang.hmcl.ui.versions.DownloadListPage;
@@ -134,10 +135,6 @@ public static void download(Profile profile, @Nullable String version, RemoteMod
134135
Path runDirectory = profile.getRepository().hasVersion(version) ? profile.getRepository().getRunDirectory(version) : profile.getRepository().getBaseDirectory();
135136

136137
Controllers.prompt(i18n("archive.file.name"), (result, resolve, reject) -> {
137-
if (!FileUtils.isNameValid(result)) {
138-
reject.accept(i18n("install.new_game.malformed"));
139-
return;
140-
}
141138
Path dest = runDirectory.resolve(subdirectoryName).resolve(result);
142139

143140
Controllers.taskDialog(Task.composeAsync(() -> {
@@ -155,9 +152,8 @@ public static void download(Profile profile, @Nullable String version, RemoteMod
155152
Controllers.showToast(i18n("install.success"));
156153
}
157154
}), i18n("message.downloading"), TaskCancellationAction.NORMAL);
158-
159155
resolve.run();
160-
}, file.getFile().getFilename());
156+
}, file.getFile().getFilename(), new Validator(i18n("install.new_game.malformed"), FileUtils::isNameValid));
161157

162158
}
163159

HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackSelectionPage.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@
2929
import javafx.stage.FileChooser;
3030
import org.jackhuang.hmcl.game.ModpackHelper;
3131
import org.jackhuang.hmcl.mod.server.ServerModpackManifest;
32-
import org.jackhuang.hmcl.task.*;
32+
import org.jackhuang.hmcl.task.FileDownloadTask;
33+
import org.jackhuang.hmcl.task.GetTask;
34+
import org.jackhuang.hmcl.task.Schedulers;
3335
import org.jackhuang.hmcl.ui.Controllers;
3436
import org.jackhuang.hmcl.ui.FXUtils;
3537
import org.jackhuang.hmcl.ui.SVG;
3638
import org.jackhuang.hmcl.ui.construct.TwoLineListItem;
39+
import org.jackhuang.hmcl.ui.construct.URLValidator;
3740
import org.jackhuang.hmcl.ui.wizard.WizardController;
3841
import org.jackhuang.hmcl.ui.wizard.WizardPage;
3942
import org.jackhuang.hmcl.util.SettingsMap;
@@ -161,7 +164,7 @@ private void onChooseRemoteFile() {
161164
} catch (IOException e) {
162165
reject.accept(e.getMessage());
163166
}
164-
});
167+
}, "", new URLValidator());
165168
}
166169

167170
public void onChooseRepository() {

HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/Versions.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626
import org.jackhuang.hmcl.game.*;
2727
import org.jackhuang.hmcl.mod.RemoteMod;
2828
import org.jackhuang.hmcl.setting.*;
29-
import org.jackhuang.hmcl.task.*;
29+
import org.jackhuang.hmcl.task.FileDownloadTask;
30+
import org.jackhuang.hmcl.task.Schedulers;
31+
import org.jackhuang.hmcl.task.Task;
32+
import org.jackhuang.hmcl.task.TaskExecutor;
3033
import org.jackhuang.hmcl.ui.Controllers;
3134
import org.jackhuang.hmcl.ui.FXUtils;
3235
import org.jackhuang.hmcl.ui.account.CreateAccountPane;
@@ -50,8 +53,8 @@
5053
import java.util.concurrent.CompletableFuture;
5154
import java.util.function.Consumer;
5255

53-
import static org.jackhuang.hmcl.util.logging.Logger.LOG;
5456
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
57+
import static org.jackhuang.hmcl.util.logging.Logger.LOG;
5558

5659
public final class Versions {
5760
private Versions() {
@@ -124,10 +127,6 @@ public static void deleteVersion(Profile profile, String version) {
124127

125128
public static CompletableFuture<String> renameVersion(Profile profile, String version) {
126129
return Controllers.prompt(i18n("version.manage.rename.message"), (newName, resolve, reject) -> {
127-
if (!HMCLGameRepository.isValidVersionId(newName)) {
128-
reject.accept(i18n("install.new_game.malformed"));
129-
return;
130-
}
131130
if (profile.getRepository().renameVersion(version, newName)) {
132131
resolve.run();
133132
profile.getRepository().refreshVersionsAsync()
@@ -139,7 +138,8 @@ public static CompletableFuture<String> renameVersion(Profile profile, String ve
139138
} else {
140139
reject.accept(i18n("version.manage.rename.fail"));
141140
}
142-
}, version);
141+
}, version, new Validator(i18n("install.new_game.malformed"), HMCLGameRepository::isValidVersionId),
142+
new Validator(i18n("install.new_game.already_exists"), newVersionName -> !profile.getRepository().versionIdConflicts(newVersionName)));
143143
}
144144

145145
public static void exportVersion(Profile profile, String version) {
@@ -155,10 +155,6 @@ public static void duplicateVersion(Profile profile, String version) {
155155
new PromptDialogPane.Builder(i18n("version.manage.duplicate.prompt"), (res, resolve, reject) -> {
156156
String newVersionName = ((PromptDialogPane.Builder.StringQuestion) res.get(1)).getValue();
157157
boolean copySaves = ((PromptDialogPane.Builder.BooleanQuestion) res.get(2)).getValue();
158-
if (!HMCLGameRepository.isValidVersionId(newVersionName)) {
159-
reject.accept(i18n("install.new_game.malformed"));
160-
return;
161-
}
162158
Task.runAsync(() -> profile.getRepository().duplicateVersion(version, newVersionName, copySaves))
163159
.thenComposeAsync(profile.getRepository().refreshVersionsAsync())
164160
.whenComplete(Schedulers.javafx(), (result, exception) -> {
@@ -174,6 +170,7 @@ public static void duplicateVersion(Profile profile, String version) {
174170
})
175171
.addQuestion(new PromptDialogPane.Builder.HintQuestion(i18n("version.manage.duplicate.confirm")))
176172
.addQuestion(new PromptDialogPane.Builder.StringQuestion(null, version,
173+
new Validator(i18n("install.new_game.malformed"), HMCLGameRepository::isValidVersionId),
177174
new Validator(i18n("install.new_game.already_exists"), newVersionName -> !profile.getRepository().versionIdConflicts(newVersionName))))
178175
.addQuestion(new PromptDialogPane.Builder.BooleanQuestion(i18n("version.manage.duplicate.duplicate_save"), false)));
179176
}

HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.jackhuang.hmcl.task.Schedulers;
2828
import org.jackhuang.hmcl.task.Task;
2929
import org.jackhuang.hmcl.ui.*;
30+
import org.jackhuang.hmcl.ui.construct.Validator;
3031
import org.jackhuang.hmcl.util.io.FileUtils;
3132
import org.jackhuang.hmcl.util.versioning.GameVersionNumber;
3233

@@ -141,7 +142,7 @@ else if (e instanceof IOException && e.getCause() instanceof InvalidPathExceptio
141142
else
142143
reject.accept(i18n("world.import.failed", e.getClass().getName() + ": " + e.getLocalizedMessage()));
143144
}).start();
144-
}, world.getWorldName());
145+
}, world.getWorldName(), new Validator(i18n("install.new_game.malformed"), FileUtils::isNameValid));
145146
}, e -> {
146147
LOG.warning("Unable to parse world file " + zipFile, e);
147148
Controllers.dialog(i18n("world.import.invalid"));

0 commit comments

Comments
 (0)