Add support for alignment

This commit is contained in:
Patrik Svensson 2022-02-21 18:35:21 +01:00 committed by Phil Scott
parent 5e41a2f505
commit eb4a7d3bf4
8 changed files with 88 additions and 32 deletions

View File

@ -4,7 +4,7 @@
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<ExampleTitle>Paths</ExampleTitle> <ExampleTitle>Paths</ExampleTitle>
<ExampleDescription>Demonstrates how to write paths.</ExampleDescription> <ExampleDescription>Demonstrates how to render paths.</ExampleDescription>
<ExampleGroup>Widgets</ExampleGroup> <ExampleGroup>Widgets</ExampleGroup>
</PropertyGroup> </PropertyGroup>

View File

@ -2,7 +2,7 @@ using System;
using System.Threading; using System.Threading;
using Spectre.Console; using Spectre.Console;
namespace Live; namespace Paths;
public static class Program public static class Program
{ {
@ -11,11 +11,37 @@ public static class Program
var windowsPath = @"C:\This is\A\Super Long\Windows\Path\That\Goes\On And On\And\Never\Seems\To\Stop\But\At\Some\Point\It\Must\I\Guess.txt"; var windowsPath = @"C:\This is\A\Super Long\Windows\Path\That\Goes\On And On\And\Never\Seems\To\Stop\But\At\Some\Point\It\Must\I\Guess.txt";
var unixPath = @"//This is/A/Super Long/Unix/Path/That/Goes/On And On/And/Never/Seems/To/Stop/But/At/Some/Point/It/Must/I/Guess.txt"; var unixPath = @"//This is/A/Super Long/Unix/Path/That/Goes/On And On/And/Never/Seems/To/Stop/But/At/Some/Point/It/Must/I/Guess.txt";
var table = new Table().BorderColor(Color.Grey); AnsiConsole.WriteLine();
WritePlain(windowsPath, unixPath);
AnsiConsole.WriteLine();
WriteColorized(windowsPath, unixPath);
AnsiConsole.WriteLine();
WriteAligned(windowsPath);
}
private static void WritePlain(string windowsPath, string unixPath)
{
var table = new Table().BorderColor(Color.Grey).Title("Plain").RoundedBorder();
table.AddColumns("[grey]OS[/]", "[grey]Path[/]");
table.AddRow(new Text("Windows"), new TextPath(windowsPath));
table.AddRow(new Text("Unix"), new TextPath(unixPath));
AnsiConsole.Write(table);
}
private static void WriteColorized(string windowsPath, string unixPath)
{
var table = new Table().BorderColor(Color.Grey).Title("Colorized").RoundedBorder();
table.AddColumns("[grey]OS[/]", "[grey]Path[/]"); table.AddColumns("[grey]OS[/]", "[grey]Path[/]");
table.AddRow(new Text("Windows"), table.AddRow(new Text("Windows"),
new TextPath(windowsPath)); new TextPath(windowsPath)
.RootColor(Color.Blue)
.SeparatorColor(Color.Yellow)
.StemStyle(Color.Red)
.LeafStyle(Color.Green));
table.AddRow(new Text("Unix"), table.AddRow(new Text("Unix"),
new TextPath(unixPath) new TextPath(unixPath)
@ -26,4 +52,16 @@ public static class Program
AnsiConsole.Write(table); AnsiConsole.Write(table);
} }
private static void WriteAligned(string path)
{
var table = new Table().BorderColor(Color.Grey).Title("Aligned").RoundedBorder();
table.AddColumns("[grey]Alignment[/]", "[grey]Path[/]");
table.AddRow(new Text("Left"), new TextPath(path).LeftAligned());
table.AddRow(new Text("Center"), new TextPath(path).Centered());
table.AddRow(new Text("Right"), new TextPath(path).RightAligned());
AnsiConsole.Write(table);
}
} }

View File

@ -1,7 +0,0 @@
<SolutionConfiguration>
<Settings>
<AllowParallelTestExecution>True</AllowParallelTestExecution>
<InstrumentationMode>Optimised</InstrumentationMode>
<SolutionConfigured>True</SolutionConfigured>
</Settings>
</SolutionConfiguration>

View File

