diff --git a/Terminal.Gui/Core/ConsoleDriver.cs b/Terminal.Gui/Core/ConsoleDriver.cs
index 57444bf1a..ce6737329 100644
--- a/Terminal.Gui/Core/ConsoleDriver.cs
+++ b/Terminal.Gui/Core/ConsoleDriver.cs
@@ -930,14 +930,14 @@ namespace Terminal.Gui {
///
public virtual void DrawWindowTitle (Rect region, ustring title, int paddingLeft, int paddingTop, int paddingRight, int paddingBottom, TextAlignment textAlignment = TextAlignment.Left)
{
- var width = region.Width - (paddingLeft + 2) * 2;
- if (!ustring.IsNullOrEmpty (title) && width > 4 && region.Y + paddingTop <= region.Y + paddingBottom) {
- Move (region.X + 1 + paddingLeft, region.Y + paddingTop);
- AddRune (' ');
+ var width = region.Width - (paddingLeft + 1) * 2;
+ if (!ustring.IsNullOrEmpty (title) && width > 2 && region.Y + paddingTop <= region.Y + paddingBottom) {
+ Move (region.X + 2 + paddingLeft, region.Y + paddingTop);
+ //AddRune (' ');
var str = title.Sum (r => Math.Max (Rune.ColumnWidth (r), 1)) >= width
? TextFormatter.Format (title, width - 2, false, false) [0] : title;
AddStr (str);
- AddRune (' ');
+ //AddRune (' ');
}
}
diff --git a/Terminal.Gui/Core/Frame.cs b/Terminal.Gui/Core/Frame.cs
index 900134d92..5f84b7361 100644
--- a/Terminal.Gui/Core/Frame.cs
+++ b/Terminal.Gui/Core/Frame.cs
@@ -103,24 +103,32 @@ namespace Terminal.Gui {
//OnDrawSubviews (bounds);
// TODO: v2 - this will eventually be two controls: "BorderView" and "Label" (for the title)
+
+ if (Id == "BorderFrame" && Thickness.Top > 0 && !ustring.IsNullOrEmpty (Parent?.Title)) {
+
+ Driver.SetAttribute (Parent.HasFocus ? Parent.GetHotNormalColor () : Parent.GetNormalColor ());
+ Driver.DrawWindowTitle (screenBounds, Parent?.Title, 0, 0, 0, 0);
+ }
+
if (Id == "BorderFrame" && BorderStyle != BorderStyle.None) {
var lc = new LineCanvas ();
if (Thickness.Top > 0) {
- if (ustring.IsNullOrEmpty (Parent?.Title)) {
+ // ╔╡ Title ╞═════╗
+ // ╔╡ ╞═════╗
+ if (Frame.Width < 6 || ustring.IsNullOrEmpty (Parent?.Title)) {
+ // ╔╡╞╗ should be ╔══╗
lc.AddLine (screenBounds.Location, Frame.Width - 1, Orientation.Horizontal, BorderStyle);
} else {
-
- lc.AddLine (screenBounds.Location, Frame.Width - 1, Orientation.Horizontal, BorderStyle);
-
- //// ╔╡ Title ╞═════╗
- //// Add a short horiz line for ╔╡
- //lc.AddLine (screenBounds.Location, 1, Orientation.Horizontal, BorderStyle);
- //// Add a short vert line for ╔╡
- //lc.AddLine (new Point (screenBounds.X + 1, screenBounds.Location.Y - 1), 1, Orientation.Vertical, BorderStyle.Single);
- //// Add a short vert line for ╞
- //lc.AddLine (new Point (screenBounds.X + (Parent.Title.Length + 3), screenBounds.Location.Y - 1), 1, Orientation.Vertical, BorderStyle.Single);
- //// Add the right hand line for ╞═════╗
- //lc.AddLine (new Point (screenBounds.X + (Parent.Title.Length + 3), screenBounds.Location.Y), Frame.Width - 1 - (Parent.Title.Length + 2), Orientation.Horizontal, BorderStyle);
+ var titleWidth = Math.Min (Parent.Title.ConsoleWidth, Frame.Width - 6);
+ // ╔╡ Title ╞═════╗
+ // Add a short horiz line for ╔╡
+ lc.AddLine (screenBounds.Location, 1, Orientation.Horizontal, BorderStyle);
+ // Add a short vert line for ╔╡
+ lc.AddLine (new Point (screenBounds.X + 1, screenBounds.Location.Y), 0, Orientation.Vertical, BorderStyle.Single);
+ // Add a short vert line for ╞
+ lc.AddLine (new Point (screenBounds.X + 1 + (titleWidth + 1), screenBounds.Location.Y), 0, Orientation.Vertical, BorderStyle.Single);
+ // Add the right hand line for ╞═════╗
+ lc.AddLine (new Point (screenBounds.X + 1 + (titleWidth + 1), screenBounds.Location.Y), Frame.Width - (titleWidth + 3), Orientation.Horizontal, BorderStyle);
}
}
if (Thickness.Left > 0) {
@@ -137,11 +145,7 @@ namespace Terminal.Gui {
Driver.AddRune (p.Value);
}
}
- if (Id == "BorderFrame" && Thickness.Top > 0 && !ustring.IsNullOrEmpty (Parent?.Title)) {
- Driver.SetAttribute (Parent.HasFocus ? Parent.GetHotNormalColor () : Parent.GetNormalColor ());
- Driver.DrawWindowTitle (screenBounds, Parent?.Title, 0, 0, 0, 0);
- }
Driver.Clip = prevClip;
}
diff --git a/Terminal.Gui/Core/Graphs/LineCanvas.cs b/Terminal.Gui/Core/Graphs/LineCanvas.cs
index ebd4d690e..c8c7a126b 100644
--- a/Terminal.Gui/Core/Graphs/LineCanvas.cs
+++ b/Terminal.Gui/Core/Graphs/LineCanvas.cs
@@ -199,8 +199,8 @@ namespace Terminal.Gui.Graphs {
}
// TODO: Remove these two once we have all of the below ported to IntersectionRuneResolvers
- 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);
+ var useDouble = intersects.Any (i => i.Line.Style == BorderStyle.Double);
+ var useRounded = intersects.Any (i => i.Line.Style == BorderStyle.Rounded);
// TODO: Support ruler
//var useRuler = intersects.Any (i => i.Line.Style == BorderStyle.Ruler && i.Line.Length != 0);
@@ -222,13 +222,6 @@ namespace Terminal.Gui.Graphs {
private IntersectionRuneType GetRuneTypeForIntersects (IntersectionDefinition [] intersects)
{
- if (intersects.All (i => i.Line.Length == 0)) {
- return IntersectionRuneType.Dot;
- }
-
- // ignore dots
- intersects = intersects.Where (i => i.Type != IntersectionType.Dot).ToArray ();
-
var set = new HashSet (intersects.Select (i => i.Type));
#region Crosshair Conditions
@@ -489,14 +482,6 @@ namespace Terminal.Gui.Graphs {
internal IntersectionDefinition Intersects (int x, int y)
{
- if (IsDot ()) {
- if (StartsAt (x, y)) {
- return new IntersectionDefinition (Start, IntersectionType.Dot, this);
- } else {
- return null;
- }
- }
-
switch (Orientation) {
case Orientation.Horizontal: return IntersectsHorizontally (x, y);
case Orientation.Vertical: return IntersectsVertically (x, y);
@@ -514,7 +499,7 @@ namespace Terminal.Gui.Graphs {
return new IntersectionDefinition (
Start,
- Length < 0 ? IntersectionType.StartLeft : IntersectionType.StartRight,
+ GetTypeByLength(IntersectionType.StartLeft, IntersectionType.PassOverHorizontal,IntersectionType.StartRight),
this
);
@@ -554,7 +539,7 @@ namespace Terminal.Gui.Graphs {
return new IntersectionDefinition (
Start,
- Length < 0 ? IntersectionType.StartUp : IntersectionType.StartDown,
+ GetTypeByLength(IntersectionType.StartUp, IntersectionType.PassOverVertical, IntersectionType.StartDown),
this
);
@@ -585,6 +570,15 @@ namespace Terminal.Gui.Graphs {
}
}
+ private IntersectionType GetTypeByLength (IntersectionType typeWhenNegative, IntersectionType typeWhenZero, IntersectionType typeWhenPositive)
+ {
+ if (Length == 0) {
+ return typeWhenZero;
+ }
+
+ return Length < 0 ? typeWhenNegative : typeWhenPositive;
+ }
+
private bool EndsAt (int x, int y)
{
if (Orientation == Orientation.Horizontal) {
@@ -598,11 +592,6 @@ namespace Terminal.Gui.Graphs {
{
return Start.X == x && Start.Y == y;
}
-
- private bool IsDot ()
- {
- return Length == 0;
- }
}
}
}
diff --git a/UnitTests/Core/LineCanvasTests.cs b/UnitTests/Core/LineCanvasTests.cs
index 1d347708f..e7ea3721a 100644
--- a/UnitTests/Core/LineCanvasTests.cs
+++ b/UnitTests/Core/LineCanvasTests.cs
@@ -15,20 +15,6 @@ namespace Terminal.Gui.CoreTests {
this.output = output;
}
- [Fact, AutoInitShutdown]
- public void TestLineCanvas_Dot ()
- {
- var v = GetCanvas (out var canvas);
- canvas.AddLine (new Point (0, 0), 0, Orientation.Horizontal, BorderStyle.Single);
-
- v.Redraw (v.Bounds);
-
- string looksLike =
-@"
-.";
- TestHelpers.AssertDriverContentsAre (looksLike, output);
- }
-
[InlineData (BorderStyle.Single)]
[InlineData (BorderStyle.Rounded)]
[Theory, AutoInitShutdown]
@@ -311,7 +297,119 @@ namespace Terminal.Gui.CoreTests {
";
TestHelpers.AssertDriverContentsAre (looksLike, output);
}
+ [Fact, AutoInitShutdown]
+ public void TestLineCanvas_ClipArea_Intersections ()
+ {
+ // Draw at 1,1 within client area of View (i.e. leave a top and left margin of 1)
+ var v = GetCanvas (out var lc);
+ v.Width = 10;
+ v.Height = 1;
+ v.Bounds = new Rect (0, 0, 10, 1);
+ // ╔╡ Title ╞═════╗
+ // Add a short horiz line for ╔╡
+ lc.AddLine (new Point (0, 0), 1, Orientation.Horizontal, BorderStyle.Double);
+ //LHS line down
+ lc.AddLine (new Point (0, 0), 5, Orientation.Vertical, BorderStyle.Double);
+
+ //Vertical line before Title, results in a ╡
+ lc.AddLine (new Point (1, 0), 0, Orientation.Vertical, BorderStyle.Single);
+ //Vertical line after Title, results in a ╞
+ lc.AddLine (new Point (6, 0), 0, Orientation.Vertical, BorderStyle.Single);
+
+ // remainder of title
+ lc.AddLine (new Point (6, 0), 3, Orientation.Horizontal, BorderStyle.Double);
+ //RHS line down
+ lc.AddLine (new Point (9, 0), 5, Orientation.Vertical, BorderStyle.Double);
+
+ v.Redraw (v.Bounds);
+
+ string looksLike =
+ @"
+╔╡ ╞══╗
+";
+ TestHelpers.AssertDriverContentsAre (looksLike, output);
+ }
+
+ [InlineData(0,0,0, Orientation.Horizontal,BorderStyle.Double,"═")]
+ [InlineData(0,0,0, Orientation.Vertical,BorderStyle.Double,"║")]
+ [InlineData(0,0,0, Orientation.Horizontal,BorderStyle.Single,"─")]
+ [InlineData(0,0,0, Orientation.Vertical,BorderStyle.Single,"│")]
+ [AutoInitShutdown, Theory]
+ public void TestLineCanvas_1LineTests(
+ int x1, int y1,int l1, Orientation o1, BorderStyle s1,
+ string expected
+ )
+ {
+ var v = GetCanvas (out var lc);
+ v.Width = 10;
+ v.Height = 10;
+ v.Bounds = new Rect (0, 0, 10, 10);
+
+ lc.AddLine (new Point (x1, y1), l1, o1, s1);
+
+ v.Redraw (v.Bounds);
+
+ TestHelpers.AssertDriverContentsAre (expected, output);
+ }
+
+
+ [Theory, AutoInitShutdown]
+ [InlineData(
+ 0,0,1,Orientation.Horizontal,BorderStyle.Double,
+ 1,0,0, Orientation.Vertical,BorderStyle.Single, "═╡"
+ )]
+ [InlineData(
+ 0,0,0, Orientation.Vertical,BorderStyle.Single,
+ 0,0,1,Orientation.Horizontal,BorderStyle.Double,
+ "╞═"
+ )]
+ [InlineData(
+ 0,0,1, Orientation.Vertical,BorderStyle.Single,
+ 0,0,0,Orientation.Horizontal,BorderStyle.Double,
+@"
+╤
+│"
+ )]
+ [InlineData(
+ 0,0,1, Orientation.Vertical,BorderStyle.Single,
+ 0,1,0,Orientation.Horizontal,BorderStyle.Double,
+ @"
+│
+╧
+"
+ )]
+ [InlineData(
+ 0,0,0, Orientation.Vertical,BorderStyle.Single,
+ 0,0,0,Orientation.Horizontal,BorderStyle.Single,
+ @"┼
+"
+ )]
+ [InlineData(
+ 0,0,0, Orientation.Vertical,BorderStyle.Double,
+ 0,0,0,Orientation.Horizontal,BorderStyle.Double,
+ @"╬
+"
+ )]
+ public void TestLineCanvas_2LineTests(
+ int x1, int y1,int l1, Orientation o1, BorderStyle s1,
+ int x2, int y2, int l2, Orientation o2, BorderStyle s2,
+ string expected
+ )
+ {
+ var v = GetCanvas (out var lc);
+ v.Width = 10;
+ v.Height = 10;
+ v.Bounds = new Rect (0, 0, 10, 10);
+
+ lc.AddLine (new Point (x1, y1), l1, o1, s1);
+ lc.AddLine (new Point (x2, y2), l2, o2, s2);
+
+ v.Redraw (v.Bounds);
+
+ TestHelpers.AssertDriverContentsAre (expected, output);
+ }
+
///
/// Creates a new into which a is rendered