From c1596f6a11999c1aaae32692cbe91356507b823c Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sat, 7 Jul 2018 19:33:47 +0800 Subject: [PATCH] Replace Controllers.closeDialog with DialogCloseEvent --- .../jackhuang/hmcl/game/LauncherHelper.java | 12 ++--- .../jackhuang/hmcl/ui/AccountLoginPane.java | 12 +++-- .../org/jackhuang/hmcl/ui/AddAccountPane.java | 16 +++---- .../hmcl/ui/AddAuthlibInjectorServerPane.java | 13 ++---- .../hmcl/ui/AuthlibInjectorServersPage.java | 2 +- .../org/jackhuang/hmcl/ui/Controllers.java | 10 +++-- .../java/org/jackhuang/hmcl/ui/Decorator.java | 21 ++++++--- .../jackhuang/hmcl/ui/DialogController.java | 2 +- .../jackhuang/hmcl/ui/LeftPaneController.java | 5 ++- .../java/org/jackhuang/hmcl/ui/MainPage.java | 9 ++-- .../hmcl/ui/construct/DialogCloseEvent.java | 45 +++++++++++++++++++ .../hmcl/ui/construct/InputDialogPane.java | 7 ++- .../hmcl/ui/construct/MessageDialogPane.java | 17 +++---- .../TaskExecutorDialogWizardDisplayer.java | 4 +- .../hmcl/upgrade/AppDataUpgrader.java | 5 ++- .../hmcl/upgrade/NewFileUpgrader.java | 3 +- 16 files changed, 115 insertions(+), 68 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/DialogCloseEvent.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 8a066debb..c6efa3008 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -37,6 +37,7 @@ import org.jackhuang.hmcl.task.*; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.DialogController; import org.jackhuang.hmcl.ui.LogWindow; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane; import org.jackhuang.hmcl.util.*; @@ -148,11 +149,11 @@ public final class LauncherHelper { else launchingStepsPane.setCancel(it -> { process.stop(); - Controllers.closeDialog(it); + it.fireEvent(new DialogCloseEvent()); }); } else Platform.runLater(() -> { - Controllers.closeDialog(launchingStepsPane); + launchingStepsPane.fireEvent(new DialogCloseEvent()); Controllers.dialog(i18n("version.launch_script.success", scriptFile.getAbsolutePath())); }); @@ -177,7 +178,7 @@ public final class LauncherHelper { // Check if the application has stopped // because onStop will be invoked if tasks fail when the executor service shut down. if (!Controllers.isStopped()) { - Controllers.closeDialog(launchingStepsPane); + launchingStepsPane.fireEvent(new DialogCloseEvent()); Exception ex = executor.getLastException(); if (ex != null) { String message; @@ -267,8 +268,9 @@ public final class LauncherHelper { } public void emitStatus(LoadingState state) { - if (state == LoadingState.DONE) - Controllers.closeDialog(launchingStepsPane); + if (state == LoadingState.DONE) { + launchingStepsPane.fireEvent(new DialogCloseEvent()); + } launchingStepsPane.setTitle(state.getLocalizedMessage()); launchingStepsPane.setSubtitle((state.ordinal() + 1) + " / " + LoadingState.values().length); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountLoginPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountLoginPane.java index f7f6195a7..89bd4c6bd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountLoginPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountLoginPane.java @@ -21,13 +21,13 @@ import com.jfoenix.controls.JFXPasswordField; import com.jfoenix.controls.JFXProgressBar; import javafx.fxml.FXML; import javafx.scene.control.Label; -import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.AuthInfo; import org.jackhuang.hmcl.auth.NoSelectedCharacterException; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import java.util.function.Consumer; @@ -35,7 +35,6 @@ public class AccountLoginPane extends StackPane { private final Account oldAccount; private final Consumer success; private final Runnable failed; - private final Consumer closeConsumer; @FXML private Label lblUsername; @@ -43,11 +42,10 @@ public class AccountLoginPane extends StackPane { @FXML private Label lblCreationWarning; @FXML private JFXProgressBar progressBar; - public AccountLoginPane(Account oldAccount, Consumer closeConsumer, Consumer success, Runnable failed) { + public AccountLoginPane(Account oldAccount, Consumer success, Runnable failed) { this.oldAccount = oldAccount; this.success = success; this.failed = failed; - this.closeConsumer = closeConsumer; FXUtils.loadFXML(this, "/assets/fxml/account-login.fxml"); @@ -70,9 +68,9 @@ public class AccountLoginPane extends StackPane { Object account = variable.get("login"); if (account instanceof AuthInfo) { success.accept(((AuthInfo) account)); - closeConsumer.accept(this); + fireEvent(new DialogCloseEvent()); } else if (account instanceof NoSelectedCharacterException) { - closeConsumer.accept(this); + fireEvent(new DialogCloseEvent()); } else if (account instanceof Exception) { lblCreationWarning.setText(AddAccountPane.accountException((Exception) account)); } @@ -84,6 +82,6 @@ public class AccountLoginPane extends StackPane { @FXML private void onCancel() { failed.run(); - closeConsumer.accept(this); + fireEvent(new DialogCloseEvent()); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index fda658b90..6724eb5bf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -28,7 +28,6 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; -import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import org.jackhuang.hmcl.auth.*; @@ -44,6 +43,7 @@ import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.construct.AdvancedListBox; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.IconedItem; import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.construct.Validator; @@ -56,7 +56,6 @@ import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.List; import java.util.Optional; import java.util.concurrent.CountDownLatch; -import java.util.function.Consumer; import java.util.logging.Level; public class AddAccountPane extends StackPane { @@ -72,11 +71,8 @@ public class AddAccountPane extends StackPane { @FXML private JFXDialogLayout layout; @FXML private JFXButton btnAccept; @FXML private SpinnerPane acceptPane; - private final Consumer finalization; - - public AddAccountPane(Consumer finalization) { - this.finalization = finalization; + public AddAccountPane() { FXUtils.loadFXML(this, "/assets/fxml/account-add.fxml"); cboServers.setCellFactory(jfxListCellFactory(server -> new TwoLineListItem(server.getName(), server.getUrl()))); @@ -148,10 +144,10 @@ public class AddAccountPane extends StackPane { .finalized(Schedulers.javafx(), variables -> { Settings.INSTANCE.addAccount(variables.get("create_account")); acceptPane.hideSpinner(); - finalization.accept(this); + fireEvent(new DialogCloseEvent()); }, exception -> { if (exception instanceof NoSelectedCharacterException) { - finalization.accept(this); + fireEvent(new DialogCloseEvent()); } else { lblCreationWarning.setText(accountException(exception)); } @@ -161,12 +157,12 @@ public class AddAccountPane extends StackPane { @FXML private void onCreationCancel() { - finalization.accept(this); + fireEvent(new DialogCloseEvent()); } @FXML private void onManageInjecterServers() { - finalization.accept(this); + fireEvent(new DialogCloseEvent()); Controllers.navigate(Controllers.getServersPage()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java index 7d0f7fe50..83a711ae0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAuthlibInjectorServerPane.java @@ -21,14 +21,13 @@ import static org.jackhuang.hmcl.ui.FXUtils.loadFXML; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.IOException; -import java.util.function.Consumer; - import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.animation.ContainerAnimations; import org.jackhuang.hmcl.ui.animation.TransitionHandler; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.util.NetworkUtils; @@ -39,7 +38,6 @@ import com.jfoenix.controls.JFXTextField; import javafx.beans.binding.Bindings; import javafx.fxml.FXML; import javafx.scene.control.Label; -import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; public class AddAuthlibInjectorServerPane extends StackPane { @@ -55,14 +53,11 @@ public class AddAuthlibInjectorServerPane extends StackPane { @FXML private SpinnerPane nextPane; @FXML private JFXButton btnAddNext; - private Consumer finalization; - private TransitionHandler transitionHandler; private AuthlibInjectorServer serverBeingAdded; - public AddAuthlibInjectorServerPane(Consumer finalization) { - this.finalization = finalization; + public AddAuthlibInjectorServerPane() { loadFXML(this, "/assets/fxml/authlib-injector-server-add.fxml"); transitionHandler = new TransitionHandler(addServerContainer); transitionHandler.setContent(addServerPane, ContainerAnimations.NONE.getAnimationProducer()); @@ -89,7 +84,7 @@ public class AddAuthlibInjectorServerPane extends StackPane { @FXML private void onAddCancel() { - finalization.accept(this); + fireEvent(new DialogCloseEvent()); } @FXML @@ -129,7 +124,7 @@ public class AddAuthlibInjectorServerPane extends StackPane { if (!Settings.SETTINGS.authlibInjectorServers.contains(serverBeingAdded)) { Settings.SETTINGS.authlibInjectorServers.add(serverBeingAdded); } - finalization.accept(this); + fireEvent(new DialogCloseEvent()); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java index ab1825ff6..937391866 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java @@ -63,7 +63,7 @@ public class AuthlibInjectorServersPage extends StackPane implements DecoratorPa @FXML private void onAdd() { - Controllers.dialog(new AddAuthlibInjectorServerPane(Controllers::closeDialog)); + Controllers.dialog(new AddAuthlibInjectorServerPane()); } public String getTitle() { 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 4ae3bd74f..7edfd58db 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -26,6 +26,7 @@ import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.InputDialogPane; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.construct.MessageDialogPane; @@ -132,15 +133,15 @@ public final class Controllers { } public static void dialog(String text, String title, int type, Runnable onAccept) { - dialog(new MessageDialogPane(text, title, Controllers::closeDialog, type, onAccept)); + dialog(new MessageDialogPane(text, title, type, onAccept)); } public static void confirmDialog(String text, String title, Runnable onAccept, Runnable onCancel) { - dialog(new MessageDialogPane(text, title, Controllers::closeDialog, onAccept, onCancel)); + dialog(new MessageDialogPane(text, title, onAccept, onCancel)); } public static void inputDialog(String text, Consumer onResult) { - dialog(new InputDialogPane(text, Controllers::closeDialog, onResult)); + dialog(new InputDialogPane(text, onResult)); } public static Region taskDialog(TaskExecutor executor, String title, String subtitle) { @@ -156,6 +157,9 @@ public final class Controllers { return pane; } + /** + * Use {@link DialogCloseEvent} + */ public static void closeDialog(Region content) { if (stage == null) // shut down return; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index afea4c9f9..d871f9d62 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -32,6 +32,7 @@ import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; +import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.geometry.BoundingBox; import javafx.geometry.Bounds; @@ -59,6 +60,7 @@ import org.jackhuang.hmcl.ui.animation.AnimationProducer; import org.jackhuang.hmcl.ui.animation.ContainerAnimations; import org.jackhuang.hmcl.ui.animation.TransitionHandler; import org.jackhuang.hmcl.ui.construct.AdvancedListBox; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.StackContainerPane; import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogWizardDisplayer; import org.jackhuang.hmcl.ui.wizard.*; @@ -67,6 +69,7 @@ import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import java.io.File; import java.util.Locale; +import java.util.Optional; import java.util.Queue; import java.util.Random; import java.util.concurrent.ConcurrentLinkedQueue; @@ -81,6 +84,8 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza private static final SVGGlyph close = Lang.apply(new SVGGlyph(0, "CLOSE", "M810 274l-238 238 238 238-60 60-238-238-238 238-60-60 238-238-238-238 60-60 238 238 238-238z", Color.WHITE), glyph -> { glyph.setPrefSize(12, 12); glyph.setSize(12, 12); }); + private static final String PROPERTY_DIALOG_CLOSE_HANDLER = Decorator.class.getName() + ".dialog.closeListener"; + private final ObjectProperty onCloseButtonAction; private final BooleanProperty customMaximize = new SimpleBooleanProperty(false); @@ -563,20 +568,26 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza public void showDialog(Node node) { FXUtils.checkFxUserThread(); + EventHandler handler = event -> closeDialog(node); + node.getProperties().put(PROPERTY_DIALOG_CLOSE_HANDLER, handler); + node.addEventHandler(DialogCloseEvent.CLOSE, handler); + if (dialogPane.isEmpty()) dialog.show(); dialogPane.push(node); } + @SuppressWarnings("unchecked") public void closeDialog(Node node) { FXUtils.checkFxUserThread(); + Optional.ofNullable(node.getProperties().get(PROPERTY_DIALOG_CLOSE_HANDLER)) + .ifPresent(handler -> node.removeEventHandler(DialogCloseEvent.CLOSE, (EventHandler) handler)); + dialogPane.pop(node); - if (dialogPane.getChildren().isEmpty()) - Platform.runLater(() -> { - if (dialogPane.getChildren().isEmpty()) - dialog.close(); - }); + if (dialogPane.getChildren().isEmpty()) { + dialog.close(); + } } public void startWizard(WizardProvider wizardProvider) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/DialogController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/DialogController.java index 16f9476dd..b0d4d5862 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/DialogController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/DialogController.java @@ -34,7 +34,7 @@ public final class DialogController { CountDownLatch latch = new CountDownLatch(1); AtomicReference res = new AtomicReference<>(null); JFXUtilities.runInFX(() -> { - AccountLoginPane pane = new AccountLoginPane(account, Controllers::closeDialog, it -> { + AccountLoginPane pane = new AccountLoginPane(account, it -> { res.set(it); latch.countDown(); }, latch::countDown); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java index 164adfcae..f0d127d4d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java @@ -45,6 +45,7 @@ import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.construct.AdvancedListBox; import org.jackhuang.hmcl.ui.construct.ClassTitle; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.IconedItem; import org.jackhuang.hmcl.ui.construct.RipplerContainer; import org.jackhuang.hmcl.util.Lang; @@ -100,7 +101,7 @@ public final class LeftPaneController { } private void addNewAccount() { - Controllers.dialog(new AddAccountPane(Controllers::closeDialog)); + Controllers.dialog(new AddAccountPane()); } private void onSelectedAccountChanged(Account newAccount) { @@ -228,7 +229,7 @@ public final class LeftPaneController { Modpack modpack = ModpackHelper.readModpackManifest(modpackFile); TaskExecutor executor = ModpackHelper.getInstallTask(repository.getProfile(), modpackFile, modpack.getName(), modpack) .with(Task.of(Schedulers.javafx(), () -> { - Controllers.closeDialog(region.get()); + region.get().fireEvent(new DialogCloseEvent()); checkAccount(); })).executor(); region.set(Controllers.taskDialog(executor, i18n("modpack.installing"), "")); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java index 943a9ddb3..f1c30cf78 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -42,6 +42,7 @@ import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.download.DownloadWizardProvider; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; @@ -165,17 +166,17 @@ public final class MainPage extends StackPane implements DecoratorPage { AtomicReference region = new AtomicReference<>(); try { TaskExecutor executor = ModpackHelper.getUpdateTask(profile, selectedFile, id, ModpackHelper.readModpackConfiguration(repository.getModpackConfiguration(id))) - .then(Task.of(Schedulers.javafx(), () -> Controllers.closeDialog(region.get()))).executor(); + .then(Task.of(Schedulers.javafx(), () -> region.get().fireEvent(new DialogCloseEvent()))).executor(); region.set(Controllers.taskDialog(executor, i18n("modpack.update"), "")); executor.start(); } catch (UnsupportedModpackException e) { - Controllers.closeDialog(region.get()); + region.get().fireEvent(new DialogCloseEvent()); Controllers.dialog(i18n("modpack.unsupported"), i18n("message.error"), MessageBox.ERROR_MESSAGE); } catch (MismatchedModpackTypeException e) { - Controllers.closeDialog(region.get()); + region.get().fireEvent(new DialogCloseEvent()); Controllers.dialog(i18n("modpack.mismatched_type"), i18n("message.error"), MessageBox.ERROR_MESSAGE); } catch (IOException e) { - Controllers.closeDialog(region.get()); + region.get().fireEvent(new DialogCloseEvent()); Controllers.dialog(i18n("modpack.invalid"), i18n("message.error"), MessageBox.ERROR_MESSAGE); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/DialogCloseEvent.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/DialogCloseEvent.java new file mode 100644 index 000000000..6b7d7656b --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/DialogCloseEvent.java @@ -0,0 +1,45 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.ui.construct; + +import org.jackhuang.hmcl.ui.Controllers; + +import javafx.event.Event; +import javafx.event.EventTarget; +import javafx.event.EventType; +import javafx.scene.layout.Region; + +/** + * Indicates a close operation on the dialog. + * + * @author yushijinhun + * @see Controllers#dialog(Region) + */ +public class DialogCloseEvent extends Event { + + public static final EventType CLOSE = new EventType<>("CLOSE"); + + public DialogCloseEvent() { + super(CLOSE); + } + + public DialogCloseEvent(Object source, EventTarget target) { + super(source, target, CLOSE); + } + +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/InputDialogPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/InputDialogPane.java index 5fbb315a7..8e7dfe365 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/InputDialogPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/InputDialogPane.java @@ -21,7 +21,6 @@ import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXTextField; import javafx.fxml.FXML; import javafx.scene.control.Label; -import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import org.jackhuang.hmcl.ui.FXUtils; @@ -38,13 +37,13 @@ public class InputDialogPane extends StackPane { @FXML private Label content; - public InputDialogPane(String text, Consumer closeConsumer, Consumer onResult) { + public InputDialogPane(String text, Consumer onResult) { FXUtils.loadFXML(this, "/assets/fxml/input-dialog.fxml"); content.setText(text); - cancelButton.setOnMouseClicked(e -> closeConsumer.accept(this)); + cancelButton.setOnMouseClicked(e -> fireEvent(new DialogCloseEvent())); acceptButton.setOnMouseClicked(e -> { onResult.accept(textField.getText()); - closeConsumer.accept(this); + fireEvent(new DialogCloseEvent()); }); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java index 4473a7c0b..842832d97 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java @@ -21,7 +21,6 @@ import com.jfoenix.controls.JFXButton; import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.layout.HBox; -import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import org.jackhuang.hmcl.setting.Theme; @@ -30,10 +29,8 @@ import org.jackhuang.hmcl.ui.SVG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Optional; -import java.util.function.Consumer; public final class MessageDialogPane extends StackPane { - private boolean closingDialog = true; @FXML private JFXButton acceptButton; @@ -48,7 +45,7 @@ public final class MessageDialogPane extends StackPane { @FXML private HBox actions; - public MessageDialogPane(String text, String title, Consumer closeConsumer, int type, Runnable onAccept) { + public MessageDialogPane(String text, String title, int type, Runnable onAccept) { FXUtils.loadFXML(this, "/assets/fxml/message-dialog.fxml"); if (title != null) @@ -56,7 +53,7 @@ public final class MessageDialogPane extends StackPane { content.setText(text); acceptButton.setOnMouseClicked(e -> { - closeConsumer.accept(MessageDialogPane.this); + fireEvent(new DialogCloseEvent()); Optional.ofNullable(onAccept).ifPresent(Runnable::run); }); @@ -83,12 +80,12 @@ public final class MessageDialogPane extends StackPane { } } - public MessageDialogPane(String text, String title, Consumer closeConsumer, Runnable onAccept, Runnable onCancel) { - this(text, title, closeConsumer, MessageBox.QUESTION_MESSAGE, onAccept); + public MessageDialogPane(String text, String title, Runnable onAccept, Runnable onCancel) { + this(text, title, MessageBox.QUESTION_MESSAGE, onAccept); cancelButton.setVisible(true); cancelButton.setOnMouseClicked(e -> { - closeConsumer.accept(MessageDialogPane.this); + fireEvent(new DialogCloseEvent()); Optional.ofNullable(onCancel).ifPresent(Runnable::run); }); @@ -97,8 +94,4 @@ public final class MessageDialogPane extends StackPane { actions.getChildren().add(cancelButton); } - - public void disableClosingDialog() { - closingDialog = false; - } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java index e306d1586..4e4aeb76a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java @@ -35,7 +35,7 @@ public interface TaskExecutorDialogWizardDisplayer extends AbstractWizardDisplay @Override default void handleTask(Map settings, Task task) { TaskExecutorDialogPane pane = new TaskExecutorDialogPane(it -> { - Controllers.closeDialog(it); + it.fireEvent(new DialogCloseEvent()); Controllers.navigate(null); }); @@ -62,7 +62,7 @@ public interface TaskExecutorDialogWizardDisplayer extends AbstractWizardDisplay @Override public void onStop(boolean success, TaskExecutor executor) { JFXUtilities.runInFX(() -> { - Controllers.closeDialog(pane); + pane.fireEvent(new DialogCloseEvent()); if (success) { if (settings.containsKey("success_message") && settings.get("success_message") instanceof String) Controllers.dialog((String) settings.get("success_message"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java index 50914c6a8..1cd70a89b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java @@ -27,6 +27,7 @@ import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.Controllers; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.util.*; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -120,7 +121,7 @@ public class AppDataUpgrader extends IUpgrader { .directory(new File("").getAbsoluteFile()).start(); System.exit(0); } - JFXUtilities.runInFX(() -> Controllers.closeDialog(region.get())); + JFXUtilities.runInFX(() -> region.get().fireEvent(new DialogCloseEvent())); } catch (IOException ex) { Logging.LOG.log(Level.SEVERE, "Failed to create upgrader", ex); } @@ -138,7 +139,7 @@ public class AppDataUpgrader extends IUpgrader { .directory(new File("").getAbsoluteFile()).start(); System.exit(0); } - JFXUtilities.runInFX(() -> Controllers.closeDialog(region.get())); + JFXUtilities.runInFX(() -> region.get().fireEvent(new DialogCloseEvent())); } catch (IOException ex) { Logging.LOG.log(Level.SEVERE, "Failed to create upgrader", ex); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java index a3344021f..d878fe963 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java @@ -24,6 +24,7 @@ import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.Controllers; +import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.VersionNumber; import java.io.File; @@ -72,7 +73,7 @@ public class NewFileUpgrader extends IUpgrader { } System.exit(0); } - JFXUtilities.runInFX(() -> Controllers.closeDialog(region.get())); + JFXUtilities.runInFX(() -> region.get().fireEvent(new DialogCloseEvent())); } private static String getRealPath() {