Browse Source

Add tests and indicator of resizability (Driver.Diamond)

tznind 2 years ago
parent
commit
e604f8df6f
2 changed files with 111 additions and 9 deletions
  1. 13 9
      Terminal.Gui/Views/SplitContainer.cs
  2. 98 0
      UnitTests/SplitContainerTests.cs

+ 13 - 9
Terminal.Gui/Views/SplitContainer.cs

@@ -18,12 +18,14 @@ namespace Terminal.Gui {
 		/// </summary>
 		public SplitContainer ()
 		{
-			// Default to a border of 1 so that View looks nice
+			// Default to a border of 0 but not null so that user can
+			// more easily change size (without null references)
 			Border = new Border ();
+
 			splitterLine = new SplitContainerLineView (this);
 
-			this.Add (splitterLine);
 			this.Add (Panel1);
+			this.Add (splitterLine);
 			this.Add (Panel2);
 
 			Setup ();
@@ -161,9 +163,9 @@ namespace Terminal.Gui {
 				this.Panel1.Y = 0;
 				this.Panel1.Width = Dim.Fill ();
 				this.Panel1.Height = new DimFunc (() =>
-					splitterDistance.Anchor (Bounds.Height) - 1);
+					splitterDistance.Anchor (Bounds.Height));
 
-				this.Panel2.Y = Pos.Bottom (splitterLine) + 1;
+				this.Panel2.Y = Pos.Bottom (splitterLine);
 				this.Panel2.X = 0;
 				this.Panel2.Width = Dim.Fill ();
 				this.Panel2.Height = Dim.Fill ();
@@ -180,9 +182,9 @@ namespace Terminal.Gui {
 				this.Panel1.Y = 0;
 				this.Panel1.Height = Dim.Fill ();
 				this.Panel1.Width = new DimFunc (() =>
-					splitterDistance.Anchor (Bounds.Width) - 1);
+					splitterDistance.Anchor (Bounds.Width));
 
-				this.Panel2.X = Pos.Right (splitterLine) + 1;
+				this.Panel2.X = Pos.Right (splitterLine);
 				this.Panel2.Y = 0;
 				this.Panel2.Width = Dim.Fill ();
 				this.Panel2.Height = Dim.Fill ();
@@ -190,6 +192,8 @@ namespace Terminal.Gui {
 
 			default: throw new ArgumentOutOfRangeException (nameof (orientation));
 			};
+
+			this.LayoutSubviews ();
 		}
 
 		private void SetupForCollapsedPanel ()
@@ -296,7 +300,7 @@ namespace Terminal.Gui {
 				if (CanFocus && HasFocus) {
 
 					var location = moveRuneRenderLocation ??
-						new Point (bounds.Width / 2, bounds.Height / 2);
+						new Point (Bounds.Width / 2, Bounds.Height / 2);
 
 					AddRune (location.X,location.Y, Driver.Diamond);
 				}
@@ -372,9 +376,9 @@ namespace Terminal.Gui {
 				// resizing continues to work as intended
 				if (dragOrignalPos is PosFactor) {
 					if (Orientation == Orientation.Horizontal) {
-						Y = ToPosFactor (Y, parent.Bounds.Height);
+						parent.splitterDistance = ToPosFactor (Y, parent.Bounds.Height);
 					} else {
-						X = ToPosFactor (X, parent.Bounds.Width);
+						parent.splitterDistance = ToPosFactor (X, parent.Bounds.Width);
 					}
 				}
 			}

+ 98 - 0
UnitTests/SplitContainerTests.cs

@@ -0,0 +1,98 @@
+using System;
+using Terminal.Gui;
+using Xunit;
+using Xunit.Abstractions;
+
+namespace UnitTests {
+	public class SplitContainerTests {
+
+		readonly ITestOutputHelper output;
+
+		public SplitContainerTests (ITestOutputHelper output)
+		{
+			this.output = output;
+		}
+
+
+		[Fact,AutoInitShutdown]
+		public void TestSplitContainer_Vertical()
+		{
+			var splitContainer = Get11By3SplitContainer ();
+			splitContainer.Redraw (splitContainer.Bounds);
+
+			string looksLike =
+@"
+11111│22222
+     │
+     │     ";
+			TestHelpers.AssertDriverContentsAre (looksLike, output);
+		}
+		[Fact, AutoInitShutdown]
+		public void TestSplitContainer_Vertical_Focused ()
+		{
+			var splitContainer = Get11By3SplitContainer ();
+			splitContainer.EnsureFocus ();
+			splitContainer.FocusFirst ();
+			splitContainer.Redraw (splitContainer.Bounds);
+
+			string looksLike =
+@"
+11111│22222
+     ◊
+     │     ";
+			TestHelpers.AssertDriverContentsAre (looksLike, output);
+		}
+
+		[Fact, AutoInitShutdown]
+		public void TestSplitContainer_Horizontal ()
+		{
+			var splitContainer = Get11By3SplitContainer ();
+			splitContainer.Orientation = Terminal.Gui.Graphs.Orientation.Horizontal;
+			splitContainer.Redraw (splitContainer.Bounds);
+
+			string looksLike =
+@"    
+11111111111
+───────────
+22222222222";
+			TestHelpers.AssertDriverContentsAre (looksLike, output);
+		}
+
+		[Fact, AutoInitShutdown]
+		public void TestSplitContainer_Horizontal_Focused ()
+		{
+			var splitContainer = Get11By3SplitContainer ();
+
+			splitContainer.Orientation = Terminal.Gui.Graphs.Orientation.Horizontal;
+			splitContainer.EnsureFocus();
+			splitContainer.FocusFirst();
+
+			splitContainer.Redraw (splitContainer.Bounds);
+
+			string looksLike =
+@"    
+11111111111
+─────◊─────
+22222222222";
+			TestHelpers.AssertDriverContentsAre (looksLike, output);
+		}
+
+
+		private SplitContainer Get11By3SplitContainer ()
+		{
+			var container = new SplitContainer () {
+				Width = 11,
+				Height = 3,
+			};
+			
+			container.Panel1.Add (new Label (new string ('1', 100)));
+			container.Panel2.Add (new Label (new string ('2', 100)));
+
+			Application.Top.Add (container);
+			container.ColorScheme = new ColorScheme ();
+			container.LayoutSubviews ();
+
+			return container;
+		}
+	}
+}