@ -3,7 +3,7 @@ namespace Spectre.Console;
/// <summary> /// <summary>
/// Representation of a file system path. /// Representation of a file system path.
/// </summary> /// </summary>
public sealed class TextPath : IRenderable public sealed class TextPath : IRenderable, IAlignable
{ {
private const string Ellipsis = "..."; private const string Ellipsis = "...";
private const string UnicodeEllipsis = "…"; private const string UnicodeEllipsis = "…";
@ -32,6 +32,11 @@ public sealed class TextPath : IRenderable
/// </summary> /// </summary>
public Style? LeafStyle { get; set; } public Style? LeafStyle { get; set; }
/// <summary>
/// Gets or sets the alignment.
/// </summary>
public Justify? Alignment { get; set; }
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="TextPath"/> class. /// Initializes a new instance of the <see cref="TextPath"/> class.
/// </summary> /// </summary>
@ -75,6 +80,8 @@ public sealed class TextPath : IRenderable
/// <inheritdoc/> /// <inheritdoc/>
public IEnumerable<Segment> Render(RenderContext context, int maxWidth) public IEnumerable<Segment> Render(RenderContext context, int maxWidth)
{ {
var alignment = Alignment ?? Justify.Left;
var rootStyle = RootStyle ?? Style.Plain; var rootStyle = RootStyle ?? Style.Plain;
var separatorStyle = SeparatorStyle ?? Style.Plain; var separatorStyle = SeparatorStyle ?? Style.Plain;
var stemStyle = StemStyle ?? Style.Plain; var stemStyle = StemStyle ?? Style.Plain;
@ -111,6 +118,10 @@ public sealed class TextPath : IRenderable
} }
} }
// Align the result
Aligner.Align(parts, Alignment, maxWidth);
// Insert a line break
parts.Add(Segment.LineBreak); parts.Add(Segment.LineBreak);
return parts; return parts;

View File

@ -1,7 +0,0 @@
<ProjectConfiguration>
<Settings>
<IgnoredTests>
<AllTestsSelector />
</IgnoredTests>
</Settings>
</ProjectConfiguration>

View File

@ -1,7 +0,0 @@
<ProjectConfiguration>
<Settings>
<IgnoredTests>
<AllTestsSelector />
</IgnoredTests>
</Settings>
</ProjectConfiguration>

View File

@ -1,3 +0,0 @@
<ProjectConfiguration>
<Settings />
</ProjectConfiguration>

View File

@ -14,7 +14,8 @@ public sealed class TextPathTests
console.Write(new TextPath(input)); console.Write(new TextPath(input));
// Then // Then
console.Output.TrimEnd().ShouldBe(expected); console.Output.TrimEnd()
.ShouldBe(expected);
} }
[Theory] [Theory]
@ -30,7 +31,8 @@ public sealed class TextPathTests
console.Write(new TextPath(input)); console.Write(new TextPath(input));
// Then // Then
console.Output.TrimEnd().ShouldBe(expected); console.Output.TrimEnd()
.ShouldBe(expected);
} }
[Theory] [Theory]
@ -46,7 +48,8 @@ public sealed class TextPathTests
console.Write(new TextPath(input)); console.Write(new TextPath(input));
// Then // Then
console.Output.TrimEnd().ShouldBe(expected); console.Output.TrimEnd()
.ShouldBe(expected);
} }
[Theory] [Theory]
@ -66,4 +69,32 @@ public sealed class TextPathTests
// Then // Then
console.Output.ShouldEndWith("\n"); console.Output.ShouldEndWith("\n");
} }
[Fact]
public void Should_Right_Align_Correctly()
{
// Given
var console = new TestConsole().Width(40);
// When
console.Write(new TextPath("C:/My documents/Bar/Baz.txt").RightAligned());
// Then
console.Output.TrimEnd('\n')
.ShouldBe(" C:/My documents/Bar/Baz.txt");
}
[Fact]
public void Should_Center_Align_Correctly()
{
// Given
var console = new TestConsole().Width(40);
// When
console.Write(new TextPath("C:/My documents/Bar/Baz.txt").Centered());
// Then
console.Output.TrimEnd('\n')
.ShouldBe(" C:/My documents/Bar/Baz.txt ");
}
} }