AvaloniaMenuItem.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. var task = action();
  50. task.ContinueWith(task =>
  51. {
  52. if (task.Exception is not null)
  53. {
  54. MobileLogging.Log(task.Exception);
  55. }
  56. });
  57. }
  58. });
  59. //_contextMenu = new();
  60. //LoadMenuItems(build().Items,_contextMenu.Items);
  61. }
  62. public static void LoadMenuItems(IEnumerable<ICoreMenuItem> sourceItems, ItemCollection targetItems)
  63. {
  64. foreach (var sourceItem in sourceItems)
  65. if (sourceItem is CoreMenuSeparator)
  66. {
  67. targetItems.Add(new Separator());
  68. }
  69. else if (sourceItem is CoreMenuItem<IImage> item)
  70. {
  71. if(item.IsVisible is null || item.IsVisible())
  72. {
  73. var targetItem = new MenuItem
  74. {
  75. Header = item.Header,
  76. Icon = new Image { Source = item.Image },
  77. Command = item.Action != null
  78. ? new RelayCommand(() => item.Action())
  79. : null
  80. };
  81. targetItems.Add(targetItem);
  82. }
  83. }
  84. else if (sourceItem is CoreMenuHeader<IImage> header)
  85. {
  86. var targetItem = new MenuItem
  87. {
  88. Header = header.Header,
  89. Icon = header.Image
  90. };
  91. LoadMenuItems(header.Items, targetItem.Items);
  92. targetItems.Add(targetItem);
  93. }
  94. }
  95. }