mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-11-01 01:25:27 +08:00 
			
		
		
		
	Fix progress rendering bug
This commit is contained in:
		 Patrik Svensson
					Patrik Svensson
				
			
				
					committed by
					
						 Patrik Svensson
						Patrik Svensson
					
				
			
			
				
	
			
			
			 Patrik Svensson
						Patrik Svensson
					
				
			
						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++) | ||||
|             { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user