浏览代码

Add support for rounded corners

tznind 2 年之前
父节点
当前提交
cca7c4d6c4
共有 2 个文件被更改,包括 40 次插入4 次删除
  1. 5 4
      Terminal.Gui/Core/Graphs/LineCanvas.cs
  2. 35 0
      UnitTests/LineCanvasTests.cs

+ 5 - 4
Terminal.Gui/Core/Graphs/LineCanvas.cs

@@ -97,6 +97,7 @@ namespace Terminal.Gui.Graphs {
 
 
 			var runeType = GetRuneTypeForIntersects (intersects);
 			var runeType = GetRuneTypeForIntersects (intersects);
 			var useDouble = intersects.Any (i => i.Line.Style == BorderStyle.Double && i.Line.Length != 0);
 			var useDouble = intersects.Any (i => i.Line.Style == BorderStyle.Double && i.Line.Length != 0);
+			var useRounded = intersects.Any (i => i.Line.Style == BorderStyle.Rounded && i.Line.Length != 0);
 
 
 			switch (runeType) {
 			switch (runeType) {
 			case IntersectionRuneType.None: 
 			case IntersectionRuneType.None: 
@@ -104,13 +105,13 @@ namespace Terminal.Gui.Graphs {
 			case IntersectionRuneType.Dot: 
 			case IntersectionRuneType.Dot: 
 				return (Rune)'.';
 				return (Rune)'.';
 			case IntersectionRuneType.ULCorner:
 			case IntersectionRuneType.ULCorner:
-				return useDouble ? driver.ULDCorner : driver.ULCorner;
+				return useDouble ? driver.ULDCorner : useRounded ? driver.ULRCorner : driver.ULCorner;
 			case IntersectionRuneType.URCorner: 
 			case IntersectionRuneType.URCorner: 
-				return useDouble ? driver.URDCorner : driver.URCorner;
+				return useDouble ? driver.URDCorner : useRounded ? driver.URRCorner : driver.URCorner;
 			case IntersectionRuneType.LLCorner: 
 			case IntersectionRuneType.LLCorner: 
-				return useDouble ? driver.LLDCorner : driver.LLCorner;
+				return useDouble ? driver.LLDCorner : useRounded ? driver.LLRCorner : driver.LLCorner;
 			case IntersectionRuneType.LRCorner: 
 			case IntersectionRuneType.LRCorner: 
-				return useDouble ? driver.LRDCorner : driver.LRCorner;
+				return useDouble ? driver.LRDCorner : useRounded ? driver.LRRCorner : driver.LRCorner;
 			case IntersectionRuneType.TopTee: 
 			case IntersectionRuneType.TopTee: 
 				return useDouble ? '╦' : driver.TopTee;
 				return useDouble ? '╦' : driver.TopTee;
 			case IntersectionRuneType.BottomTee: 
 			case IntersectionRuneType.BottomTee: 

+ 35 - 0
UnitTests/LineCanvasTests.cs

@@ -156,6 +156,41 @@ namespace Terminal.Gui.Core {
 			TestHelpers.AssertDriverContentsAre (looksLike, output);
 			TestHelpers.AssertDriverContentsAre (looksLike, output);
 		}
 		}
 
 
+		/// <summary>
+		/// Demonstrates when <see cref="BorderStyle.Rounded"/> corners are used. Notice how
+		/// not all lines declare rounded.  If there are 1+ lines intersecting and a corner is
+		/// to be used then if any of them are rounded a rounded corner is used.
+		/// </summary>
+		[Fact, AutoInitShutdown]
+		public void TestLineCanvas_Window_Rounded ()
+		{
+			var v = GetCanvas (out var canvas);
+
+			// outer box
+			canvas.AddLine (new Point (0, 0), 9, Orientation.Horizontal, BorderStyle.Rounded);
+			
+			// BorderStyle.Single is ignored because corner overlaps with the above line which is Rounded
+			// this results in a rounded corner being used.
+			canvas.AddLine (new Point (9, 0), 4, Orientation.Vertical, BorderStyle.Single); 
+			canvas.AddLine (new Point (9, 4), -9, Orientation.Horizontal, BorderStyle.Rounded);
+			canvas.AddLine (new Point (0, 4), -4, Orientation.Vertical, BorderStyle.Single);
+
+			// These lines say rounded but they will result in the T sections which are never rounded.
+			canvas.AddLine (new Point (5, 0), 4, Orientation.Vertical, BorderStyle.Rounded);
+			canvas.AddLine (new Point (0, 2), 9, Orientation.Horizontal, BorderStyle.Rounded);
+
+			v.Redraw (v.Bounds);
+
+			string looksLike =
+@"    
+╭────┬───╮
+│    │   │
+├────┼───┤
+│    │   │
+╰────┴───╯";
+			TestHelpers.AssertDriverContentsAre (looksLike, output);
+		}
+
 		[Fact, AutoInitShutdown]
 		[Fact, AutoInitShutdown]
 		public void TestLineCanvas_Window_Double ()
 		public void TestLineCanvas_Window_Double ()
 		{
 		{