From 3c504155bc29dac86854df3ca6aa61932168ed55 Mon Sep 17 00:00:00 2001 From: Patrik Svensson Date: Fri, 4 Dec 2020 10:11:12 +0100 Subject: [PATCH] Fix progress rendering bug --- .../ProgressTests.Foo.verified.txt | 5 +++ .../Tools/DummyCursor.cs | 17 ++++++++++ .../Tools/PlainConsole.cs | 2 +- .../Tools/TestLinkIdentityGenerator.cs | 2 +- .../Tools/TestableAnsiConsole.cs | 1 - .../Unit/ProgressTests.cs | 33 +++++++++++++++++++ .../Progress/Columns/RemainingTimeColumn.cs | 6 ++++ .../Progress/Columns/SpinnerColumn.cs | 6 ++++ .../Progress/Columns/TaskDescriptionColumn.cs | 5 ++- .../Progress/ProgressColumn.cs | 5 +++ .../Renderers/InteractiveProgressRenderer.cs | 6 ++++ src/Spectre.Console/Widgets/Padder.cs | 5 +++ 12 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 src/Spectre.Console.Tests/Expectations/ProgressTests.Foo.verified.txt create mode 100644 src/Spectre.Console.Tests/Tools/DummyCursor.cs diff --git a/src/Spectre.Console.Tests/Expectations/ProgressTests.Foo.verified.txt b/src/Spectre.Console.Tests/Expectations/ProgressTests.Foo.verified.txt new file mode 100644 index 0000000..c81f6e0 --- /dev/null +++ b/src/Spectre.Console.Tests/Expectations/ProgressTests.Foo.verified.txt @@ -0,0 +1,5 @@ + +foo ━━━ 0% -:--:-- ⣷ +bar ━━━ 0% -:--:-- ⣷ +baz ━━━ 0% -:--:-- ⣷ + diff --git a/src/Spectre.Console.Tests/Tools/DummyCursor.cs b/src/Spectre.Console.Tests/Tools/DummyCursor.cs new file mode 100644 index 0000000..fe1f75a --- /dev/null +++ b/src/Spectre.Console.Tests/Tools/DummyCursor.cs @@ -0,0 +1,17 @@ +namespace Spectre.Console.Tests +{ + public sealed class DummyCursor : IAnsiConsoleCursor + { + public void Move(CursorDirection direction, int steps) + { + } + + public void SetPosition(int column, int line) + { + } + + public void Show(bool show) + { + } + } +} diff --git a/src/Spectre.Console.Tests/Tools/PlainConsole.cs b/src/Spectre.Console.Tests/Tools/PlainConsole.cs index 12b7c84..105d056 100644 --- a/src/Spectre.Console.Tests/Tools/PlainConsole.cs +++ b/src/Spectre.Console.Tests/Tools/PlainConsole.cs @@ -11,7 +11,7 @@ namespace Spectre.Console.Tests { public Capabilities Capabilities { get; } public Encoding Encoding { get; } - public IAnsiConsoleCursor Cursor => throw new NotSupportedException(); + public IAnsiConsoleCursor Cursor => new DummyCursor(); public TestableConsoleInput Input { get; } public int Width { get; } diff --git a/src/Spectre.Console.Tests/Tools/TestLinkIdentityGenerator.cs b/src/Spectre.Console.Tests/Tools/TestLinkIdentityGenerator.cs index 4302eb6..0a34220 100644 --- a/src/Spectre.Console.Tests/Tools/TestLinkIdentityGenerator.cs +++ b/src/Spectre.Console.Tests/Tools/TestLinkIdentityGenerator.cs @@ -1,4 +1,4 @@ -namespace Spectre.Console.Tests.Tools +namespace Spectre.Console.Tests { public sealed class TestLinkIdentityGenerator : ILinkIdentityGenerator { diff --git a/src/Spectre.Console.Tests/Tools/TestableAnsiConsole.cs b/src/Spectre.Console.Tests/Tools/TestableAnsiConsole.cs index 0cd8122..48af9d4 100644 --- a/src/Spectre.Console.Tests/Tools/TestableAnsiConsole.cs +++ b/src/Spectre.Console.Tests/Tools/TestableAnsiConsole.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Text; using Spectre.Console.Rendering; -using Spectre.Console.Tests.Tools; namespace Spectre.Console.Tests { diff --git a/src/Spectre.Console.Tests/Unit/ProgressTests.cs b/src/Spectre.Console.Tests/Unit/ProgressTests.cs index ac330c2..5bb724c 100644 --- a/src/Spectre.Console.Tests/Unit/ProgressTests.cs +++ b/src/Spectre.Console.Tests/Unit/ProgressTests.cs @@ -1,8 +1,11 @@ +using System.Threading.Tasks; using Shouldly; +using VerifyXunit; using Xunit; namespace Spectre.Console.Tests.Unit { + [UsesVerify] public sealed class ProgressTests { [Fact] @@ -54,5 +57,35 @@ namespace Spectre.Console.Tests.Unit " \n" + // Bottom padding "[?25h"); // show cursor } + + [Fact] + public Task Foo() + { + // Given + var console = new PlainConsole(width: 20); + + var progress = new Progress(console) + .Columns(new ProgressColumn[] + { + new TaskDescriptionColumn(), + new ProgressBarColumn(), + new PercentageColumn(), + new RemainingTimeColumn(), + new SpinnerColumn(), + }) + .AutoRefresh(false) + .AutoClear(false); + + // When + progress.Start(ctx => + { + ctx.AddTask("foo"); + ctx.AddTask("bar"); + ctx.AddTask("baz"); + }); + + // Then + return Verifier.Verify(console.Output); + } } } diff --git a/src/Spectre.Console/Progress/Columns/RemainingTimeColumn.cs b/src/Spectre.Console/Progress/Columns/RemainingTimeColumn.cs index 7c0a970..3b008d3 100644 --- a/src/Spectre.Console/Progress/Columns/RemainingTimeColumn.cs +++ b/src/Spectre.Console/Progress/Columns/RemainingTimeColumn.cs @@ -8,6 +8,12 @@ namespace Spectre.Console /// public sealed class RemainingTimeColumn : ProgressColumn { + /// + protected internal override int? ColumnWidth => 7; + + /// + protected internal override bool NoWrap => true; + /// /// Gets or sets the style of the remaining time text. /// diff --git a/src/Spectre.Console/Progress/Columns/SpinnerColumn.cs b/src/Spectre.Console/Progress/Columns/SpinnerColumn.cs index b32d711..f7f51d1 100644 --- a/src/Spectre.Console/Progress/Columns/SpinnerColumn.cs +++ b/src/Spectre.Console/Progress/Columns/SpinnerColumn.cs @@ -14,6 +14,12 @@ namespace Spectre.Console private readonly string _ansiSequence = "⣷⣯⣟⡿⢿⣻⣽⣾"; private readonly string _asciiSequence = "-\\|/-\\|/"; + /// + protected internal override int? ColumnWidth => 1; + + /// + protected internal override bool NoWrap => true; + /// /// Gets or sets the style of the spinner. /// diff --git a/src/Spectre.Console/Progress/Columns/TaskDescriptionColumn.cs b/src/Spectre.Console/Progress/Columns/TaskDescriptionColumn.cs index eac611f..0292b14 100644 --- a/src/Spectre.Console/Progress/Columns/TaskDescriptionColumn.cs +++ b/src/Spectre.Console/Progress/Columns/TaskDescriptionColumn.cs @@ -8,11 +8,14 @@ namespace Spectre.Console /// public sealed class TaskDescriptionColumn : ProgressColumn { + /// + protected internal override bool NoWrap => true; + /// public override IRenderable Render(RenderContext context, ProgressTask task, TimeSpan deltaTime) { var text = task.Description?.RemoveNewLines()?.Trim(); - return new Markup(text ?? string.Empty).RightAligned(); + return new Markup(text ?? string.Empty).Overflow(Overflow.Ellipsis).RightAligned(); } } } diff --git a/src/Spectre.Console/Progress/ProgressColumn.cs b/src/Spectre.Console/Progress/ProgressColumn.cs index e72585a..afd3b9a 100644 --- a/src/Spectre.Console/Progress/ProgressColumn.cs +++ b/src/Spectre.Console/Progress/ProgressColumn.cs @@ -8,6 +8,11 @@ namespace Spectre.Console /// public abstract class ProgressColumn { + /// + /// Gets a value indicating whether or not content should not wrap. + /// + protected internal virtual bool NoWrap { get; } + /// /// Gets the requested column width for the column. /// diff --git a/src/Spectre.Console/Progress/Renderers/InteractiveProgressRenderer.cs b/src/Spectre.Console/Progress/Renderers/InteractiveProgressRenderer.cs index 7860239..ffafd63 100644 --- a/src/Spectre.Console/Progress/Renderers/InteractiveProgressRenderer.cs +++ b/src/Spectre.Console/Progress/Renderers/InteractiveProgressRenderer.cs @@ -65,11 +65,17 @@ namespace Spectre.Console.Internal for (var columnIndex = 0; columnIndex < _columns.Count; columnIndex++) { var column = new GridColumn().PadRight(1); + if (_columns[columnIndex].ColumnWidth != null) { column.Width = _columns[columnIndex].ColumnWidth; } + if (_columns[columnIndex].NoWrap) + { + column.NoWrap(); + } + // Last column? if (columnIndex == _columns.Count - 1) { diff --git a/src/Spectre.Console/Widgets/Padder.cs b/src/Spectre.Console/Widgets/Padder.cs index e34e992..bb48bcc 100644 --- a/src/Spectre.Console/Widgets/Padder.cs +++ b/src/Spectre.Console/Widgets/Padder.cs @@ -58,6 +58,11 @@ namespace Spectre.Console var width = childWidth + paddingWidth; var result = new List(); + if (width > maxWidth) + { + width = maxWidth; + } + // Top padding for (var i = 0; i < Padding.GetTopSafe(); i++) {