diff --git a/src/Spectre.Console.Tests/Unit/Progress/ProgressTests.cs b/src/Spectre.Console.Tests/Unit/Progress/ProgressTests.cs
index a0f93fc..5893bf6 100644
--- a/src/Spectre.Console.Tests/Unit/Progress/ProgressTests.cs
+++ b/src/Spectre.Console.Tests/Unit/Progress/ProgressTests.cs
@@ -184,5 +184,36 @@ namespace Spectre.Console.Tests.Unit
// Then
task.Value.ShouldBe(60);
}
+
+ [Fact]
+ public void Should_Hide_Completed_Tasks()
+ {
+ // Given
+ var task = default(ProgressTask);
+ var console = new FakeAnsiConsole(ColorSystem.TrueColor, width: 10);
+
+ var progress = new Progress(console)
+ .Columns(new[] { new ProgressBarColumn() })
+ .AutoRefresh(false)
+ .AutoClear(false)
+ .HideCompleted(true);
+
+ // When
+ progress.Start(ctx =>
+ {
+ task = ctx.AddTask("foo");
+ task.Value = task.MaxValue;
+ });
+
+ // Then
+ console.Output
+ .NormalizeLineEndings()
+ .ShouldBe(
+ "[?25l" + // Hide cursor
+ " \n" + // top padding
+ "…\n" + // hidden task
+ " \n" + // bottom padding
+ "[?25h"); // show cursor
+ }
}
}
diff --git a/src/Spectre.Console/Extensions/Progress/ProgressExtensions.cs b/src/Spectre.Console/Extensions/Progress/ProgressExtensions.cs
index cf8d8a9..ea21081 100644
--- a/src/Spectre.Console/Extensions/Progress/ProgressExtensions.cs
+++ b/src/Spectre.Console/Extensions/Progress/ProgressExtensions.cs
@@ -75,5 +75,25 @@ namespace Spectre.Console
return progress;
}
+
+ ///
+ /// Sets whether or not hide completed is enabled.
+ /// If enabled, the task tabled will be removed once it is
+ /// completed.
+ ///
+ /// The instance.
+ /// Whether or not hide completed is enabled.
+ /// The same instance so that multiple calls can be chained.
+ public static Progress HideCompleted(this Progress progress, bool enabled)
+ {
+ if (progress is null)
+ {
+ throw new ArgumentNullException(nameof(progress));
+ }
+
+ progress.HideCompleted = enabled;
+
+ return progress;
+ }
}
}
diff --git a/src/Spectre.Console/Widgets/Progress/Progress.cs b/src/Spectre.Console/Widgets/Progress/Progress.cs
index ca072fe..8fc1e91 100644
--- a/src/Spectre.Console/Widgets/Progress/Progress.cs
+++ b/src/Spectre.Console/Widgets/Progress/Progress.cs
@@ -25,6 +25,13 @@ namespace Spectre.Console
///
public bool AutoClear { get; set; }
+ ///
+ /// Gets or sets a value indicating whether or not the task list should
+ /// only include tasks not completed
+ /// Defaults to false.
+ ///
+ public bool HideCompleted { get; set; }
+
///
/// Gets or sets the refresh rate if AutoRefresh is enabled.
/// Defaults to 10 times/second.
@@ -153,7 +160,7 @@ namespace Spectre.Console
if (interactive)
{
var columns = new List(Columns);
- return new DefaultProgressRenderer(_console, columns, RefreshRate);
+ return new DefaultProgressRenderer(_console, columns, RefreshRate, HideCompleted);
}
else
{
diff --git a/src/Spectre.Console/Widgets/Progress/Renderers/DefaultProgressRenderer.cs b/src/Spectre.Console/Widgets/Progress/Renderers/DefaultProgressRenderer.cs
index 2051b1b..25db5f0 100644
--- a/src/Spectre.Console/Widgets/Progress/Renderers/DefaultProgressRenderer.cs
+++ b/src/Spectre.Console/Widgets/Progress/Renderers/DefaultProgressRenderer.cs
@@ -14,10 +14,11 @@ namespace Spectre.Console
private readonly object _lock;
private readonly Stopwatch _stopwatch;
private TimeSpan _lastUpdate;
+ private bool _hideCompleted;
public override TimeSpan RefreshRate { get; }
- public DefaultProgressRenderer(IAnsiConsole console, List columns, TimeSpan refreshRate)
+ public DefaultProgressRenderer(IAnsiConsole console, List columns, TimeSpan refreshRate, bool hideCompleted)
{
_console = console ?? throw new ArgumentNullException(nameof(console));
_columns = columns ?? throw new ArgumentNullException(nameof(columns));
@@ -25,6 +26,7 @@ namespace Spectre.Console
_lock = new object();
_stopwatch = new Stopwatch();
_lastUpdate = TimeSpan.Zero;
+ _hideCompleted = hideCompleted;
RefreshRate = refreshRate;
}
@@ -91,7 +93,7 @@ namespace Spectre.Console
}
// Add rows
- foreach (var task in context.GetTasks())
+ foreach (var task in context.GetTasks().Where(tsk => !(_hideCompleted && tsk.IsFinished)))
{
var columns = _columns.Select(column => column.Render(renderContext, task, delta));
grid.AddRow(columns.ToArray());