diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index 346745edd..54da5cb6e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -64,6 +64,7 @@ import org.jackhuang.hmcl.util.*; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.platform.Architecture; import org.jackhuang.hmcl.util.platform.OperatingSystem; +import org.jetbrains.annotations.Nullable; import java.nio.file.Path; import java.util.List; @@ -433,26 +434,34 @@ public final class Controllers { dialog(new MessageDialogPane.Builder(text, title, type).actionOrCancel(actionButton, cancel).build()); } - public static void confirmActionDanger(String text, String title, Runnable resolve, Runnable cancel) { - JFXButton btnYes = new JFXButton(i18n("button.ok")); - btnYes.getStyleClass().add("dialog-error"); - btnYes.setOnAction(e -> resolve.run()); - btnYes.setDisable(true); + public static void confirmWithCountdown(String text, String title, int seconds, MessageType messageType, + @Nullable Runnable ok, @Nullable Runnable cancel) { + if (seconds <= 0) + throw new IllegalArgumentException("Seconds must be greater than 0"); - int countdown = 10; - KeyFrame[] keyFrames = new KeyFrame[countdown + 1]; - for (int i = 0; i < countdown; i++) { + JFXButton btnOk = new JFXButton(i18n("button.ok")); + btnOk.getStyleClass().add(messageType == MessageType.WARNING || messageType == MessageType.ERROR + ? "dialog-error" + : "dialog-accept"); + + if (ok != null) + btnOk.setOnAction(e -> ok.run()); + btnOk.setDisable(true); + + KeyFrame[] keyFrames = new KeyFrame[seconds + 1]; + for (int i = 0; i < seconds; i++) { keyFrames[i] = new KeyFrame(Duration.seconds(i), - new KeyValue(btnYes.textProperty(), i18n("button.ok.countdown", countdown - i))); + new KeyValue(btnOk.textProperty(), i18n("button.ok.countdown", seconds - i))); } - keyFrames[countdown] = new KeyFrame(Duration.seconds(countdown), - new KeyValue(btnYes.textProperty(), i18n("button.ok")), - new KeyValue(btnYes.disableProperty(), false)); + keyFrames[seconds] = new KeyFrame(Duration.seconds(seconds), + new KeyValue(btnOk.textProperty(), i18n("button.ok")), + new KeyValue(btnOk.disableProperty(), false)); Timeline timeline = new Timeline(keyFrames); - confirmAction(text, title, MessageType.WARNING, btnYes, () -> { + confirmAction(text, title, messageType, btnOk, () -> { timeline.stop(); - cancel.run(); + if (cancel != null) + cancel.run(); }); timeline.play(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/CreateAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/CreateAccountPane.java index 3118b3259..e2c00c369 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/CreateAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/CreateAccountPane.java @@ -264,10 +264,12 @@ public class CreateAccountPane extends JFXDialogLayout implements DialogAware { }; if (factory instanceof OfflineAccountFactory && username != null && (!USERNAME_CHECKER_PATTERN.matcher(username).matches() || username.length() > 16)) { - Controllers.confirmActionDanger(i18n("account.methods.offline.name.invalid"), i18n("message.warning"), doCreate, () -> { - body.setDisable(false); - spinner.hideSpinner(); - }); + Controllers.confirmWithCountdown(i18n("account.methods.offline.name.invalid"), i18n("message.warning"), 10, + MessageDialogPane.MessageType.WARNING, + doCreate, () -> { + body.setDisable(false); + spinner.hideSpinner(); + }); } else { doCreate.run(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java index 04865585c..efb753f67 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java @@ -138,13 +138,13 @@ public class TerracottaControllerPage extends StackPane { TerracottaState state = UI_STATE.get(), next; if (state instanceof TerracottaState.Uninitialized || state instanceof TerracottaState.Preparing preparing && preparing.hasInstallFence()) { if (state instanceof TerracottaState.Uninitialized uninitialized && !uninitialized.hasLegacy()) { - Controllers.confirmActionDanger(i18n("terracotta.confirm.desc"), i18n("terracotta.confirm.title"), () -> { - TerracottaState.Preparing s = TerracottaManager.install(path); - if (s != null) { - UI_STATE.set(s); - } - }, () -> { - }); + Controllers.confirmWithCountdown(i18n("terracotta.confirm.desc"), i18n("terracotta.confirm.title"), 5, + MessageDialogPane.MessageType.INFO, () -> { + TerracottaState.Preparing s = TerracottaManager.install(path); + if (s != null) { + UI_STATE.set(s); + } + }, null); return; } @@ -202,7 +202,7 @@ public class TerracottaControllerPage extends StackPane { } } } else { - Controllers.confirmActionDanger(i18n("terracotta.confirm.desc"), i18n("terracotta.confirm.title"), () -> { + Controllers.confirmWithCountdown(i18n("terracotta.confirm.desc"), i18n("terracotta.confirm.title"), 5, MessageDialogPane.MessageType.INFO, () -> { globalConfig().setTerracottaAgreementVersion(1); TerracottaState.Preparing s = TerracottaManager.install(null); if (s != null) {