From 02ce9500206fa5f067b5afa146665bf04ed75674 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Fri, 17 Apr 2020 00:16:17 +0800 Subject: [PATCH] alt: allow dragging window when a dialog is shown --- .../hmcl/ui/decorator/Decorator.java | 11 +++--- .../ui/decorator/DecoratorController.java | 39 ++++++++----------- .../hmcl/ui/decorator/DecoratorSkin.java | 13 ++++++- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/Decorator.java index 99bfa44bc..8ea39fdf6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/Decorator.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.ui.decorator; +import com.jfoenix.controls.JFXDialog; import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -46,7 +47,7 @@ public class Decorator extends Control { private final BooleanProperty canClose = new SimpleBooleanProperty(false); private final BooleanProperty showCloseAsHome = new SimpleBooleanProperty(false); private final Stage primaryStage; - private StackPane drawerWrapper; + private JFXDialog dialog; public Decorator(Stage primaryStage) { this.primaryStage = primaryStage; @@ -58,12 +59,12 @@ public class Decorator extends Control { return primaryStage; } - public StackPane getDrawerWrapper() { - return drawerWrapper; + public JFXDialog getDialog() { + return dialog; } - void setDrawerWrapper(StackPane drawerWrapper) { - this.drawerWrapper = drawerWrapper; + void setDialog(JFXDialog dialog) { + this.dialog = dialog; } public ObservableList getDrawer() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java index 203b81f1b..f6247f57c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java @@ -72,7 +72,6 @@ public class DecoratorController { private final ImageView welcomeView; private final Navigator navigator; - private JFXDialog dialog; private StackContainerPane dialogPane; public DecoratorController(Stage stage, Node mainPage) { @@ -294,23 +293,21 @@ public class DecoratorController { public void showDialog(Node node) { FXUtils.checkFxUserThread(); - if (dialog == null) { - if (decorator.getDrawerWrapper() == null) { - // Sometimes showDialog will be invoked before decorator was initialized. - // Keep trying again. - Platform.runLater(() -> showDialog(node)); - return; - } - - dialog = new JFXDialog(); - dialogPane = new StackContainerPane(); - - dialog.setContent(dialogPane); - dialog.setDialogContainer(decorator.getDrawerWrapper()); - dialog.setOverlayClose(false); - dialog.show(); + if (decorator.getDialog() == null) { + // Sometimes showDialog will be invoked before decorator was initialized. + // Keep trying again. + Platform.runLater(() -> showDialog(node)); + return; } + if (dialogPane == null) { + dialogPane = new StackContainerPane(); + decorator.getDialog().setContent(dialogPane); + } + + if (dialogPane.isEmpty()) + decorator.getDialog().show(); + dialogPane.push(node); EventHandler handler = event -> closeDialog(node); @@ -319,10 +316,10 @@ public class DecoratorController { if (node instanceof DialogAware) { DialogAware dialogAware = (DialogAware) node; - if (dialog.isVisible()) { + if (decorator.getDialog().isVisible()) { dialogAware.onDialogShown(); } else { - dialog.visibleProperty().addListener(new ChangeListener() { + decorator.getDialog().visibleProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { if (newValue) { @@ -342,13 +339,11 @@ public class DecoratorController { Optional.ofNullable(node.getProperties().get(PROPERTY_DIALOG_CLOSE_HANDLER)) .ifPresent(handler -> node.removeEventHandler(DialogCloseEvent.CLOSE, (EventHandler) handler)); - if (dialog != null) { + if (decorator.getDialog() != null) { dialogPane.pop(node); if (dialogPane.getChildren().isEmpty()) { - dialog.close(); - dialog = null; - dialogPane = null; + decorator.getDialog().close(); } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java index 992207d6d..db77ec665 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorSkin.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.ui.decorator; import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXDialog; import com.jfoenix.svg.SVGGlyph; import javafx.beans.binding.Bindings; import javafx.collections.ListChangeListener; @@ -97,7 +98,17 @@ public class DecoratorSkin extends SkinBase { BorderPane root = new BorderPane(); root.getStyleClass().addAll("jfx-decorator"); wrapper.getChildren().setAll(root); - skinnable.setDrawerWrapper(wrapper); + + JFXDialog dialog = new JFXDialog(); + dialog.setDialogContainer(wrapper); + dialog.setOverlayClose(false); + dialog.addEventHandler(MouseEvent.MOUSE_ENTERED, e -> allowMove = true); + dialog.addEventHandler(MouseEvent.MOUSE_EXITED, e -> { + if (!isDragging) allowMove = false; + }); + + skinnable.setDialog(dialog); + parent.getChildren().add(wrapper); // center node with a animation layer at bottom, a container layer at middle and a "welcome" layer at top.