From f3cd4fb74b9cc4215c841d90229b1649752a184c Mon Sep 17 00:00:00 2001 From: rabbitism Date: Sun, 4 Feb 2024 12:32:08 +0800 Subject: [PATCH] feat: WIP set up interface. --- src/Ursa/Controls/Dialog/DialogControl.cs | 2 +- src/Ursa/Controls/Dialog/OverlayDialogHost.cs | 5 + .../Controls/Drawer/DefaultDrawerControl.cs | 6 ++ src/Ursa/Controls/Drawer/Drawer.cs | 9 +- src/Ursa/Controls/Drawer/DrawerControl.cs | 69 ------------ src/Ursa/Controls/Drawer/DrawerControlBase.cs | 102 ++++++++++++++++++ 6 files changed, 122 insertions(+), 71 deletions(-) create mode 100644 src/Ursa/Controls/Drawer/DefaultDrawerControl.cs delete mode 100644 src/Ursa/Controls/Drawer/DrawerControl.cs create mode 100644 src/Ursa/Controls/Drawer/DrawerControlBase.cs diff --git a/src/Ursa/Controls/Dialog/DialogControl.cs b/src/Ursa/Controls/Dialog/DialogControl.cs index f5138c9..5df18d2 100644 --- a/src/Ursa/Controls/Dialog/DialogControl.cs +++ b/src/Ursa/Controls/Dialog/DialogControl.cs @@ -42,7 +42,7 @@ public class DialogControl: ContentControl remove => RemoveHandler(LayerChangedEvent, value); } - public static readonly RoutedEvent ClosedEvent = RoutedEvent.Register( + public static readonly RoutedEvent ClosedEvent = RoutedEvent.Register( nameof(Closed), RoutingStrategies.Bubble); public event EventHandler Closed diff --git a/src/Ursa/Controls/Dialog/OverlayDialogHost.cs b/src/Ursa/Controls/Dialog/OverlayDialogHost.cs index be302db..cfb43e7 100644 --- a/src/Ursa/Controls/Dialog/OverlayDialogHost.cs +++ b/src/Ursa/Controls/Dialog/OverlayDialogHost.cs @@ -168,6 +168,11 @@ public class OverlayDialogHost : Canvas ResetZIndices(); } + internal void AddDrawer(DrawerControlBase control) + { + + } + private void OnDialogControlClosing(object sender, object? e) { if (sender is DialogControl control) diff --git a/src/Ursa/Controls/Drawer/DefaultDrawerControl.cs b/src/Ursa/Controls/Drawer/DefaultDrawerControl.cs new file mode 100644 index 0000000..c3a937f --- /dev/null +++ b/src/Ursa/Controls/Drawer/DefaultDrawerControl.cs @@ -0,0 +1,6 @@ +namespace Ursa.Controls; + +public class DefaultDrawerControl: DrawerControlBase +{ + +} \ No newline at end of file diff --git a/src/Ursa/Controls/Drawer/Drawer.cs b/src/Ursa/Controls/Drawer/Drawer.cs index e8b3bcd..47469ca 100644 --- a/src/Ursa/Controls/Drawer/Drawer.cs +++ b/src/Ursa/Controls/Drawer/Drawer.cs @@ -2,5 +2,12 @@ public static class Drawer { - + public static Task ShowDialogAsync(TViewModel viewModel) + { + var host = OverlayDialogManager.GetHost(null); + if (host is null) return Task.FromResult(default(TResult)); + var dialog = new DefaultDrawerControl(); + host.AddDrawer(dialog); + return dialog.ShowAsync(); + } } \ No newline at end of file diff --git a/src/Ursa/Controls/Drawer/DrawerControl.cs b/src/Ursa/Controls/Drawer/DrawerControl.cs deleted file mode 100644 index 31dfa3b..0000000 --- a/src/Ursa/Controls/Drawer/DrawerControl.cs +++ /dev/null @@ -1,69 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Interactivity; -using Avalonia.Threading; -using Ursa.Common; -using Ursa.EventArgs; - -namespace Ursa.Controls; - -public class DrawerControl: ContentControl -{ - public static readonly StyledProperty PositionProperty = AvaloniaProperty.Register( - nameof(Position)); - - public Position Position - { - get => GetValue(PositionProperty); - set => SetValue(PositionProperty, value); - } - - public static readonly StyledProperty IsOpenProperty = AvaloniaProperty.Register( - nameof(IsOpen)); - - public bool IsOpen - { - get => GetValue(IsOpenProperty); - set => SetValue(IsOpenProperty, value); - } - - public static readonly RoutedEvent CloseEvent = RoutedEvent.Register( - "Close", RoutingStrategies.Bubble); - - public event EventHandler Close - { - add => AddHandler(CloseEvent, value); - remove => RemoveHandler(CloseEvent, value); - } - - public Task ShowAsync(CancellationToken? token = default) - { - var tcs = new TaskCompletionSource(); - token?.Register(() => - { - Dispatcher.UIThread.Invoke(CloseDrawer); - }); - - void OnCloseHandler(object sender, ResultEventArgs args) - { - if (args is T result) - { - tcs.SetResult(result); - Close -= OnCloseHandler; - } - else - { - tcs.SetResult(default(T)); - Close -= OnCloseHandler; - } - } - - this.Close += OnCloseHandler; - return tcs.Task; - } - - internal void CloseDrawer() - { - - } -} \ No newline at end of file diff --git a/src/Ursa/Controls/Drawer/DrawerControlBase.cs b/src/Ursa/Controls/Drawer/DrawerControlBase.cs new file mode 100644 index 0000000..5cc8eb7 --- /dev/null +++ b/src/Ursa/Controls/Drawer/DrawerControlBase.cs @@ -0,0 +1,102 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Interactivity; +using Avalonia.Threading; +using Ursa.Common; +using Ursa.EventArgs; + +namespace Ursa.Controls; + +public abstract class DrawerControlBase: ContentControl +{ + internal bool CanClickOnMaskToClose { get; set; } + + + public static readonly StyledProperty PositionProperty = AvaloniaProperty.Register( + nameof(Position)); + + public Position Position + { + get => GetValue(PositionProperty); + set => SetValue(PositionProperty, value); + } + + public static readonly StyledProperty IsOpenProperty = AvaloniaProperty.Register( + nameof(IsOpen)); + + public bool IsOpen + { + get => GetValue(IsOpenProperty); + set => SetValue(IsOpenProperty, value); + } + + public static readonly StyledProperty IsCloseButtonVisibleProperty = + AvaloniaProperty.Register( + nameof(IsCloseButtonVisible)); + + public bool IsCloseButtonVisible + { + get => GetValue(IsCloseButtonVisibleProperty); + set => SetValue(IsCloseButtonVisibleProperty, value); + } + + public static readonly RoutedEvent ClosedEvent = RoutedEvent.Register( + nameof(Closed), RoutingStrategies.Bubble); + + public event EventHandler Closed + { + add => AddHandler(ClosedEvent, value); + remove => RemoveHandler(ClosedEvent, value); + } + + static DrawerControlBase() + { + DataContextProperty.Changed.AddClassHandler((o, e) => o.OnDataContextChange(e)); + } + + private void OnDataContextChange(AvaloniaPropertyChangedEventArgs args) + { + if(args.OldValue.Value is IDialogContext oldContext) + { + oldContext.RequestClose -= OnContextRequestClose; + } + if(args.NewValue.Value is IDialogContext newContext) + { + newContext.RequestClose += OnContextRequestClose; + } + } + + private void OnContextRequestClose(object sender, object? e) + { + RaiseEvent(new ResultEventArgs(ClosedEvent, e)); + } + + public Task ShowAsync(CancellationToken? token = default) + { + var tcs = new TaskCompletionSource(); + token?.Register(() => + { + Dispatcher.UIThread.Invoke(CloseDrawer); + }); + + void OnCloseHandler(object sender, ResultEventArgs args) + { + if (args.Result is T result) + { + tcs.SetResult(result); + } + else + { + tcs.SetResult(default(T)); + } + RemoveHandler(ClosedEvent, OnCloseHandler); + } + AddHandler(ClosedEvent, OnCloseHandler); + return tcs.Task; + } + + internal virtual void CloseDrawer() + { + RaiseEvent(new ResultEventArgs(ClosedEvent, null)); + } +} \ No newline at end of file