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