From 108e56c2296e595bd521db856c387ae52a37ab9c Mon Sep 17 00:00:00 2001 From: Patrik Svensson Date: Wed, 5 Aug 2020 14:07:46 +0200 Subject: [PATCH] Add rounded border --- src/Sample/Program.cs | 2 +- .../Unit/Composition/BorderTests.cs | 1 + .../Unit/Composition/TableTests.cs | 24 +++++++++++- src/Spectre.Console/Composition/Border.cs | 1 + src/Spectre.Console/Composition/BorderKind.cs | 5 +++ .../Composition/Borders/RoundedBorder.cs | 37 +++++++++++++++++++ 6 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/Spectre.Console/Composition/Borders/RoundedBorder.cs diff --git a/src/Sample/Program.cs b/src/Sample/Program.cs index 252e115..8ee07ea 100644 --- a/src/Sample/Program.cs +++ b/src/Sample/Program.cs @@ -87,7 +87,7 @@ namespace Sample table.AddRow("Hej ๐Ÿ‘‹", "[green]Vรคrlden[/]"); AnsiConsole.Render(table); - table = new Table(BorderKind.Ascii); + table = new Table(BorderKind.Rounded); table.AddColumns("[red underline]Foo[/]", "Bar"); table.AddRow("[blue][underline]Hell[/]o[/]", "World ๐ŸŒ"); table.AddRow("[yellow]Patrik [green]\"Lol[/]\" Svensson[/]", "Was [underline]here[/]!"); diff --git a/src/Spectre.Console.Tests/Unit/Composition/BorderTests.cs b/src/Spectre.Console.Tests/Unit/Composition/BorderTests.cs index b25fceb..bfebaea 100644 --- a/src/Spectre.Console.Tests/Unit/Composition/BorderTests.cs +++ b/src/Spectre.Console.Tests/Unit/Composition/BorderTests.cs @@ -12,6 +12,7 @@ namespace Spectre.Console.Tests.Unit.Composition [Theory] [InlineData(BorderKind.Ascii, typeof(AsciiBorder))] [InlineData(BorderKind.Square, typeof(SquareBorder))] + [InlineData(BorderKind.Rounded, typeof(RoundedBorder))] public void Should_Return_Correct_Border_For_Specified_Kind(BorderKind kind, Type expected) { // Given, When diff --git a/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs b/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs index d293fc4..58aed3f 100644 --- a/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs +++ b/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs @@ -111,7 +111,7 @@ namespace Spectre.Console.Tests.Unit.Composition } [Fact] - public void Should_Render_Table_With_Specified_Border_Correctly() + public void Should_Render_Table_With_Ascii_Border_Correctly() { // Given var console = new PlainConsole(width: 80); @@ -132,6 +132,28 @@ namespace Spectre.Console.Tests.Unit.Composition console.Lines[5].ShouldBe("+-------------------------+"); } + [Fact] + public void Should_Render_Table_With_Rounded_Border_Correctly() + { + // Given + var console = new PlainConsole(width: 80); + var table = new Table(BorderKind.Rounded); + table.AddColumns("Foo", "Bar", "Baz"); + table.AddRow("Qux", "Corgi", "Waldo"); + table.AddRow("Grault", "Garply", "Fred"); + + // When + console.Render(table); + + // Then + console.Lines[0].ShouldBe("โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ"); + console.Lines[1].ShouldBe("โ”‚ Foo โ”‚ Bar โ”‚ Baz โ”‚"); + console.Lines[2].ShouldBe("โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค"); + console.Lines[3].ShouldBe("โ”‚ Qux โ”‚ Corgi โ”‚ Waldo โ”‚"); + console.Lines[4].ShouldBe("โ”‚ Grault โ”‚ Garply โ”‚ Fred โ”‚"); + console.Lines[5].ShouldBe("โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ"); + } + [Fact] public void Should_Render_Table_With_No_Border_Correctly() { diff --git a/src/Spectre.Console/Composition/Border.cs b/src/Spectre.Console/Composition/Border.cs index 2b4659f..3e999f2 100644 --- a/src/Spectre.Console/Composition/Border.cs +++ b/src/Spectre.Console/Composition/Border.cs @@ -17,6 +17,7 @@ namespace Spectre.Console.Composition { BorderKind.None, new NoBorder() }, { BorderKind.Ascii, new AsciiBorder() }, { BorderKind.Square, new SquareBorder() }, + { BorderKind.Rounded, new RoundedBorder() }, }; /// diff --git a/src/Spectre.Console/Composition/BorderKind.cs b/src/Spectre.Console/Composition/BorderKind.cs index 010d7c5..37bf537 100644 --- a/src/Spectre.Console/Composition/BorderKind.cs +++ b/src/Spectre.Console/Composition/BorderKind.cs @@ -19,5 +19,10 @@ namespace Spectre.Console /// An old school ASCII border. /// Ascii = 2, + + /// + /// A rounded border. + /// + Rounded = 3, } } diff --git a/src/Spectre.Console/Composition/Borders/RoundedBorder.cs b/src/Spectre.Console/Composition/Borders/RoundedBorder.cs new file mode 100644 index 0000000..8b84e99 --- /dev/null +++ b/src/Spectre.Console/Composition/Borders/RoundedBorder.cs @@ -0,0 +1,37 @@ +using System; + +namespace Spectre.Console.Composition +{ + /// + /// Represents a rounded border. + /// + public sealed class RoundedBorder : Border + { + /// + protected override string GetBoxPart(BorderPart part) + { + return part switch + { + BorderPart.HeaderTopLeft => "โ•ญ", + BorderPart.HeaderTop => "โ”€", + BorderPart.HeaderTopSeparator => "โ”ฌ", + BorderPart.HeaderTopRight => "โ•ฎ", + BorderPart.HeaderLeft => "โ”‚", + BorderPart.HeaderSeparator => "โ”‚", + BorderPart.HeaderRight => "โ”‚", + BorderPart.HeaderBottomLeft => "โ”œ", + BorderPart.HeaderBottom => "โ”€", + BorderPart.HeaderBottomSeparator => "โ”ผ", + BorderPart.HeaderBottomRight => "โ”ค", + BorderPart.CellLeft => "โ”‚", + BorderPart.CellSeparator => "โ”‚", + BorderPart.ColumnRight => "โ”‚", + BorderPart.FooterBottomLeft => "โ•ฐ", + BorderPart.FooterBottom => "โ”€", + BorderPart.FooterBottomSeparator => "โ”ด", + BorderPart.FooterBottomRight => "โ•ฏ", + _ => throw new InvalidOperationException("Unknown box part."), + }; + } + } +}