AvaloniaMenuItem.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using Avalonia.Controls;
  2. using Avalonia.Media;
  3. using CommunityToolkit.Mvvm.ComponentModel;
  4. using CommunityToolkit.Mvvm.Input;
  5. using InABox.Core;
  6. namespace InABox.Avalonia.Components;
  7. public partial class AvaloniaMenuItem : ObservableObject
  8. {
  9. [ObservableProperty]
  10. private RelayCommand<List<AvaloniaMenuItem>>? _buildMenuCommand;
  11. [ObservableProperty]
  12. private ContextMenu? _contextMenu;
  13. [ObservableProperty]
  14. private IImage? _image;
  15. [ObservableProperty]
  16. private RelayCommand? _tapCommand;
  17. [ObservableProperty]
  18. private bool _isVisible = true;
  19. public AvaloniaMenuItem()
  20. {
  21. }
  22. public AvaloniaMenuItem(IImage? image, Func<Task<bool>> action)
  23. : this(image, () => null, action)
  24. {
  25. }
  26. public AvaloniaMenuItem(IImage? image, Action action)
  27. : this(image, () => null, () =>
  28. {
  29. action();
  30. return Task.FromResult(true);
  31. })
  32. {
  33. }
  34. public AvaloniaMenuItem(IImage? image, Func<CoreMenu<IImage>?> build, Func<Task<bool>>? action = null)
  35. {
  36. Image = image; //LoadImage(image);
  37. TapCommand = new RelayCommand(() =>
  38. {
  39. CoreMenu<IImage>? menu = build();
  40. if (menu != null)
  41. {
  42. var context = new ContextMenu();
  43. LoadMenuItems(menu.Items, context.Items);
  44. ContextMenu = context;
  45. ContextMenu.Open();
  46. }
  47. else if (action != null)
  48. {
  49. _ = action();
  50. }
  51. });
  52. //_contextMenu = new();
  53. //LoadMenuItems(build().Items,_contextMenu.Items);
  54. }
  55. public static void LoadMenuItems(IEnumerable<ICoreMenuItem> sourceItems, ItemCollection targetItems)
  56. {
  57. foreach (var sourceItem in sourceItems)
  58. if (sourceItem is CoreMenuSeparator)
  59. {
  60. targetItems.Add(new Separator());
  61. }
  62. else if (sourceItem is CoreMenuItem<IImage> item)
  63. {
  64. if(item.IsVisible is null || item.IsVisible())
  65. {
  66. var targetItem = new MenuItem
  67. {
  68. Header = item.Header,
  69. Icon = new Image { Source = item.Image },
  70. Command = item.Action != null
  71. ? new RelayCommand(() => item.Action())
  72. : null
  73. };
  74. targetItems.Add(targetItem);
  75. }
  76. }
  77. else if (sourceItem is CoreMenuHeader<IImage> header)
  78. {
  79. var targetItem = new MenuItem
  80. {
  81. Header = header.Header,
  82. Icon = header.Image
  83. };
  84. LoadMenuItems(header.Items, targetItem.Items);
  85. targetItems.Add(targetItem);
  86. }
  87. }
  88. }