You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.9 KiB
50 lines
1.9 KiB
1 year ago
|
using System.Diagnostics.CodeAnalysis;
|
||
|
using System.Threading.Tasks;
|
||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||
|
using CommunityToolkit.Mvvm.Input;
|
||
|
using StabilityMatrix.Core.Models.Progress;
|
||
|
|
||
|
namespace StabilityMatrix.Avalonia.ViewModels.Base;
|
||
|
|
||
|
[SuppressMessage("ReSharper", "VirtualMemberNeverOverridden.Global")]
|
||
|
public abstract partial class PausableProgressItemViewModelBase : ProgressItemViewModelBase
|
||
|
{
|
||
|
[ObservableProperty]
|
||
|
[NotifyPropertyChangedFor(nameof(IsPaused), nameof(IsCompleted), nameof(CanPauseResume), nameof(CanCancel))]
|
||
|
private ProgressState state = ProgressState.Inactive;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Whether the progress is paused
|
||
|
/// </summary>
|
||
|
public bool IsPaused => State == ProgressState.Inactive;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Whether the progress has succeeded, failed or was cancelled
|
||
|
/// </summary>
|
||
|
public override bool IsCompleted => State is ProgressState.Success or ProgressState.Failed or ProgressState.Cancelled;
|
||
|
|
||
|
public virtual bool SupportsPauseResume => true;
|
||
|
public virtual bool SupportsCancel => true;
|
||
|
|
||
|
public bool CanPauseResume => SupportsPauseResume && !IsCompleted;
|
||
|
public bool CanCancel => SupportsCancel && !IsCompleted;
|
||
|
|
||
|
private AsyncRelayCommand? pauseCommand;
|
||
|
public IAsyncRelayCommand PauseCommand => pauseCommand ??= new AsyncRelayCommand(Pause);
|
||
|
public virtual Task Pause() => Task.CompletedTask;
|
||
|
|
||
|
private AsyncRelayCommand? resumeCommand;
|
||
|
public IAsyncRelayCommand ResumeCommand => resumeCommand ??= new AsyncRelayCommand(Resume);
|
||
|
public virtual Task Resume() => Task.CompletedTask;
|
||
|
|
||
|
private AsyncRelayCommand? cancelCommand;
|
||
|
public IAsyncRelayCommand CancelCommand => cancelCommand ??= new AsyncRelayCommand(Cancel);
|
||
|
public virtual Task Cancel() => Task.CompletedTask;
|
||
|
|
||
|
[RelayCommand]
|
||
|
private Task TogglePauseResume()
|
||
|
{
|
||
|
return IsPaused ? Resume() : Pause();
|
||
|
}
|
||
|
}
|