From fbde529912c2c208edfc062ddaa6a136ebd207dd Mon Sep 17 00:00:00 2001 From: NeuralFault Date: Thu, 30 Jul 2026 00:40:45 +0000 Subject: [PATCH] fix: exclude failed items from "Clear Finished" bulk operation in activity view - Add `IsClearable` virtual property to `ProgressItemViewModelBase` that excludes `Failed` items (only `Progress.Value >= 100 && !Failed`) - Override `IsClearable` in `PausableProgressItemViewModelBase` to match only `Success` and `Cancelled` states, keeping `Failed` items visible - Update `ClearDownloads()` to filter on `IsClearable` instead of `IsCompleted` so failed downloads with retry/dismiss buttons are preserved - `IsCompleted` retains its existing behavior (all terminal states) for UI gating of progress spinners, pause/cancel controls, etc. --- .../ViewModels/Base/PausableProgressItemViewModelBase.cs | 7 +++++++ .../ViewModels/Base/ProgressItemViewModelBase.cs | 2 ++ .../ViewModels/Progress/ProgressManagerViewModel.cs | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/StabilityMatrix.Avalonia/ViewModels/Base/PausableProgressItemViewModelBase.cs b/StabilityMatrix.Avalonia/ViewModels/Base/PausableProgressItemViewModelBase.cs index 695da5b6f..26e25ccda 100644 --- a/StabilityMatrix.Avalonia/ViewModels/Base/PausableProgressItemViewModelBase.cs +++ b/StabilityMatrix.Avalonia/ViewModels/Base/PausableProgressItemViewModelBase.cs @@ -32,6 +32,13 @@ public abstract partial class PausableProgressItemViewModelBase : ProgressItemVi public override bool IsCompleted => State is ProgressState.Success or ProgressState.Failed or ProgressState.Cancelled; + /// + /// Whether the item should be removed by a "Clear Finished" bulk operation. + /// Unlike , this excludes + /// so that items with retry/dismiss buttons remain visible. + /// + public override bool IsClearable => State is ProgressState.Success or ProgressState.Cancelled; + public virtual bool SupportsPauseResume => true; public virtual bool SupportsCancel => true; diff --git a/StabilityMatrix.Avalonia/ViewModels/Base/ProgressItemViewModelBase.cs b/StabilityMatrix.Avalonia/ViewModels/Base/ProgressItemViewModelBase.cs index 1ef8eac1c..1ddd5bc44 100644 --- a/StabilityMatrix.Avalonia/ViewModels/Base/ProgressItemViewModelBase.cs +++ b/StabilityMatrix.Avalonia/ViewModels/Base/ProgressItemViewModelBase.cs @@ -16,5 +16,7 @@ public abstract partial class ProgressItemViewModelBase : ViewModelBase public virtual bool IsCompleted => Progress.Value >= 100 || Failed; + public virtual bool IsClearable => Progress.Value >= 100 && !Failed; + public ContentDialogProgressViewModelBase Progress { get; init; } = new(); } diff --git a/StabilityMatrix.Avalonia/ViewModels/Progress/ProgressManagerViewModel.cs b/StabilityMatrix.Avalonia/ViewModels/Progress/ProgressManagerViewModel.cs index 883d8f366..3f80b9aa3 100644 --- a/StabilityMatrix.Avalonia/ViewModels/Progress/ProgressManagerViewModel.cs +++ b/StabilityMatrix.Avalonia/ViewModels/Progress/ProgressManagerViewModel.cs @@ -401,7 +401,7 @@ public void StartEventListener() public void ClearDownloads() { - ProgressItems.RemoveAll(ProgressItems.Where(x => x.IsCompleted)); + ProgressItems.RemoveAll(ProgressItems.Where(x => x.IsClearable)); } private void OnProgressChanged(object? sender, ProgressItem e)