AvaloniaModuleCollection.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Avalonia.Svg.Skia;
  7. using CommunityToolkit.Mvvm.ComponentModel;
  8. using CommunityToolkit.Mvvm.Input;
  9. using InABox.Core;
  10. namespace InABox.Avalonia.Components;
  11. public partial class AvaloniaModuleCollection : ObservableObject
  12. {
  13. [ObservableProperty] private ObservableCollection<AvaloniaModule> _items = new();
  14. public AvaloniaModule? this[string name] => Items.FirstOrDefault(x => Equals(x.Title, name));
  15. [ObservableProperty] private AvaloniaModule[] _visibleItems = [];
  16. public AvaloniaModuleCollection()
  17. {
  18. Items.CollectionChanged += (sender, args) => UpdateVisibleItems();
  19. }
  20. public void Add()
  21. {
  22. var module = new AvaloniaModule();
  23. module.PropertyChanged += DoPropertyChanged;
  24. Items.Add(module);
  25. }
  26. private void DoPropertyChanged(object? sender, PropertyChangedEventArgs e)
  27. {
  28. if (e.PropertyName == nameof(AvaloniaModule.IsVisible))
  29. UpdateVisibleItems();
  30. }
  31. private void UpdateVisibleItems()
  32. {
  33. VisibleItems = Items.Where(x=>x.IsVisible == true).ToArray();
  34. }
  35. public AvaloniaModule Add(string title, string description, SvgImage? image, Action action, bool? isVisible = null
  36. /* Func<PrsModule, Task>? configure = null */)
  37. {
  38. var module = new AvaloniaModule
  39. {
  40. Title = title,
  41. Description = description,
  42. Image = image,
  43. TapCommand = new RelayCommand(action),
  44. IsVisible = isVisible ?? true
  45. };
  46. module.PropertyChanged += DoPropertyChanged;
  47. Items.Add(module);
  48. // _ = configure?.Invoke(module);
  49. return module;
  50. }
  51. public AvaloniaModule Add<TViewModel>(string title, string description, SvgImage? image,
  52. /* Func<PrsModule, Task>? configure = null */ Action<TViewModel>? configure = null, bool? isVisible = null)
  53. where TViewModel : IViewModelBase
  54. {
  55. var module = new AvaloniaModule
  56. {
  57. Title = title,
  58. Description = description,
  59. Image = image,
  60. TapCommand = new RelayCommand(() => Navigation.Navigate<TViewModel>(configure)),
  61. IsVisible = isVisible ?? true
  62. };
  63. module.PropertyChanged += DoPropertyChanged;
  64. Items.Add(module);
  65. // _ = configure?.Invoke(module);
  66. return module;
  67. }
  68. public AvaloniaModule? Add<TToken, TViewModel>(string title, string description, SvgImage? image,
  69. /* Func<PrsModule, Task>? configure = null */ Action<TViewModel>? configure = null, bool? isVisible = null)
  70. where TToken : ISecurityDescriptor, new()
  71. where TViewModel : IViewModelBase
  72. {
  73. if (Security.IsAllowed<TToken>())
  74. return Add<TViewModel>(title, description, image, configure, isVisible);
  75. return null;
  76. }
  77. }