diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index a2c583e6f6..bfaa0f5aa4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -17,35 +17,36 @@ */ package org.jackhuang.hmcl; +import javafx.animation.KeyFrame; +import javafx.animation.KeyValue; +import javafx.animation.Timeline; import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ObservableBooleanValue; import javafx.geometry.Rectangle2D; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.Button; import javafx.scene.control.ButtonType; import javafx.scene.input.Clipboard; import javafx.scene.input.DataFormat; import javafx.stage.Screen; import javafx.stage.Stage; +import javafx.util.Duration; import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.SambaException; -import org.jackhuang.hmcl.ui.FXUtils; -import org.jackhuang.hmcl.util.FileSaver; import org.jackhuang.hmcl.task.AsyncTaskExecutor; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.ui.Controllers; +import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.upgrade.UpdateChecker; import org.jackhuang.hmcl.upgrade.UpdateHandler; import org.jackhuang.hmcl.util.CrashReporter; +import org.jackhuang.hmcl.util.FileSaver; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.io.JarUtils; -import org.jackhuang.hmcl.util.platform.Architecture; -import org.jackhuang.hmcl.util.platform.CommandBuilder; -import org.jackhuang.hmcl.util.platform.NativeUtils; -import org.jackhuang.hmcl.util.platform.OperatingSystem; -import org.jackhuang.hmcl.util.platform.SystemInfo; +import org.jackhuang.hmcl.util.platform.*; import java.io.File; import java.io.IOException; @@ -65,8 +66,8 @@ import static org.jackhuang.hmcl.ui.FXUtils.runInFX; import static org.jackhuang.hmcl.util.DataSizeUnit.MEGABYTES; -import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class Launcher extends Application { public static final CookieManager COOKIE_MANAGER = new CookieManager(); @@ -111,7 +112,7 @@ public void start(Stage primaryStage) { if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS && ConfigHolder.isNewlyCreated() && System.getProperty("user.dir").startsWith("/private/var/folders/")) { - if (showAlert(AlertType.WARNING, i18n("fatal.mac_app_translocation"), ButtonType.YES, ButtonType.NO) == ButtonType.NO) + if (!confirmWithCountdown(AlertType.WARNING, i18n("fatal.mac_app_translocation"), 5)) return; } else { checkConfigInTempDir(); @@ -182,6 +183,27 @@ private static ButtonType showAlert(AlertType alertType, String contentText, But return new Alert(alertType, contentText, buttons).showAndWait().orElse(null); } + private static boolean confirmWithCountdown(Alert.AlertType alertType, String contentText, int seconds) { + Alert alert = new Alert(alertType, contentText, ButtonType.YES, ButtonType.NO); + Button okButton = (Button) alert.getDialogPane().lookupButton(ButtonType.YES); + + okButton.setDisable(true); + + KeyFrame[] keyFrames = new KeyFrame[seconds + 1]; + for (int i = 0; i < seconds; i++) { + keyFrames[i] = new KeyFrame(Duration.seconds(i), + new KeyValue(okButton.textProperty(), i18n("button.ok.countdown", seconds - i))); + } + keyFrames[seconds] = new KeyFrame(Duration.seconds(seconds), + new KeyValue(okButton.textProperty(), i18n("button.ok")), + new KeyValue(okButton.disableProperty(), false)); + + Timeline timeline = new Timeline(keyFrames); + alert.setOnShown(e -> timeline.play()); + alert.setOnCloseRequest(e -> timeline.stop()); + return alert.showAndWait().orElse(null) == ButtonType.YES; + } + private static boolean isConfigInTempDir() { String configPath = ConfigHolder.configLocation().toString(); @@ -221,7 +243,7 @@ private static boolean isConfigInTempDir() { private static void checkConfigInTempDir() { if (ConfigHolder.isNewlyCreated() && isConfigInTempDir() - && showAlert(AlertType.WARNING, i18n("fatal.config_in_temp_dir"), ButtonType.YES, ButtonType.NO) == ButtonType.NO) { + && !confirmWithCountdown(AlertType.WARNING, i18n("fatal.config_in_temp_dir"), 5)) { EntryPoint.exit(0); } }