diff --git a/Toolkit.Avalonia/ContentDialogHandler.cs b/Toolkit.Avalonia/ContentDialogHandler.cs index ccd6493..20d5b40 100644 --- a/Toolkit.Avalonia/ContentDialogHandler.cs +++ b/Toolkit.Avalonia/ContentDialogHandler.cs @@ -9,15 +9,15 @@ public class ContentDialogHandler : { public async Task Handle(NavigateEventArgs args) { - if (args.Template is ContentDialog contentDialog) + if (args.Template is ContentDialog dialog) { - contentDialog.DataContext = args.Content; + dialog.DataContext = args.Content; async void HandlePrimaryButtonClick(FluentAvalonia.UI.Controls.ContentDialog sender, FluentAvalonia.UI.Controls.ContentDialogButtonClickEventArgs args) { - contentDialog.PrimaryButtonClick -= HandlePrimaryButtonClick; - if (contentDialog.DataContext is object content) + dialog.PrimaryButtonClick -= HandlePrimaryButtonClick; + if (dialog.DataContext is object content) { if (content is IPrimaryConfirmation primaryConfirmation) { @@ -25,7 +25,7 @@ public class ContentDialogHandler : if (!await primaryConfirmation.ConfirmPrimary()) { args.Cancel = true; - contentDialog.PrimaryButtonClick += HandlePrimaryButtonClick; + dialog.PrimaryButtonClick += HandlePrimaryButtonClick; } deferral.Complete(); @@ -36,16 +36,16 @@ public class ContentDialogHandler : async void HandleSecondaryButtonClick(FluentAvalonia.UI.Controls.ContentDialog sender, FluentAvalonia.UI.Controls.ContentDialogButtonClickEventArgs args) { - contentDialog.SecondaryButtonClick -= HandleSecondaryButtonClick; - if (contentDialog.DataContext is object content) + dialog.SecondaryButtonClick -= HandleSecondaryButtonClick; + if (dialog.DataContext is object content) { if (content is ISecondaryConfirmation secondaryConfirmation) { Deferral deferral = args.GetDeferral(); - if (!await secondaryConfirmation.Confirm()) + if (!await secondaryConfirmation.ConfirmSecondary()) { args.Cancel = true; - contentDialog.SecondaryButtonClick += HandleSecondaryButtonClick; + dialog.SecondaryButtonClick += HandleSecondaryButtonClick; } deferral.Complete(); @@ -56,11 +56,11 @@ public class ContentDialogHandler : async void HandleClosing(FluentAvalonia.UI.Controls.ContentDialog sender, FluentAvalonia.UI.Controls.ContentDialogClosingEventArgs args) { - if (args.Result == FluentAvalonia.UI.Controls.ContentDialogResult.Primary || - args.Result == FluentAvalonia.UI.Controls.ContentDialogResult.Secondary) + if (args.Result is FluentAvalonia.UI.Controls.ContentDialogResult.Primary || + args.Result is FluentAvalonia.UI.Controls.ContentDialogResult.Secondary) { - contentDialog.Closing -= HandleClosing; - if (contentDialog.DataContext is object content) + dialog.Closing -= HandleClosing; + if (dialog.DataContext is object content) { bool cancelled = false; if (content is IConfirmation confirmation) @@ -71,7 +71,7 @@ public class ContentDialogHandler : args.Cancel = true; cancelled = true; - contentDialog.Closing += HandleClosing; + dialog.Closing += HandleClosing; } deferral.Complete(); @@ -91,8 +91,8 @@ public class ContentDialogHandler : async void HandleOpened(FluentAvalonia.UI.Controls.ContentDialog sender, EventArgs args) { - contentDialog.Opened -= HandleOpened; - if (contentDialog.DataContext is object content) + dialog.Opened -= HandleOpened; + if (dialog.DataContext is object content) { if (content is IActivated activated) { @@ -104,8 +104,8 @@ public class ContentDialogHandler : async void HandleClosed(FluentAvalonia.UI.Controls.ContentDialog sender, FluentAvalonia.UI.Controls.ContentDialogClosedEventArgs args) { - contentDialog.Closed -= HandleClosed; - if (contentDialog.DataContext is object content) + dialog.Closed -= HandleClosed; + if (dialog.DataContext is object content) { if (content is IDeactivated deactivated) { @@ -114,17 +114,17 @@ public class ContentDialogHandler : } } - contentDialog.Opened += HandleOpened; - contentDialog.Closing += HandleClosing; - contentDialog.Closed += HandleClosed; + dialog.Opened += HandleOpened; + dialog.Closing += HandleClosing; + dialog.Closed += HandleClosed; - contentDialog.PrimaryButtonClick += HandlePrimaryButtonClick; - contentDialog.SecondaryButtonClick += HandleSecondaryButtonClick; + dialog.PrimaryButtonClick += HandlePrimaryButtonClick; + dialog.SecondaryButtonClick += HandleSecondaryButtonClick; - await contentDialog.ShowAsync(); + await dialog.ShowAsync(); - contentDialog.PrimaryButtonClick += HandlePrimaryButtonClick; - contentDialog.SecondaryButtonClick += HandleSecondaryButtonClick; + dialog.PrimaryButtonClick += HandlePrimaryButtonClick; + dialog.SecondaryButtonClick += HandleSecondaryButtonClick; } } } \ No newline at end of file diff --git a/Toolkit.Avalonia/IServiceCollectionExtensions.cs b/Toolkit.Avalonia/IServiceCollectionExtensions.cs index f593f84..b3957c7 100644 --- a/Toolkit.Avalonia/IServiceCollectionExtensions.cs +++ b/Toolkit.Avalonia/IServiceCollectionExtensions.cs @@ -35,6 +35,7 @@ public static class IServiceCollectionExtensions services.AddHandler(nameof(ContentControl)); services.AddHandler(nameof(Frame)); services.AddHandler(nameof(ContentDialog)); + services.AddHandler(nameof(TaskDialog)); services.AddScoped(provider => new NavigationRegionCollection { @@ -67,6 +68,7 @@ public static class IServiceCollectionExtensions services.AddHandler(nameof(ContentControl)); services.AddHandler(nameof(Frame)); services.AddHandler(nameof(ContentDialog)); + services.AddHandler(nameof(TaskDialog)); }))); return services; diff --git a/Toolkit.Avalonia/TaskDialogHandler.cs b/Toolkit.Avalonia/TaskDialogHandler.cs new file mode 100644 index 0000000..d528894 --- /dev/null +++ b/Toolkit.Avalonia/TaskDialogHandler.cs @@ -0,0 +1,61 @@ +using Avalonia.Controls; +using FluentAvalonia.Core; +using Toolkit.Foundation; +using Toolkit.UI.Controls.Avalonia; + +namespace Toolkit.Avalonia; + +public class TaskDialogHandler(ITopLevelProvider topLevelProvider) : + INotificationHandler> +{ + public async Task Handle(NavigateEventArgs args) + { + if (args.Template is TaskDialog dialog) + { + if (topLevelProvider.Get() is TopLevel topLevel) + { + dialog.XamlRoot = topLevel; + dialog.DataContext = args.Content; + + async void HandleClosing(FluentAvalonia.UI.Controls.TaskDialog sender, + FluentAvalonia.UI.Controls.TaskDialogClosingEventArgs args) + { + dialog.Closing -= HandleClosing; + if (dialog.DataContext is object content) + { + bool cancelled = false; + + if (args.Result is TaskDialogResult result) + { + if (result is TaskDialogResult.OK && content is + IPrimaryConfirmation primaryConfirmation) + { + Deferral deferral = args.GetDeferral(); + if (!await primaryConfirmation.ConfirmPrimary()) + { + args.Cancel = true; + cancelled = true; + + dialog.Closing += HandleClosing; + } + + deferral.Complete(); + } + } + + if (!cancelled) + { + if (content is IDeactivating deactivating) + { + await deactivating.OnDeactivating(); + } + } + } + } + + dialog.Closing += HandleClosing; + await dialog.ShowAsync(); + } + } + } +} diff --git a/Toolkit.Foundation/ISecondaryConfirmation.cs b/Toolkit.Foundation/ISecondaryConfirmation.cs index f2588ad..dd4d66b 100644 --- a/Toolkit.Foundation/ISecondaryConfirmation.cs +++ b/Toolkit.Foundation/ISecondaryConfirmation.cs @@ -2,5 +2,5 @@ public interface ISecondaryConfirmation { - Task Confirm(); + Task ConfirmSecondary(); } \ No newline at end of file diff --git a/Toolkit.UI.Controls.Avalonia/AppWindow/AppWindow.cs b/Toolkit.UI.Controls.Avalonia/AppWindow/AppWindow.cs index b9c369b..9f5338e 100644 --- a/Toolkit.UI.Controls.Avalonia/AppWindow/AppWindow.cs +++ b/Toolkit.UI.Controls.Avalonia/AppWindow/AppWindow.cs @@ -1,7 +1,15 @@ -namespace Toolkit.UI.Controls.Avalonia; +using Avalonia.Controls.Chrome; + +namespace Toolkit.UI.Controls.Avalonia; public class AppWindow : FluentAvalonia.UI.Windowing.AppWindow { protected override Type StyleKeyOverride => typeof(FluentAvalonia.UI.Windowing.AppWindow); + + public AppWindow() + { + TitleBar.ExtendsContentIntoTitleBar = true; + TitleBar.TitleBarHitTestType = FluentAvalonia.UI.Windowing.TitleBarHitTestType.Complex; + } } \ No newline at end of file diff --git a/Toolkit.UI.Controls.Avalonia/CardContent/CardContent.axaml b/Toolkit.UI.Controls.Avalonia/CardContent/CardContent.axaml deleted file mode 100644 index b02cd6b..0000000 --- a/Toolkit.UI.Controls.Avalonia/CardContent/CardContent.axaml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Toolkit.UI.Controls.Avalonia/ContentCard/ContentCard.axaml b/Toolkit.UI.Controls.Avalonia/ContentCard/ContentCard.axaml new file mode 100644 index 0000000..4692718 --- /dev/null +++ b/Toolkit.UI.Controls.Avalonia/ContentCard/ContentCard.axaml @@ -0,0 +1,33 @@ + + 16 + + + + + + + + + + + + + + + diff --git a/Toolkit.UI.Controls.Avalonia/CardContent/CardContent.cs b/Toolkit.UI.Controls.Avalonia/ContentCard/ContentCard.cs similarity index 63% rename from Toolkit.UI.Controls.Avalonia/CardContent/CardContent.cs rename to Toolkit.UI.Controls.Avalonia/ContentCard/ContentCard.cs index b666bc1..07b178a 100644 --- a/Toolkit.UI.Controls.Avalonia/CardContent/CardContent.cs +++ b/Toolkit.UI.Controls.Avalonia/ContentCard/ContentCard.cs @@ -2,6 +2,6 @@ namespace Toolkit.UI.Controls.Avalonia; -public class CardContent : ContentControl +public class ContentCard : ContentControl { } diff --git a/Toolkit.UI.Controls.Avalonia/ImageCropper/ImageCropper.axaml b/Toolkit.UI.Controls.Avalonia/ImageCropper/ImageCropper.axaml index 84cbda8..ca9bacd 100644 --- a/Toolkit.UI.Controls.Avalonia/ImageCropper/ImageCropper.axaml +++ b/Toolkit.UI.Controls.Avalonia/ImageCropper/ImageCropper.axaml @@ -6,12 +6,12 @@ - + - + 10 @@ -29,10 +29,10 @@ + CornerRadius="{DynamicResource ImageCropperOuterThumbCornerRadius}"> + typeof(FluentAvalonia.UI.Controls.TaskDialog); +} \ No newline at end of file diff --git a/Toolkit.UI.Controls.Avalonia/TaskDialog/TaskDialogButton.cs b/Toolkit.UI.Controls.Avalonia/TaskDialog/TaskDialogButton.cs new file mode 100644 index 0000000..ef3cc2e --- /dev/null +++ b/Toolkit.UI.Controls.Avalonia/TaskDialog/TaskDialogButton.cs @@ -0,0 +1,4 @@ +namespace Toolkit.UI.Controls.Avalonia; + +public class TaskDialogButton : + FluentAvalonia.UI.Controls.TaskDialogButton; diff --git a/Toolkit.UI.Controls.Avalonia/TaskDialog/TaskDialogResult.cs b/Toolkit.UI.Controls.Avalonia/TaskDialog/TaskDialogResult.cs new file mode 100644 index 0000000..fbe56cd --- /dev/null +++ b/Toolkit.UI.Controls.Avalonia/TaskDialog/TaskDialogResult.cs @@ -0,0 +1,12 @@ +namespace Toolkit.UI.Controls.Avalonia; + +public enum TaskDialogResult +{ + None, + OK, + Cancel, + Yes, + No, + Retry, + Close +} \ No newline at end of file diff --git a/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml b/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml index d337845..cfa360a 100644 --- a/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml +++ b/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml @@ -2,6 +2,8 @@ /Fonts/#FluentSystemIcons-Resizable + 60 0 12 9 + 18 0 12 9 @@ -70,6 +72,7 @@ +