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); public object? SelectedItem { get => GetValue(SelectedItemProperty); set => SetValue(SelectedItemProperty, value); } public static readonly StyledProperty IconBindingProperty = AvaloniaProperty.Register( nameof(IconBinding)); [AssignBinding] [InheritDataTypeFromItems(nameof(ItemsSource))] public IBinding? IconBinding { get => GetValue(IconBindingProperty); set => SetValue(IconBindingProperty, value); } public static readonly StyledProperty HeaderBindingProperty = AvaloniaProperty.Register( nameof(HeaderBinding)); [AssignBinding] [InheritDataTypeFromItems(nameof(ItemsSource))] public IBinding? HeaderBinding { get => GetValue(HeaderBindingProperty); set => SetValue(HeaderBindingProperty, value); } public static readonly StyledProperty SubMenuBindingProperty = AvaloniaProperty.Register( nameof(SubMenuBinding)); [AssignBinding] [InheritDataTypeFromItems(nameof(ItemsSource))] public IBinding? SubMenuBinding { get => GetValue(SubMenuBindingProperty); set => SetValue(SubMenuBindingProperty, value); } public static readonly StyledProperty CommandBindingProperty = AvaloniaProperty.Register( nameof(CommandBinding)); [AssignBinding] [InheritDataTypeFromItems(nameof(ItemsSource))] public IBinding? CommandBinding { get => GetValue(CommandBindingProperty); set => SetValue(CommandBindingProperty, value); } public static readonly StyledProperty HeaderTemplateProperty = AvaloniaProperty.Register( nameof(HeaderTemplate)); public IDataTemplate? HeaderTemplate { get => GetValue(HeaderTemplateProperty); set => SetValue(HeaderTemplateProperty, value); } public static readonly StyledProperty IconTemplateProperty = AvaloniaProperty.Register( nameof(IconTemplate)); public IDataTemplate? IconTemplate { get => GetValue(IconTemplateProperty); 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) { Debug.WriteLine(args.NewValue.Value); } protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey) { return NeedsContainer(item, out recycleKey); } protected override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey) { return new NavMenuItem(); } internal void SelectItem(NavMenuItem item, NavMenuItem parent) { // if (item.IsSelected) return; foreach (var child in LogicalChildren) { if (child == parent) { continue; } if (child is NavMenuItem navMenuItem) { navMenuItem.ClearSelection(); } } if (item.DataContext is not null && item.DataContext != this.DataContext) { SelectedItem = item.DataContext; } else { SelectedItem = item; } item.IsSelected = true; } }