diff --git a/src/Ursa/Controls/NavMenu/NavMenu.cs b/src/Ursa/Controls/NavMenu/NavMenu.cs index 851dbb2..9e4d41a 100644 --- a/src/Ursa/Controls/NavMenu/NavMenu.cs +++ b/src/Ursa/Controls/NavMenu/NavMenu.cs @@ -1,16 +1,21 @@ using System.Diagnostics; using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.LogicalTree; using Avalonia.Metadata; +using Irihi.Avalonia.Shared.Helpers; namespace Ursa.Controls; +[PseudoClasses(PC_HorizontalCollapsed)] public class NavMenu: ItemsControl { + public const string PC_HorizontalCollapsed = ":horizontal-collapsed"; + public static readonly StyledProperty SelectedItemProperty = AvaloniaProperty.Register( nameof(SelectedItem), defaultBindingMode: BindingMode.TwoWay); @@ -82,9 +87,28 @@ public class NavMenu: ItemsControl set => SetValue(IconTemplateProperty, value); } + public static readonly StyledProperty SubMenuIndentProperty = AvaloniaProperty.Register( + nameof(SubMenuIndent), defaultValue: 20.0); + + public double SubMenuIndent + { + get => GetValue(SubMenuIndentProperty); + set => SetValue(SubMenuIndentProperty, value); + } + + public static readonly StyledProperty IsHorizontalCollapsedProperty = AvaloniaProperty.Register( + nameof(IsHorizontalCollapsed)); + + public bool IsHorizontalCollapsed + { + get => GetValue(IsHorizontalCollapsedProperty); + set => SetValue(IsHorizontalCollapsedProperty, value); + } + static NavMenu() { SelectedItemProperty.Changed.AddClassHandler((o, e) => o.OnSelectedItemChange(e)); + PropertyToPseudoClassMixin.Attach(IsHorizontalCollapsedProperty, PC_HorizontalCollapsed); } private void OnSelectedItemChange(AvaloniaPropertyChangedEventArgs args) diff --git a/src/Ursa/Controls/NavMenu/NavMenuItem.cs b/src/Ursa/Controls/NavMenu/NavMenuItem.cs index 8737ab8..b5a1baf 100644 --- a/src/Ursa/Controls/NavMenu/NavMenuItem.cs +++ b/src/Ursa/Controls/NavMenu/NavMenuItem.cs @@ -13,17 +13,14 @@ namespace Ursa.Controls; /// /// Navigation Menu Item -/// Note: -/// collapsed: Entire menu is collapsed, only first level icon is displayed. Submenus are in popup. -/// closed: When menu is not in collapsed mode, represents whether submenu is hidden. /// -[PseudoClasses(PC_Highlighted, PC_Collapsed, PC_Closed, PC_FirstLevel, PC_Selector)] +[PseudoClasses(PC_Highlighted, PC_HorizontalCollapsed, PC_VerticalCollapsed, PC_FirstLevel, PC_Selector)] public class NavMenuItem: HeaderedSelectingItemsControl { public const string PC_Highlighted = ":highlighted"; public const string PC_FirstLevel = ":first-level"; - public const string PC_Collapsed = ":collapsed"; - public const string PC_Closed = ":closed"; + public const string PC_HorizontalCollapsed = ":horizontal-collapsed"; + public const string PC_VerticalCollapsed = ":vertical-collapsed"; public const string PC_Selector = ":selector"; private NavMenu? _rootMenu; @@ -84,37 +81,38 @@ public class NavMenuItem: HeaderedSelectingItemsControl private set => SetAndRaise(IsHighlightedProperty, ref _isHighlighted, value); } - private bool _isCollapsed; + public static readonly StyledProperty SubMenuIndentProperty = + NavMenu.SubMenuIndentProperty.AddOwner(); - public static readonly DirectProperty IsCollapsedProperty = AvaloniaProperty.RegisterDirect( - nameof(IsCollapsed), o => o.IsCollapsed, (o, v) => o.IsCollapsed = v); - - public bool IsCollapsed + public double SubMenuIndent { - get => _isCollapsed; - set => SetAndRaise(IsCollapsedProperty, ref _isCollapsed, value); + get => GetValue(SubMenuIndentProperty); + set => SetValue(SubMenuIndentProperty, value); } - private bool _isClosed; + - public static readonly DirectProperty IsClosedProperty = AvaloniaProperty.RegisterDirect( - nameof(IsClosed), o => o.IsClosed, (o, v) => o.IsClosed = v); - - public bool IsClosed + internal static readonly DirectProperty LevelProperty = AvaloniaProperty.RegisterDirect( + nameof(Level), o => o.Level, (o, v) => o.Level = v); + private int _level; + internal int Level { - get => _isClosed; - set => SetAndRaise(IsClosedProperty, ref _isClosed, value); + get => _level; + set => SetAndRaise(LevelProperty, ref _level, value); } - - internal int Level { get; set; } - static NavMenuItem() { SelectableMixin.Attach(IsSelectedProperty); PressedMixin.Attach(); IsHighlightedProperty.Changed.AddClassHandler((o, e) => o.OnIsHighlightedChange(e)); + LevelProperty.Changed.AddClassHandler((item, args) => item.OnLevelChange(args)); + } + + private void OnLevelChange(AvaloniaPropertyChangedEventArgs args) + { + PseudoClasses.Set(PC_FirstLevel, args.NewValue.Value == 0); } private void OnIsHighlightedChange(AvaloniaPropertyChangedEventArgs args) @@ -164,8 +162,7 @@ public class NavMenuItem: HeaderedSelectingItemsControl { var children = this.ItemsPanelRoot?.Children.ToList(); base.OnApplyTemplate(e); - Level = CalculateDistanceFromLogicalParent(this); - PseudoClasses.Set(PC_FirstLevel, Level == 0); + SetCurrentValue(LevelProperty,CalculateDistanceFromLogicalParent(this)); } protected override void OnPointerPressed(PointerPressedEventArgs e) diff --git a/src/Ursa/Ursa.csproj b/src/Ursa/Ursa.csproj index a0a7163..6057345 100644 --- a/src/Ursa/Ursa.csproj +++ b/src/Ursa/Ursa.csproj @@ -14,7 +14,7 @@ - +