From 7728e00b8343cc2b40b2b9e4390b48bf5b31c089 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Sat, 10 Aug 2024 22:23:13 +0800 Subject: [PATCH] feat: make mask draggable when it's modal and cannot light dismiss. --- .../OverlayShared/OverlayDialogHost.Dialog.cs | 1 + .../OverlayShared/OverlayDialogHost.Drawer.cs | 1 + .../OverlayShared/OverlayDialogHost.Shared.cs | 23 ++++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs index ed38489..5fc4741 100644 --- a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs +++ b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs @@ -119,6 +119,7 @@ public partial class OverlayDialogHost control.RemoveHandler(OverlayFeedbackElement.ClosedEvent, OnDialogControlClosing); control.RemoveHandler(DialogControlBase.LayerChangedEvent, OnDialogLayerChanged); + control.RemoveHandler(PointerPressedEvent, DragMaskToMoveWindow); Children.Remove(control); diff --git a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Drawer.cs b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Drawer.cs index c8da503..15e0cd6 100644 --- a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Drawer.cs +++ b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Drawer.cs @@ -166,6 +166,7 @@ public partial class OverlayDialogHost _modalCount--; IsInModalStatus = _modalCount > 0; layer.Mask.RemoveHandler(PointerPressedEvent, ClickMaskToCloseDialog); + layer.Mask.RemoveHandler(PointerReleasedEvent, DragMaskToMoveWindow); if (!IsAnimationDisabled) { var disappearAnimation = CreateAnimation(control.Bounds.Size, control.Position, false); diff --git a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Shared.cs b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Shared.cs index 8b09769..63db16d 100644 --- a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Shared.cs +++ b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Shared.cs @@ -114,9 +114,29 @@ public partial class OverlayDialogHost: Canvas { rec.AddHandler(PointerReleasedEvent, ClickMaskToCloseDialog); } + else + { + rec.AddHandler(PointerPressedEvent, DragMaskToMoveWindow); + } return rec; } - + + private void DragMaskToMoveWindow(object? sender, PointerPressedEventArgs e) + { + if (!e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) + { + return; + } + if (sender is PureRectangle mask) + { + var window = this.GetVisualAncestors().OfType().FirstOrDefault(); + if(window is not null) + { + window.BeginMoveDrag(e); + } + } + } + private void ClickMaskToCloseDialog(object? sender, PointerReleasedEventArgs e) { if (sender is PureRectangle border) @@ -126,6 +146,7 @@ public partial class OverlayDialogHost: Canvas { layer.Element.Close(); border.RemoveHandler(PointerReleasedEvent, ClickMaskToCloseDialog); + border.RemoveHandler(PointerPressedEvent, DragMaskToMoveWindow); } } }