diff --git a/Terminal.Gui/Views/SplitContainer.cs b/Terminal.Gui/Views/SplitContainer.cs
index 13b462fbb..0c7ffdb0f 100644
--- a/Terminal.Gui/Views/SplitContainer.cs
+++ b/Terminal.Gui/Views/SplitContainer.cs
@@ -58,7 +58,7 @@ namespace Terminal.Gui {
///
protected virtual void OnSplitterMoved ()
{
- SplitterMoved?.Invoke (this,new SplitterEventArgs(this,splitterDistance));
+ SplitterMoved?.Invoke (this, new SplitterEventArgs (this, splitterDistance));
}
@@ -127,15 +127,17 @@ namespace Terminal.Gui {
///
- /// Distance Horizontally or Vertically to the splitter line when
+ /// Distance Horizontally or Vertically to the splitter line when
/// neither panel is collapsed.
+ ///
+ /// Only absolute values (e.g. 10) and percent values (i.e. )
+ /// are supported for this property.
///
public Pos SplitterDistance {
get { return splitterDistance; }
set {
- if(!(value is Pos.PosAbsolute) && !(value is Pos.PosFactor))
- {
- throw new ArgumentException($"Only Percent and Absolute values are supported for {nameof(SplitterDistance)} property. Passed value was {value.GetType().Name}");
+ if (!(value is Pos.PosAbsolute) && !(value is Pos.PosFactor)) {
+ throw new ArgumentException ($"Only Percent and Absolute values are supported for {nameof (SplitterDistance)} property. Passed value was {value.GetType ().Name}");
}
splitterDistance = value;
@@ -258,14 +260,14 @@ namespace Terminal.Gui {
// TODO: we should preserve Absolute/Percent status here not just force it to absolute
return (Pos)Math.Min (panel1MinSizeAbs, availableSpace);
}
-
+
// bad position because not enough space for panel2
- if(availableSpace - idealPosition <= panel2MinSizeAbs) {
+ if (availableSpace - idealPosition <= panel2MinSizeAbs) {
// TODO: we should preserve Absolute/Percent status here not just force it to absolute
// +1 is to allow space for the splitter
- return (Pos)Math.Max (availableSpace - (panel2MinSizeAbs+1), 0);
+ return (Pos)Math.Max (availableSpace - (panel2MinSizeAbs + 1), 0);
}
// this splitter position is fine, there is enough space for everyone
@@ -278,7 +280,7 @@ namespace Terminal.Gui {
View toFullSize = panel1Collapsed ? Panel2 : Panel1;
if (this.Subviews.Contains (splitterLine)) {
- this.Remove(splitterLine);
+ this.Remove (splitterLine);
}
if (this.Subviews.Contains (toRemove)) {
this.Remove (toRemove);
diff --git a/UnitTests/SplitContainerTests.cs b/UnitTests/SplitContainerTests.cs
index e52643c3d..64e6c4f5e 100644
--- a/UnitTests/SplitContainerTests.cs
+++ b/UnitTests/SplitContainerTests.cs
@@ -14,8 +14,8 @@ namespace UnitTests {
}
- [Fact,AutoInitShutdown]
- public void TestSplitContainer_Vertical()
+ [Fact, AutoInitShutdown]
+ public void TestSplitContainer_Vertical ()
{
var splitContainer = Get11By3SplitContainer ();
splitContainer.Redraw (splitContainer.Bounds);
@@ -74,6 +74,53 @@ namespace UnitTests {
TestHelpers.AssertDriverContentsAre (looksLike, output);
}
+ [Fact, AutoInitShutdown]
+ public void TestSplitContainer_Vertical_Focused_50PercentSplit ()
+ {
+ var splitContainer = Get11By3SplitContainer ();
+ splitContainer.EnsureFocus ();
+ splitContainer.FocusFirst ();
+ splitContainer.SplitterDistance = Pos.Percent (50);
+ Assert.IsType (splitContainer.SplitterDistance);
+ splitContainer.Redraw (splitContainer.Bounds);
+
+ string looksLike =
+@"
+11111│22222
+ ◊
+ │ ";
+ TestHelpers.AssertDriverContentsAre (looksLike, output);
+
+ // Now while focused move the splitter 1 unit right
+ splitContainer.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ()));
+ splitContainer.Redraw (splitContainer.Bounds);
+
+ looksLike =
+@"
+111111│2222
+ ◊
+ │ ";
+ TestHelpers.AssertDriverContentsAre (looksLike, output);
+
+ // Even when moving the splitter location it should stay a Percentage based one
+ Assert.IsType (splitContainer.SplitterDistance);
+
+
+ // and 2 to the left
+ splitContainer.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ()));
+ splitContainer.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ()));
+ splitContainer.Redraw (splitContainer.Bounds);
+
+ looksLike =
+@"
+1111│222222
+ ◊
+ │ ";
+ TestHelpers.AssertDriverContentsAre (looksLike, output);
+ // Even when moving the splitter location it should stay a Percentage based one
+ Assert.IsType (splitContainer.SplitterDistance);
+ }
+
[Fact, AutoInitShutdown]
public void TestSplitContainer_Horizontal ()
{
@@ -100,7 +147,7 @@ namespace UnitTests {
public void TestSplitContainer_Vertical_Panel1MinSize_Absolute ()
{
var splitContainer = Get11By3SplitContainer ();
-
+
splitContainer.EnsureFocus ();
splitContainer.FocusFirst ();
splitContainer.Panel1MinSize = 6;
@@ -109,7 +156,7 @@ namespace UnitTests {
splitContainer.SplitterDistance = 2;
// Should bound the value to the minimum distance
- Assert.Equal(6,splitContainer.SplitterDistance);
+ Assert.Equal (6, splitContainer.SplitterDistance);
splitContainer.Redraw (splitContainer.Bounds);
@@ -132,7 +179,7 @@ namespace UnitTests {
splitContainer.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ()));
splitContainer.SetNeedsDisplay ();
splitContainer.Redraw (splitContainer.Bounds);
-
+
looksLike =
@"
1111111│222
@@ -148,8 +195,8 @@ namespace UnitTests {
var splitContainer = Get11By3SplitContainer ();
splitContainer.Orientation = Terminal.Gui.Graphs.Orientation.Horizontal;
- splitContainer.EnsureFocus();
- splitContainer.FocusFirst();
+ splitContainer.EnsureFocus ();
+ splitContainer.FocusFirst ();
splitContainer.Redraw (splitContainer.Bounds);
@@ -194,7 +241,7 @@ namespace UnitTests {
// 0 should not be allowed because it brings us below minimum size of Panel1
splitContainer.SplitterDistance = 0;
- Assert.Equal((Pos)1,splitContainer.SplitterDistance);
+ Assert.Equal ((Pos)1, splitContainer.SplitterDistance);
splitContainer.Redraw (splitContainer.Bounds);
@@ -232,16 +279,16 @@ namespace UnitTests {
{
var splitContainer = Get11By3SplitContainer ();
- var ex = Assert.Throws(()=>splitContainer.SplitterDistance = Pos.Right(splitContainer));
- Assert.Equal("Only Percent and Absolute values are supported for SplitterDistance property. Passed value was PosCombine",ex.Message);
+ var ex = Assert.Throws (() => splitContainer.SplitterDistance = Pos.Right (splitContainer));
+ Assert.Equal ("Only Percent and Absolute values are supported for SplitterDistance property. Passed value was PosCombine", ex.Message);
- ex = Assert.Throws(()=>splitContainer.SplitterDistance = Pos.Function(()=>1));
- Assert.Equal("Only Percent and Absolute values are supported for SplitterDistance property. Passed value was PosFunc",ex.Message);
+ ex = Assert.Throws (() => splitContainer.SplitterDistance = Pos.Function (() => 1));
+ Assert.Equal ("Only Percent and Absolute values are supported for SplitterDistance property. Passed value was PosFunc", ex.Message);
// Also not allowed because this results in a PosCombine
- ex = Assert.Throws(()=>splitContainer.SplitterDistance = Pos.Percent(50) - 1);
- Assert.Equal("Only Percent and Absolute values are supported for SplitterDistance property. Passed value was PosCombine",ex.Message);
+ ex = Assert.Throws (() => splitContainer.SplitterDistance = Pos.Percent (50) - 1);
+ Assert.Equal ("Only Percent and Absolute values are supported for SplitterDistance property. Passed value was PosCombine", ex.Message);
}
private SplitContainer Get11By3SplitContainer ()
@@ -250,7 +297,7 @@ namespace UnitTests {
Width = 11,
Height = 3,
};
-
+
container.Panel1.Add (new Label (new string ('1', 100)));
container.Panel2.Add (new Label (new string ('2', 100)));