From 9a34ce26204c200f8e38175c6c373687f5890faf Mon Sep 17 00:00:00 2001 From: rabbitism Date: Thu, 8 Feb 2024 23:44:02 +0800 Subject: [PATCH] feat: add a property to show if there is modal dialog available in a host. --- demo/Ursa.Demo/Views/MainView.axaml | 160 +++++++++--------- .../OverlayShared/OverlayDialogHost.Dialog.cs | 9 +- .../OverlayShared/OverlayDialogHost.Shared.cs | 17 +- 3 files changed, 108 insertions(+), 78 deletions(-) diff --git a/demo/Ursa.Demo/Views/MainView.axaml b/demo/Ursa.Demo/Views/MainView.axaml index 31d58a1..956dbe4 100644 --- a/demo/Ursa.Demo/Views/MainView.axaml +++ b/demo/Ursa.Demo/Views/MainView.axaml @@ -16,81 +16,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs index f1aa68f..ddb3342 100644 --- a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs +++ b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs @@ -92,7 +92,7 @@ public partial class OverlayDialogHost Children.Add(mask); } this.Children.Add(control); - _layers.Add(new DialogPair(mask, control)); + _layers.Add(new DialogPair(mask, control, false)); control.Measure(this.Bounds.Size); control.Arrange(new Rect(control.DesiredSize)); SetToPosition(control); @@ -118,6 +118,11 @@ public partial class OverlayDialogHost { await _maskDisappearAnimation.RunAsync(layer.Mask); Children.Remove(layer.Mask); + if (layer.Modal) + { + _modalCount--; + HasModal = _modalCount > 0; + } } ResetZIndices(); @@ -142,6 +147,8 @@ public partial class OverlayDialogHost control.AddHandler(OverlayFeedbackElement.ClosedEvent, OnDialogControlClosing); control.AddHandler(DialogControlBase.LayerChangedEvent, OnDialogLayerChanged); _maskAppearAnimation.RunAsync(mask); + _modalCount++; + HasModal = _modalCount > 0; control.IsClosed = false; } diff --git a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Shared.cs b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Shared.cs index 6296a27..0e90afe 100644 --- a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Shared.cs +++ b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Shared.cs @@ -24,13 +24,28 @@ public partial class OverlayDialogHost: Canvas { internal PureRectangle? Mask; internal OverlayFeedbackElement Element; + internal bool Modal; - public DialogPair(PureRectangle? mask, OverlayFeedbackElement element) + public DialogPair(PureRectangle? mask, OverlayFeedbackElement element, bool modal = true) { Mask = mask; Element = element; + Modal = modal; } } + + private int _modalCount = 0; + + + + public static readonly DirectProperty HasModalProperty = AvaloniaProperty.RegisterDirect( + nameof(HasModal), o => o.HasModal); + private bool _hasModal; + public bool HasModal + { + get => _hasModal; + private set => SetAndRaise(HasModalProperty, ref _hasModal, value); + } static OverlayDialogHost() {