using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Threading.Tasks; using System.Windows.Input; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Ursa.Controls; namespace Ursa.Demo.ViewModels; public class NavMenuDemoViewModel: ObservableObject { private MenuItem? _selectedMenuItem; public MenuItem? SelectedMenuItem { get=>_selectedMenuItem; set => SetProperty(ref _selectedMenuItem, value); } public ObservableCollection MenuItems { get; set; } = new ObservableCollection { new MenuItem { Header = "Introduction" , Children = { new MenuItem() { Header = "Getting Started", Children = { new MenuItem() { Header = "Code of Conduct" }, new MenuItem() { Header = "How to Contribute" }, new MenuItem() { Header = "Development Workflow" }, }}, new MenuItem() { Header = "Design Principles"}, new MenuItem() { Header = "Contributing", Children = { new MenuItem() { Header = "Code of Conduct" }, new MenuItem() { Header = "How to Contribute" }, new MenuItem() { Header = "Development Workflow" }, }}, }}, new MenuItem { Header = "Controls", IsSeparator = true}, new MenuItem { Header = "Badge" }, new MenuItem { Header = "Banner" }, new MenuItem { Header = "ButtonGroup" }, new MenuItem { Header = "Class Input" }, new MenuItem { Header = "Dialog" }, new MenuItem { Header = "Divider" }, new MenuItem { Header = "Drawer" }, new MenuItem { Header = "DualBadge" }, new MenuItem { Header = "EnumSelector" }, new MenuItem { Header = "ImageViewer" }, new MenuItem { Header = "IPv4Box" }, new MenuItem { Header = "IconButton" }, new MenuItem { Header = "KeyGestureInput" }, new MenuItem { Header = "Loading" }, new MenuItem { Header = "MessageBox" }, new MenuItem { Header = "Navigation" }, new MenuItem { Header = "NavMenu" }, new MenuItem { Header = "NumericUpDown" }, new MenuItem { Header = "Pagination" }, new MenuItem { Header = "RangeSlider" }, new MenuItem { Header = "SelectionList" }, new MenuItem { Header = "TagInput" }, new MenuItem { Header = "Timeline" }, new MenuItem { Header = "TwoTonePathIcon" }, new MenuItem { Header = "ThemeToggler" } }; public ICommand RandomCommand { get; set; } public NavMenuDemoViewModel() { RandomCommand = new RelayCommand(OnRandom); } private void OnRandom() { var items = GetLeaves(); var index = new Random().Next(items.Count); SelectedMenuItem = items[index]; } private List GetLeaves() { List items = new(); foreach (var item in MenuItems) { items.AddRange(item.GetLeaves()); } return items; } } public class MenuItem { static Random r = new Random(); public string? Header { get; set; } public int IconIndex { get; set; } public bool IsSeparator { get; set; } public ICommand NavigationCommand { get; set; } public MenuItem() { NavigationCommand = new AsyncRelayCommand(OnNavigate); IconIndex = r.Next(100); } private async Task OnNavigate() { await MessageBox.ShowOverlayAsync(Header??string.Empty, "Navigation Result"); } public ObservableCollection Children { get; set; } = new ObservableCollection(); public IEnumerable GetLeaves() { if (this.Children.Count == 0) { yield return this; yield break; } foreach (var child in Children) { var items = child.GetLeaves(); foreach (var item in items) { yield return item; } } } }