mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-16 00:42:51 +08:00
Fix progress rendering bug
This commit is contained in:
parent
ae32785f21
commit
3c504155bc
@ -0,0 +1,5 @@
|
||||
|
||||
foo ━━━ 0% -:--:-- ⣷
|
||||
bar ━━━ 0% -:--:-- ⣷
|
||||
baz ━━━ 0% -:--:-- ⣷
|
||||
|
17
src/Spectre.Console.Tests/Tools/DummyCursor.cs
Normal file
17
src/Spectre.Console.Tests/Tools/DummyCursor.cs
Normal file
@ -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)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@ -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; }
|
||||
|
@ -1,4 +1,4 @@
|
||||
namespace Spectre.Console.Tests.Tools
|
||||
namespace Spectre.Console.Tests
|
||||
{
|
||||
public sealed class TestLinkIdentityGenerator : ILinkIdentityGenerator
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,12 @@ namespace Spectre.Console
|
||||
/// </summary>
|
||||
public sealed class RemainingTimeColumn : ProgressColumn
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
protected internal override int? ColumnWidth => 7;
|
||||
|
||||
/// <inheritdoc/>
|
||||
protected internal override bool NoWrap => true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the style of the remaining time text.
|
||||
/// </summary>
|
||||
|
@ -14,6 +14,12 @@ namespace Spectre.Console
|
||||
private readonly string _ansiSequence = "⣷⣯⣟⡿⢿⣻⣽⣾";
|
||||
private readonly string _asciiSequence = "-\\|/-\\|/";
|
||||
|
||||
/// <inheritdoc/>
|
||||
protected internal override int? ColumnWidth => 1;
|
||||
|
||||
/// <inheritdoc/>
|
||||
protected internal override bool NoWrap => true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the style of the spinner.
|
||||
/// </summary>
|
||||
|
@ -8,11 +8,14 @@ namespace Spectre.Console
|
||||
/// </summary>
|
||||
public sealed class TaskDescriptionColumn : ProgressColumn
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
protected internal override bool NoWrap => true;
|
||||
|
||||
/// <inheritdoc/>
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,11 @@ namespace Spectre.Console
|
||||
/// </summary>
|
||||
public abstract class ProgressColumn
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether or not content should not wrap.
|
||||
/// </summary>
|
||||
protected internal virtual bool NoWrap { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the requested column width for the column.
|
||||
/// </summary>
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -58,6 +58,11 @@ namespace Spectre.Console
|
||||
var width = childWidth + paddingWidth;
|
||||
var result = new List<Segment>();
|
||||
|
||||
if (width > maxWidth)
|
||||
{
|
||||
width = maxWidth;
|
||||
}
|
||||
|
||||
// Top padding
|
||||
for (var i = 0; i < Padding.GetTopSafe(); i++)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user