From 60d6fe8785dc41db62b7f857965014a917f7078e Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Mon, 10 Jun 2024 22:29:18 +0100 Subject: [PATCH] Dialog deferrals --- Toolkit.Avalonia/ContentDialogHandler.cs | 45 +++++++++++++++++++++++- Toolkit.Foundation/IActivityIndicator.cs | 6 ++++ Toolkit.Foundation/Observable.cs | 13 ++++--- 3 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 Toolkit.Foundation/IActivityIndicator.cs diff --git a/Toolkit.Avalonia/ContentDialogHandler.cs b/Toolkit.Avalonia/ContentDialogHandler.cs index a637460..ccaae57 100644 --- a/Toolkit.Avalonia/ContentDialogHandler.cs +++ b/Toolkit.Avalonia/ContentDialogHandler.cs @@ -1,4 +1,5 @@ -using Toolkit.Foundation; +using FluentAvalonia.Core; +using Toolkit.Foundation; using Toolkit.UI.Controls.Avalonia; namespace Toolkit.Avalonia; @@ -20,11 +21,25 @@ public class ContentDialogHandler(IDispatcher dispatcher) : { if (content is IPrimaryConfirmation primaryConfirmation) { + List postActions = []; + if (content is IActivityIndicator activityIndicator) + { + activityIndicator.Active = true; + postActions.Add(() => activityIndicator.Active = false); + } + + Deferral deferral = args.GetDeferral(); if (!await primaryConfirmation.Confirm()) { args.Cancel = true; contentDialog.PrimaryButtonClick += HandlePrimaryButtonClick; } + + deferral.Complete(); + foreach (Action action in postActions) + { + action.Invoke(); + } } } } @@ -37,11 +52,25 @@ public class ContentDialogHandler(IDispatcher dispatcher) : { if (content is ISecondaryConfirmation secondaryConfirmation) { + List postActions = []; + if (content is IActivityIndicator activityIndicator) + { + activityIndicator.Active = true; + postActions.Add(() => activityIndicator.Active = false); + } + + Deferral deferral = args.GetDeferral(); if (!await secondaryConfirmation.Confirm()) { args.Cancel = true; contentDialog.SecondaryButtonClick += HandleSecondaryButtonClick; } + + deferral.Complete(); + foreach (Action action in postActions) + { + action.Invoke(); + } } } } @@ -57,11 +86,25 @@ public class ContentDialogHandler(IDispatcher dispatcher) : { if (content is IConfirmation confirmation) { + List postActions = []; + if (content is IActivityIndicator activityIndicator) + { + activityIndicator.Active = true; + postActions.Add(() => activityIndicator.Active = false); + } + + Deferral deferral = args.GetDeferral(); if (!await confirmation.Confirm()) { args.Cancel = true; contentDialog.Closing += HandleClosing; } + + deferral.Complete(); + foreach (Action action in postActions) + { + action.Invoke(); + } } } } diff --git a/Toolkit.Foundation/IActivityIndicator.cs b/Toolkit.Foundation/IActivityIndicator.cs new file mode 100644 index 0000000..91968d0 --- /dev/null +++ b/Toolkit.Foundation/IActivityIndicator.cs @@ -0,0 +1,6 @@ +namespace Toolkit.Foundation; + +public interface IActivityIndicator +{ + bool Active { get; set; } +} \ No newline at end of file diff --git a/Toolkit.Foundation/Observable.cs b/Toolkit.Foundation/Observable.cs index e15c5a8..54ead02 100644 --- a/Toolkit.Foundation/Observable.cs +++ b/Toolkit.Foundation/Observable.cs @@ -5,6 +5,7 @@ namespace Toolkit.Foundation; public partial class Observable : ObservableObject, IObservableViewModel, + IActivityIndicator, IInitializer, IActivated, IDeactivating, @@ -20,9 +21,13 @@ public partial class Observable : private readonly Dictionary trackedProperties = []; [ObservableProperty] - private bool isInitialized; + private bool initialized; - public Observable(IServiceProvider provider, + [ObservableProperty] + private bool active; + + public Observable(IServiceProvider + provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -72,12 +77,12 @@ public partial class Observable : public Task Initialize() { - if (IsInitialized) + if (Initialized) { return Task.CompletedTask; } - IsInitialized = true; + Initialized = true; return Task.CompletedTask; }