MainWindowViewModel_PageList.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using Avalonia.Controls;
  2. using Avalonia.Controls.ApplicationLifetimes;
  3. using Avalonia.Dialogs;
  4. using System;
  5. using System.ComponentModel.DataAnnotations;
  6. using Avalonia;
  7. using MiniMvvm;
  8. using Avalonia.Collections;
  9. using ControlCatalog.Pages;
  10. using System.Threading.Tasks;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. namespace ControlCatalog.ViewModels
  14. {
  15. partial class MainWindowViewModel
  16. {
  17. private int _selectedPageIndex;
  18. private bool _isDrawerOpened = true;
  19. private bool _ignoreListChange = false;
  20. private string? _query = "";
  21. private PageItem? _currentItem;
  22. private SplitViewDisplayMode _displayMode;
  23. private List<PageItem> _items = new()
  24. {
  25. new PageItem("Composition", () => new CompositionPage(), Icons.Layers),
  26. new PageItem("Accelerator", () => new AcceleratorPage(), Icons.Keyboard),
  27. new PageItem("Acrylic", () => new AcrylicPage(), Icons.Blur),
  28. new PageItem("AdornerLayer", () => new AdornerLayerPage(), Icons.Sparkle),
  29. new PageItem("AutoCompleteBox",() => new AutoCompleteBoxPage(), Icons.TextInput),
  30. new PageItem("Border",() => new BorderPage(), Icons.Border),
  31. new PageItem("BitmapCache",() => new BitmapCachePage(), Icons.Lightning),
  32. new PageItem("Buttons",() => new ButtonsPage(), Icons.CursorClick),
  33. new PageItem("ButtonSpinner",() => new ButtonSpinnerPage(), Icons.Spinner),
  34. new PageItem("Calendar",() => new CalendarPage(), Icons.Calendar),
  35. new PageItem("Canvas",() => new CanvasPage(), Icons.Canvas),
  36. new PageItem("CommandBar",() => new CommandBarPage(), Icons.Terminal),
  37. new PageItem("Carousel",() => new Pages.CarouselPage(), Icons.Slides),
  38. new PageItem("CarouselPage",() => new CarouselDemoPage(), Icons.Slides),
  39. new PageItem("CheckBox",() => new CheckBoxPage(), Icons.Checkbox),
  40. new PageItem("Clipboard",() => new ClipboardPage(), Icons.Clipboard),
  41. new PageItem("ColorPicker",() => new ColorPickerPage(), Icons.Palette),
  42. new PageItem("ComboBox",() => new ComboBoxPage(), Icons.Dropdown),
  43. new PageItem("Container Queries",() => new ContainerQueryPage(), Icons.Container),
  44. new PageItem("ContentPage",() => new ContentDemoPage(), Icons.Document),
  45. new PageItem("ContextFlyout",() => new ContextFlyoutPage(), Icons.Menu),
  46. new PageItem("ContextMenu",() => new ContextMenuPage(), Icons.Menu),
  47. new PageItem("Cursor",() => new CursorPage(), Icons.Cursor),
  48. new PageItem("Custom Drawing",() => new CustomDrawing(), Icons.Brush),
  49. new PageItem("DataGrid",() => new DataGridPage(), Icons.Grid),
  50. new PageItem("Data Validation",() => new DataValidationPage(), Icons.Shield),
  51. new PageItem("Date/Time Picker",() => new DateTimePickerPage(), Icons.Clock),
  52. new PageItem("CalendarDatePicker",() => new CalendarDatePickerPage(), Icons.Calendar),
  53. new PageItem("Dialogs",() => new DialogsPage(), Icons.Dialog),
  54. new PageItem("Drag+Drop",() => new DragAndDropPage(), Icons.DragDrop),
  55. new PageItem("DrawerPage",() => new DrawerDemoPage(), Icons.Drawer),
  56. new PageItem("Expander",() => new ExpanderPage(), Icons.Expand),
  57. new PageItem("Flyouts",() => new FlyoutsPage(), Icons.Flyout),
  58. new PageItem("Focus",() => new FocusPage(), Icons.Target),
  59. new PageItem("Gestures",() => new GesturePage(), Icons.Gesture),
  60. new PageItem("Image",() => new ImagePage(), Icons.Image),
  61. new PageItem("Label",() => new LabelsPage(), Icons.Tag),
  62. new PageItem("LayoutTransformControl",() => new LayoutTransformControlPage(), Icons.Transform),
  63. new PageItem("ListBox",() => new ListBoxPage(), Icons.List),
  64. new PageItem("Menu",() => new MenuPage(), Icons.Menu),
  65. new PageItem("NavigationPage",() => new NavigationDemoPage(), Icons.Navigation),
  66. new PageItem("Notifications",() => new NotificationsPage(), Icons.Bell),
  67. new PageItem("NumericUpDown",() => new NumericUpDownPage(), Icons.Number),
  68. new PageItem("OpenGL",() => new OpenGlPage(), Icons.Cube3D),
  69. new PageItem("OpenGL Lease",() => new OpenGlLeasePage(), Icons.Cube3D),
  70. new PageItem("PipsPager",() => new PipsPagerPage(), Icons.HorizontalDots),
  71. new PageItem("Platform Information",() => new PlatformInfoPage(), Icons.Info),
  72. new PageItem("Pointers",() => new PointersPage(), Icons.Cursor),
  73. new PageItem("ProgressBar",() => new ProgressBarPage(), Icons.Progress),
  74. new PageItem("RadioButton",() => new RadioButtonPage(), Icons.Radio),
  75. new PageItem("RefreshContainer",() => new RefreshContainerPage(), Icons.Refresh),
  76. new PageItem("RelativePanel",() => new RelativePanelPage(), Icons.Layout),
  77. new PageItem("ScrollViewer",() => new ScrollViewerPage(), Icons.Scroll),
  78. new PageItem("Slider",() => new SliderPage(), Icons.Tune),
  79. new PageItem("SplitView",() => new SplitViewPage(), Icons.Split),
  80. new PageItem("TabbedPage",() => new TabbedDemoPage(), Icons.Tab),
  81. new PageItem("TabControl",() => new TabControlPage(), Icons.Tab),
  82. new PageItem("TabStrip",() => new TabStripPage(), Icons.Tab),
  83. new PageItem("TextBox",() => new TextBoxPage(), Icons.TextInput),
  84. new PageItem("TextBlock",() => new TextBlockPage(), Icons.TextInput),
  85. new PageItem("Theme Variants",() => new ThemePage(), Icons.Theme),
  86. new PageItem("ToggleSwitch",() => new ToggleSwitchPage(), Icons.Toggle),
  87. new PageItem("ToolTip",() => new ToolTipPage(), Icons.Tooltip),
  88. new PageItem("TransitioningContentControl",() => new TransitioningContentControlPage(), Icons.Transition),
  89. new PageItem("TreeView",() => new TreeViewPage(), Icons.Tree),
  90. new PageItem("Viewbox",() => new ViewboxPage(), Icons.Viewbox),
  91. new PageItem("Native Embed",() => new NativeEmbedPage(), Icons.Puzzle),
  92. new PageItem("Window Customizations",() => new WindowCustomizationsPage(), Icons.Window),
  93. new PageItem("HeaderedContentControl",() => new HeaderedContentPage(), Icons.Header),
  94. new PageItem("Screens",() => new ScreenPage(), Icons.Monitor),
  95. };
  96. public AvaloniaList<PageItem> Pages { get; } = new AvaloniaList<PageItem>();
  97. public void Filter(string? query = "")
  98. {
  99. try
  100. {
  101. _ignoreListChange = true;
  102. Pages.Clear();
  103. if (!string.IsNullOrWhiteSpace(query))
  104. Pages.AddRange(_items.Where(x => x.Header.Contains(query)));
  105. else
  106. Pages.AddRange(_items);
  107. }
  108. finally
  109. {
  110. _ignoreListChange = false;
  111. if (_currentItem != null)
  112. {
  113. var newIndex = Pages.IndexOf(_currentItem);
  114. if (newIndex != -1)
  115. {
  116. SelectedPageIndex = newIndex;
  117. }
  118. }
  119. }
  120. }
  121. public INavigation? Navigator { get; internal set; }
  122. public int SelectedPageIndex
  123. {
  124. get { return _selectedPageIndex; }
  125. set
  126. {
  127. RaiseAndSetIfChanged(ref _selectedPageIndex, value);
  128. if (!_ignoreListChange)
  129. {
  130. NavigateTo(_selectedPageIndex);
  131. if (DisplayMode == SplitViewDisplayMode.CompactOverlay || DisplayMode == SplitViewDisplayMode.Overlay)
  132. IsDrawerOpened = false;
  133. }
  134. }
  135. }
  136. public bool IsDrawerOpened
  137. {
  138. get { return _isDrawerOpened; }
  139. set { RaiseAndSetIfChanged(ref _isDrawerOpened, value); }
  140. }
  141. public SplitViewDisplayMode DisplayMode
  142. {
  143. get { return _displayMode; }
  144. set { RaiseAndSetIfChanged(ref _displayMode, value); }
  145. }
  146. public string? Query
  147. {
  148. get { return _query; }
  149. set
  150. {
  151. RaiseAndSetIfChanged(ref _query, value);
  152. Filter(value);
  153. }
  154. }
  155. private async void NavigateTo(int pageIndex)
  156. {
  157. if (pageIndex < 0 || pageIndex >= Pages.Count || Navigator is null)
  158. return;
  159. var item = Pages[pageIndex];
  160. if (item != null)
  161. {
  162. var view = item.Factory();
  163. if (view is Page page && view.GetType() != Navigator.NavigationStack.LastOrDefault()?.GetType())
  164. {
  165. _currentItem = item;
  166. await Navigator.ReplaceAsync(page);
  167. }
  168. }
  169. }
  170. }
  171. class PageItem(string header, Func<object> factory, string? iconData = null)
  172. {
  173. public string Header { get; } = header;
  174. public Func<object> Factory { get; } = factory;
  175. public string? IconData { get; } = iconData;
  176. public bool IsVisible { get; set; } = true;
  177. }
  178. }