Merge pull request #2436 from tznind/canvas-length-zero

Fixes #2433 - Change how LineCanvas interprets zero length
This commit is contained in:
Tig
2023-03-20 16:22:42 -07:00
committed by GitHub
2 changed files with 125 additions and 38 deletions

View File

@@ -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: maybe make these resolvers to for simplicity?
// or for dotted lines later on or that kind of thing?
@@ -220,13 +220,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<IntersectionType> (intersects.Select (i => i.Type));
#region Crosshair Conditions
@@ -487,14 +480,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);
@@ -512,7 +497,7 @@ namespace Terminal.Gui.Graphs {
return new IntersectionDefinition (
Start,
Length < 0 ? IntersectionType.StartLeft : IntersectionType.StartRight,
GetTypeByLength(IntersectionType.StartLeft, IntersectionType.PassOverHorizontal,IntersectionType.StartRight),
this
);
@@ -552,7 +537,7 @@ namespace Terminal.Gui.Graphs {
return new IntersectionDefinition (
Start,
Length < 0 ? IntersectionType.StartUp : IntersectionType.StartDown,
GetTypeByLength(IntersectionType.StartUp, IntersectionType.PassOverVertical, IntersectionType.StartDown),
this
);
@@ -583,6 +568,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) {
@@ -596,11 +590,6 @@ namespace Terminal.Gui.Graphs {
{
return Start.X == x && Start.Y == y;
}
private bool IsDot ()
{
return Length == 0;
}
}
}
}

View File

@@ -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);
}
/// <summary>
/// Creates a new <see cref="View"/> into which a <see cref="LineCanvas"/> is rendered