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());