feat: update to finish functionality, start to build theme.

This commit is contained in:
rabbitism
2023-06-23 02:46:37 +08:00
parent bacf1a6330
commit c21e571b74
7 changed files with 475 additions and 62 deletions

View File

@@ -3,6 +3,7 @@ using System.Collections.Specialized;
using Avalonia;
using Avalonia.Collections;
using Avalonia.Controls;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
@@ -12,8 +13,14 @@ using Avalonia.Metadata;
namespace Ursa.Controls;
public class NavigationMenu: HeaderedSelectingItemsControl
[PseudoClasses(PC_Closed)]
[TemplatePart(Name = PART_CloseButton, Type = typeof(ToggleButton))]
public class NavigationMenu: HeaderedItemsControl
{
public const string PC_Closed = ":closed";
public const string PART_CloseButton = "PART_CloseButton";
public static readonly StyledProperty<object?> FooterProperty = AvaloniaProperty.Register<NavigationMenu, object?>(
nameof(Footer));
@@ -32,13 +39,82 @@ public class NavigationMenu: HeaderedSelectingItemsControl
set => SetValue(FooterTemplateProperty, value);
}
public static readonly StyledProperty<object?> SelectedMenuItemProperty = AvaloniaProperty.Register<NavigationMenu, object?>(
nameof(SelectedMenuItem));
public static readonly StyledProperty<object?> IconProperty = AvaloniaProperty.Register<NavigationMenu, object?>(
nameof(Icon));
public object? SelectedMenuItem
public object? Icon
{
get => GetValue(SelectedMenuItemProperty);
set => SetValue(SelectedMenuItemProperty, value);
get => GetValue(IconProperty);
set => SetValue(IconProperty, value);
}
public static readonly StyledProperty<object?> SelectedItemProperty = AvaloniaProperty.Register<NavigationMenu, object?>(
nameof(SelectedItem));
public object? SelectedItem
{
get => GetValue(SelectedItemProperty);
set => SetValue(SelectedItemProperty, value);
}
public static readonly StyledProperty<bool> ShowCollapseButtonProperty = AvaloniaProperty.Register<NavigationMenu, bool>(
nameof(ShowCollapseButton));
public bool ShowCollapseButton
{
get => GetValue(ShowCollapseButtonProperty);
set => SetValue(ShowCollapseButtonProperty, value);
}
public static readonly StyledProperty<bool> IsClosedProperty = AvaloniaProperty.Register<NavigationMenu, bool>(
nameof(IsClosed));
public bool IsClosed
{
get => GetValue(IsClosedProperty);
set => SetValue(IsClosedProperty, value);
}
public static readonly StyledProperty<double> OpenedWidthProperty = AvaloniaProperty.Register<NavigationMenu, double>(
nameof(OpenedWidth));
public double OpenedWidth
{
get => GetValue(OpenedWidthProperty);
set => SetValue(OpenedWidthProperty, value);
}
public static readonly StyledProperty<double> ClosedWidthProperty = AvaloniaProperty.Register<NavigationMenu, double>(
nameof(ClosedWidth));
public double ClosedWidth
{
get => GetValue(ClosedWidthProperty);
set => SetValue(ClosedWidthProperty, value);
}
static NavigationMenu()
{
SelectedItemProperty.Changed.AddClassHandler<NavigationMenu>((o, e) => o.OnSelectionItemChanged(e));
IsClosedProperty.Changed.AddClassHandler<NavigationMenu>((o,e)=>o.OnIsClosedChanged(e));
}
private void OnSelectionItemChanged(AvaloniaPropertyChangedEventArgs args)
{
var newItem = args.GetNewValue<object?>();
if (newItem is not null)
{
UpdateSelectionFromSelectedItem(newItem);
}
}
private void OnIsClosedChanged(AvaloniaPropertyChangedEventArgs args)
{
bool newValue = args.GetNewValue<bool>();
PseudoClasses.Set(PC_Closed, newValue);
}
internal void UpdateSelection(NavigationMenuItem source)
@@ -48,15 +124,7 @@ public class NavigationMenu: HeaderedSelectingItemsControl
{
foreach (var child in children)
{
NavigationMenuItem? item = null;
if (child is NavigationMenuItem i)
{
item = i;
}
else if (child is ContentPresenter { Child: NavigationMenuItem i2 })
{
item = i2;
}
NavigationMenuItem? item = NavigationMenuItem.GetMenuItemFromControl(child);
if (item != null)
{
if(Equals(item, source)) continue;
@@ -65,4 +133,18 @@ public class NavigationMenu: HeaderedSelectingItemsControl
}
}
}
private void UpdateSelectionFromSelectedItem(object? o)
{
var children = this.ItemsPanelRoot?.Children;
if (children is not null)
{
foreach (var child in children)
{
NavigationMenuItem? item = NavigationMenuItem.GetMenuItemFromControl(child);
if(item is null) continue;
item.UpdateSelectionFromSelectedItem(o);
}
}
}
}