using System; using System.Threading.Tasks; using System.Windows.Input; namespace Ryujinx.Ava.UI.Helpers { public sealed class MiniCommand : MiniCommand, ICommand { private readonly Action _callback; private bool _busy; private Func _asyncCallback; public MiniCommand(Action callback) { _callback = callback; } public MiniCommand(Func callback) { _asyncCallback = callback; } private bool Busy { get => _busy; set { _busy = value; CanExecuteChanged?.Invoke(this, EventArgs.Empty); } } public override event EventHandler CanExecuteChanged; public override bool CanExecute(object parameter) => !_busy; public override async void Execute(object parameter) { if (Busy) { return; } try { Busy = true; if (_callback != null) { _callback((T)parameter); } else { await _asyncCallback((T)parameter); } } finally { Busy = false; } } } public abstract class MiniCommand : ICommand { public static MiniCommand Create(Action callback) => new MiniCommand(_ => callback()); public static MiniCommand Create(Action callback) => new MiniCommand(callback); public static MiniCommand CreateFromTask(Func callback) => new MiniCommand(_ => callback()); public abstract bool CanExecute(object parameter); public abstract void Execute(object parameter); public abstract event EventHandler CanExecuteChanged; } }