// Copyright © 2017-2026 QL-Win Contributors
//
// This file is part of QuickLook program.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
using System;
using System.Threading.Tasks;
using System.Windows.Input;
namespace QuickLook.Common.Commands;
public class AsyncRelayCommand(Func execute, Func canExecute = null) : ICommand
{
private readonly Func _execute = execute ?? throw new ArgumentNullException(nameof(execute));
private readonly Func _canExecute = canExecute ?? (() => true);
private bool _isExecuting;
public bool CanExecute(object parameter)
{
return !_isExecuting && _canExecute();
}
public async void Execute(object parameter)
{
if (!CanExecute(parameter))
return;
_isExecuting = true;
RaiseCanExecuteChanged();
try
{
await _execute();
}
finally
{
_isExecuting = false;
RaiseCanExecuteChanged();
}
}
public event EventHandler CanExecuteChanged;
public void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
}