mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-30 01:38:01 +01:00
Merge pull request #2436 from tznind/canvas-length-zero
Fixes #2433 - Change how LineCanvas interprets zero length
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user