diff --git a/demo/Ursa.Demo/Models/MenuKeys.cs b/demo/Ursa.Demo/Models/MenuKeys.cs index 530349b..f6a52e3 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..2b045f9 --- /dev/null +++ b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + 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 d8c0cb4..699c59d 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 c24db24..429f98b 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, Status = "New"}, 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 dee8aee..04e03e5 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/DisableContainer.cs b/src/Ursa/Controls/DisableContainer/DisableContainer.cs new file mode 100644 index 0000000..f005c41 --- /dev/null +++ b/src/Ursa/Controls/DisableContainer/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 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