From 7102a63fe8b9ddb9826a8b46736b93e71030c802 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Thu, 15 Feb 2024 02:50:48 +0800 Subject: [PATCH 1/4] feat: add disable container. --- demo/Ursa.Demo/Models/MenuKeys.cs | 1 + .../Pages/DisableContainerDemo.axaml | 17 +++++++++++ .../Pages/DisableContainerDemo.axaml.cs | 13 +++++++++ .../DisableContainerDemoViewModel.cs | 8 +++++ .../Ursa.Demo/ViewModels/MainViewViewModel.cs | 1 + demo/Ursa.Demo/ViewModels/MenuViewModel.cs | 1 + .../Controls/DisableContainer.axaml | 16 ++++++++++ src/Ursa.Themes.Semi/Controls/_index.axaml | 1 + src/Ursa/Controls/DisableContainer.cs | 29 +++++++++++++++++++ 9 files changed, 87 insertions(+) create mode 100644 demo/Ursa.Demo/Pages/DisableContainerDemo.axaml create mode 100644 demo/Ursa.Demo/Pages/DisableContainerDemo.axaml.cs create mode 100644 demo/Ursa.Demo/ViewModels/DisableContainerDemoViewModel.cs create mode 100644 src/Ursa.Themes.Semi/Controls/DisableContainer.axaml create mode 100644 src/Ursa/Controls/DisableContainer.cs diff --git a/demo/Ursa.Demo/Models/MenuKeys.cs b/demo/Ursa.Demo/Models/MenuKeys.cs index 56e6a49..9740d31 100644 --- a/demo/Ursa.Demo/Models/MenuKeys.cs +++ b/demo/Ursa.Demo/Models/MenuKeys.cs @@ -9,6 +9,7 @@ public static class MenuKeys public const string MenuKeyClassInput = "Class Input"; public const string MenuKeyDialog = "Dialog"; public const string MenuKeyDivider = "Divider"; + public const string MenuKeyDisableContainer = "DisableContainer"; public const string MenuKeyDrawer = "Drawer"; public const string MenuKeyDualBadge = "DualBadge"; public const string MenuKeyEnumSelector = "EnumSelector"; diff --git a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml new file mode 100644 index 0000000..653a15d --- /dev/null +++ b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml.cs b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml.cs new file mode 100644 index 0000000..68b6fbd --- /dev/null +++ b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml.cs @@ -0,0 +1,13 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace Ursa.Demo.Pages; + +public partial class DisableContainerDemo : UserControl +{ + public DisableContainerDemo() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/demo/Ursa.Demo/ViewModels/DisableContainerDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/DisableContainerDemoViewModel.cs new file mode 100644 index 0000000..c214054 --- /dev/null +++ b/demo/Ursa.Demo/ViewModels/DisableContainerDemoViewModel.cs @@ -0,0 +1,8 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace Ursa.Demo.ViewModels; + +public class DisableContainerDemoViewModel: ObservableObject +{ + +} \ No newline at end of file diff --git a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs index 43166bd..4ccb611 100644 --- a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs @@ -31,6 +31,7 @@ public class MainViewViewModel : ViewModelBase MenuKeys.MenuKeyClassInput => new ClassInputDemoViewModel(), MenuKeys.MenuKeyDialog => new DialogDemoViewModel(), MenuKeys.MenuKeyDivider => new DividerDemoViewModel(), + MenuKeys.MenuKeyDisableContainer => new DisableContainerDemoViewModel(), MenuKeys.MenuKeyDrawer => new DrawerDemoViewModel(), MenuKeys.MenuKeyDualBadge => new DualBadgeDemoViewModel(), MenuKeys.MenuKeyEnumSelector => new EnumSelectorDemoViewModel(), diff --git a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs index 6f6da25..a07003e 100644 --- a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs @@ -17,6 +17,7 @@ public class MenuViewModel: ViewModelBase new() { MenuHeader = "Button Group", Key = MenuKeys.MenuKeyButtonGroup, Status = "Updated"}, new() { MenuHeader = "Class Input", Key = MenuKeys.MenuKeyClassInput, Status = "New" }, new() { MenuHeader = "Dialog", Key = MenuKeys.MenuKeyDialog }, + new() { MenuHeader = "Disable Container", Key = MenuKeys.MenuKeyDisableContainer }, new() { MenuHeader = "Divider", Key = MenuKeys.MenuKeyDivider }, new() { MenuHeader = "Drawer", Key = MenuKeys.MenuKeyDrawer }, new() { MenuHeader = "DualBadge", Key = MenuKeys.MenuKeyDualBadge }, diff --git a/src/Ursa.Themes.Semi/Controls/DisableContainer.axaml b/src/Ursa.Themes.Semi/Controls/DisableContainer.axaml new file mode 100644 index 0000000..8df4859 --- /dev/null +++ b/src/Ursa.Themes.Semi/Controls/DisableContainer.axaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + diff --git a/src/Ursa.Themes.Semi/Controls/_index.axaml b/src/Ursa.Themes.Semi/Controls/_index.axaml index 0b2dae5..d5da4b7 100644 --- a/src/Ursa.Themes.Semi/Controls/_index.axaml +++ b/src/Ursa.Themes.Semi/Controls/_index.axaml @@ -7,6 +7,7 @@ + diff --git a/src/Ursa/Controls/DisableContainer.cs b/src/Ursa/Controls/DisableContainer.cs new file mode 100644 index 0000000..f005c41 --- /dev/null +++ b/src/Ursa/Controls/DisableContainer.cs @@ -0,0 +1,29 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Input; +using Avalonia.Metadata; + +namespace Ursa.Controls; + +public class DisableContainer: TemplatedControl +{ + public static readonly StyledProperty ContentProperty = AvaloniaProperty.Register( + nameof(Content)); + + [Content] + public InputElement? Content + { + get => GetValue(ContentProperty); + set => SetValue(ContentProperty, value); + } + + public static readonly StyledProperty DisabledTipProperty = AvaloniaProperty.Register( + nameof(DisabledTip)); + + public object? DisabledTip + { + get => GetValue(DisabledTipProperty); + set => SetValue(DisabledTipProperty, value); + } +} \ No newline at end of file From b38b5deefa6bf0f18e6643c15bcc4ef678395bf6 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Thu, 15 Feb 2024 02:53:27 +0800 Subject: [PATCH 2/4] feat: update demo. --- demo/Ursa.Demo/Pages/DisableContainerDemo.axaml | 3 +++ demo/Ursa.Demo/ViewModels/MenuViewModel.cs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml index 653a15d..80f5848 100644 --- a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml +++ b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml @@ -13,5 +13,8 @@ + + + diff --git a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs index a07003e..dd02c9a 100644 --- a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs @@ -17,7 +17,7 @@ public class MenuViewModel: ViewModelBase new() { MenuHeader = "Button Group", Key = MenuKeys.MenuKeyButtonGroup, Status = "Updated"}, new() { MenuHeader = "Class Input", Key = MenuKeys.MenuKeyClassInput, Status = "New" }, new() { MenuHeader = "Dialog", Key = MenuKeys.MenuKeyDialog }, - new() { MenuHeader = "Disable Container", Key = MenuKeys.MenuKeyDisableContainer }, + new() { MenuHeader = "Disable Container", Key = MenuKeys.MenuKeyDisableContainer, Status = "New"}, new() { MenuHeader = "Divider", Key = MenuKeys.MenuKeyDivider }, new() { MenuHeader = "Drawer", Key = MenuKeys.MenuKeyDrawer }, new() { MenuHeader = "DualBadge", Key = MenuKeys.MenuKeyDualBadge }, From 3b3368be93eb05efab0496f068d44097f741be72 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Thu, 15 Feb 2024 12:33:26 +0800 Subject: [PATCH 3/4] feat: add adorner flavor usage. --- .../Pages/DisableContainerDemo.axaml | 29 ++++++---- .../DisableContainer.cs | 0 .../DisableContainer/DisabledAdorner.cs | 55 +++++++++++++++++++ 3 files changed, 74 insertions(+), 10 deletions(-) rename src/Ursa/Controls/{ => DisableContainer}/DisableContainer.cs (100%) create mode 100644 src/Ursa/Controls/DisableContainer/DisabledAdorner.cs diff --git a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml index 80f5848..c355b01 100644 --- a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml +++ b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml @@ -1,20 +1,29 @@ - + - + - + - + + diff --git a/src/Ursa/Controls/DisableContainer.cs b/src/Ursa/Controls/DisableContainer/DisableContainer.cs similarity index 100% rename from src/Ursa/Controls/DisableContainer.cs rename to src/Ursa/Controls/DisableContainer/DisableContainer.cs diff --git a/src/Ursa/Controls/DisableContainer/DisabledAdorner.cs b/src/Ursa/Controls/DisableContainer/DisabledAdorner.cs new file mode 100644 index 0000000..3699b3a --- /dev/null +++ b/src/Ursa/Controls/DisableContainer/DisabledAdorner.cs @@ -0,0 +1,55 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Data; +using Avalonia.Data.Converters; +using Avalonia.Input; +using Avalonia.Layout; +using Avalonia.Media; +using Ursa.Controls.Shapes; + +namespace Ursa.Controls; + +public class DisabledAdorner +{ + public static readonly AttachedProperty IsEnabledProperty = + AvaloniaProperty.RegisterAttached("IsEnabled"); + + public static void SetIsEnabled(InputElement obj, bool value) => obj.SetValue(IsEnabledProperty, value); + public static bool GetIsEnabled(InputElement obj) => obj.GetValue(IsEnabledProperty); + + public static readonly AttachedProperty DisabledTipProperty = + AvaloniaProperty.RegisterAttached("DisabledTip"); + + public static void SetDisabledTip(InputElement obj, object? value) => obj.SetValue(DisabledTipProperty, value); + public static object? GetDisabledTip(InputElement obj) => obj.GetValue(DisabledTipProperty); + + static DisabledAdorner() + { + IsEnabledProperty.Changed.AddClassHandler(OnIsEnabledChanged); + } + + private static void OnIsEnabledChanged(InputElement arg1, AvaloniaPropertyChangedEventArgs arg2) + { + if (arg2.NewValue.Value) + { + var pureRectangle = new Border() + { + Background = Brushes.Transparent, + IsHitTestVisible = true, + HorizontalAlignment = HorizontalAlignment.Stretch, + VerticalAlignment = VerticalAlignment.Stretch, + Cursor = new Cursor(StandardCursorType.No), + [!ToolTip.TipProperty] = arg1[!DisabledTipProperty], + }; + var binding = arg1.GetObservable(InputElement.IsEnabledProperty, converter: (a) => !a).ToBinding(); + pureRectangle.Bind(Visual.IsVisibleProperty, binding); + AdornerLayer.SetAdorner(arg1, pureRectangle); + } + else + { + AdornerLayer.SetAdorner(arg1, null); + } + + } +} \ No newline at end of file From dce46b927556acd209c01410b24031893c2ef89b Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:19:56 +0800 Subject: [PATCH 4/4] fix: typo. --- demo/Ursa.Demo/Pages/DisableContainerDemo.axaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml index c355b01..2b045f9 100644 --- a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml +++ b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml @@ -17,7 +17,7 @@ - +