| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 | using Avalonia.Controls;using Avalonia.Media;using CommunityToolkit.Mvvm.ComponentModel;using CommunityToolkit.Mvvm.Input;using InABox.Core;namespace InABox.Avalonia.Components;public partial class AvaloniaMenuItem : ObservableObject{    [ObservableProperty]     private RelayCommand<List<AvaloniaMenuItem>>? _buildMenuCommand;    [ObservableProperty]     private ContextMenu? _contextMenu;    [ObservableProperty]     private IImage? _image;    [ObservableProperty]     private RelayCommand? _tapCommand;    [ObservableProperty]     private bool _isVisible = true;    public AvaloniaMenuItem()    {    }    public AvaloniaMenuItem(IImage? image, Func<Task<bool>> action)        : this(image, () => null, action)    {    }    public AvaloniaMenuItem(IImage? image, Action action)        : this(image, () => null, () =>        {            action();            return Task.FromResult(true);        })    {    }    public AvaloniaMenuItem(IImage? image, Func<CoreMenu<IImage>?> build, Func<Task<bool>>? action = null)    {        Image = image; //LoadImage(image);        TapCommand = new RelayCommand(() =>        {            CoreMenu<IImage>? menu = build();            if (menu != null)            {                var context = new ContextMenu();                LoadMenuItems(menu.Items, context.Items);                ContextMenu = context;                ContextMenu.Open();            }            else if (action != null)            {                var task = action();                task.ContinueWith(task =>                {                    if (task.Exception is not null)                    {                        MobileLogging.Log(task.Exception);                    }                });            }        });        //_contextMenu = new();        //LoadMenuItems(build().Items,_contextMenu.Items);    }        public static void LoadMenuItems(IEnumerable<ICoreMenuItem> sourceItems, ItemCollection targetItems)    {        foreach (var sourceItem in sourceItems)            if (sourceItem is CoreMenuSeparator)            {                targetItems.Add(new Separator());            }            else if (sourceItem is CoreMenuItem<IImage> item)            {                if(item.IsVisible is null || item.IsVisible())                {                    var targetItem = new MenuItem                    {                        Header = item.Header,                        Icon = new Image { Source = item.Image },                        Command = item.Action != null                            ? new RelayCommand(() => item.Action())                            : null                    };                    targetItems.Add(targetItem);                }            }            else if (sourceItem is CoreMenuHeader<IImage> header)            {                var targetItem = new MenuItem                {                    Header = header.Header,                    Icon = header.Image                };                LoadMenuItems(header.Items, targetItem.Items);                targetItems.Add(targetItem);            }    }}
 |