diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Builder/ButtonBase/ButtonBaseBuilder.cs b/src/Snap.Hutao/Snap.Hutao/Control/Builder/ButtonBase/ButtonBaseBuilder.cs new file mode 100644 index 00000000..990fa163 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Control/Builder/ButtonBase/ButtonBaseBuilder.cs @@ -0,0 +1,10 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Control.Builder.ButtonBase; + +internal sealed class ButtonBaseBuilder : IButtonBaseBuilder + where TButton : Microsoft.UI.Xaml.Controls.Primitives.ButtonBase, new() +{ + public TButton Button { get; } = new(); +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Builder/ButtonBase/ButtonBaseBuilderExtension.cs b/src/Snap.Hutao/Snap.Hutao/Control/Builder/ButtonBase/ButtonBaseBuilderExtension.cs new file mode 100644 index 00000000..75aaa5d6 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Control/Builder/ButtonBase/ButtonBaseBuilderExtension.cs @@ -0,0 +1,28 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Snap.Hutao.Core.Abstraction; +using Snap.Hutao.Core.Abstraction.Extension; + +namespace Snap.Hutao.Control.Builder.ButtonBase; + +internal static class ButtonBaseBuilderExtension +{ + public static TBuilder SetContent(this TBuilder builder, object? content) + where TBuilder : IButtonBaseBuilder + where TButton : Microsoft.UI.Xaml.Controls.Primitives.ButtonBase + { + builder.Configure(builder => builder.Button.Content = content); + return builder; + } + + public static TBuilder SetCommand(this TBuilder builder, ICommand command) + where TBuilder : IButtonBaseBuilder + where TButton : Microsoft.UI.Xaml.Controls.Primitives.ButtonBase + { + builder.Configure(builder => builder.Button.Command = command); + return builder; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Builder/ButtonBase/IButtonBaseBuilder.cs b/src/Snap.Hutao/Snap.Hutao/Control/Builder/ButtonBase/IButtonBaseBuilder.cs new file mode 100644 index 00000000..6d6a4f9e --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Control/Builder/ButtonBase/IButtonBaseBuilder.cs @@ -0,0 +1,12 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Core.Abstraction; + +namespace Snap.Hutao.Control.Builder.ButtonBase; + +internal interface IButtonBaseBuilder : IBuilder + where TButton : Microsoft.UI.Xaml.Controls.Primitives.ButtonBase +{ + TButton Button { get; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarOptions.cs index d95e646f..f6540daa 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarOptions.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Media.Animation; using Snap.Hutao.Core.Abstraction; using Snap.Hutao.Core.Abstraction.Extension; @@ -20,5 +21,7 @@ internal sealed class InfoBarOptions public object? Content { get; set; } + public ButtonBase? ActionButton { get; set; } + public int MilliSecondsDelay { get; set; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarOptionsBuilderExtension.cs b/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarOptionsBuilderExtension.cs index f683ec38..10f13fc1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarOptionsBuilderExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarOptionsBuilderExtension.cs @@ -2,39 +2,55 @@ // Licensed under the MIT license. using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Snap.Hutao.Control.Builder.ButtonBase; using Snap.Hutao.Core.Abstraction.Extension; namespace Snap.Hutao.Service.Notification; internal static class InfoBarOptionsBuilderExtension { - public static IInfoBarOptionsBuilder SetSeverity(this IInfoBarOptionsBuilder builder, InfoBarSeverity severity) + public static TBuilder SetSeverity(this TBuilder builder, InfoBarSeverity severity) + where TBuilder : IInfoBarOptionsBuilder { builder.Configure(builder => builder.Options.Severity = severity); return builder; } - public static IInfoBarOptionsBuilder SetTitle(this IInfoBarOptionsBuilder builder, string? title) + public static TBuilder SetTitle(this TBuilder builder, string? title) + where TBuilder : IInfoBarOptionsBuilder { builder.Configure(builder => builder.Options.Title = title); return builder; } - public static IInfoBarOptionsBuilder SetMessage(this IInfoBarOptionsBuilder builder, string? message) + public static IInfoBarOptionsBuilder SetMessage(this TBuilder builder, string? message) + where TBuilder : IInfoBarOptionsBuilder { builder.Configure(builder => builder.Options.Message = message); return builder; } - public static IInfoBarOptionsBuilder SetContent(this IInfoBarOptionsBuilder builder, object? content) + public static IInfoBarOptionsBuilder SetContent(this TBuilder builder, object? content) + where TBuilder : IInfoBarOptionsBuilder { builder.Configure(builder => builder.Options.Content = content); return builder; } - public static IInfoBarOptionsBuilder SetDelay(this IInfoBarOptionsBuilder builder, int milliSeconds) + public static IInfoBarOptionsBuilder SetActionButton(this TBuilder builder, Action> configureButton) + where TBuilder : IInfoBarOptionsBuilder + where TButton : ButtonBase, new() + { + ButtonBaseBuilder buttonBaseBuilder = new ButtonBaseBuilder().Configure(configureButton); + builder.Configure(builder => builder.Options.ActionButton = buttonBaseBuilder.Button); + return builder; + } + + public static IInfoBarOptionsBuilder SetDelay(this TBuilder builder, int milliSeconds) + where TBuilder : IInfoBarOptionsBuilder { builder.Configure(builder => builder.Options.MilliSecondsDelay = milliSeconds); return builder; } -} \ No newline at end of file +} diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarService.cs index 4c98ca88..7cc80586 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Notification/InfoBarService.cs @@ -58,6 +58,7 @@ internal sealed class InfoBarService : IInfoBarService Message = builder.Options.Message, Content = builder.Options.Content, IsOpen = true, + ActionButton = builder.Options.ActionButton, Transitions = [new AddDeleteThemeTransition()], };