diff --git a/UICatalog/Scenarios/SplitContainerExample.cs b/UICatalog/Scenarios/SplitContainerExample.cs deleted file mode 100644 index 27804e062..000000000 --- a/UICatalog/Scenarios/SplitContainerExample.cs +++ /dev/null @@ -1,170 +0,0 @@ -using Terminal.Gui; -using Terminal.Gui.Graphs; -using NStack; - -namespace UICatalog.Scenarios { - [ScenarioMetadata (Name: "Split Container", Description: "Demonstrates the SplitContainer functionality")] - [ScenarioCategory ("Controls")] - [ScenarioCategory ("LineView")] - public class SplitContainerExample : Scenario { - - private SplitContainer splitContainer; - - private SplitContainer nestedSplitContainer; - private MenuItem miVertical; - private MenuItem miShowBoth; - private MenuItem miShowPanel1; - private MenuItem miShowPanel2; - private MenuItem miShowNeither; - - private MenuItem miSplitContainer1Border; - private MenuItem minestedSplitContainerBorder; - - /// - /// Setup the scenario. - /// - public override void Setup () - { - // Scenario Windows. - Win.Title = this.GetName (); - Win.Y = 1; - - Win.Add (new Label ("This is a SplitContainer with a minimum panel size of 4. Drag the splitter to resize:")); - - splitContainer = new SplitContainer { - Y = 2, - X = 2, - Width = Dim.Fill () - 2, - Height = Dim.Fill () - 1, - SplitterDistance = Pos.Percent (50), - }; - nestedSplitContainer = new SplitContainer(){ - Width = Dim.Fill(), - Height = Dim.Fill(), - Orientation = Orientation.Horizontal - }; - - splitContainer.Panel1MinSize = 4; - splitContainer.Panel2MinSize = 4; - - Label lbl1; - splitContainer.Panel1Title = "Hello"; - splitContainer.Panel1.Add (lbl1 = new Label ("Type Something:") { Y = 0 }); - splitContainer.Panel1.Add (new TextField () { Width = Dim.Fill (), Y = 0, X = Pos.Right (lbl1) + 1 }); - - Label lbl2; - splitContainer.Panel2Title = "World"; - splitContainer.Panel2.Add(nestedSplitContainer); - - nestedSplitContainer.Panel1.Add (new TextView () - { - Width = Dim.Fill(), - Height = Dim.Fill(), - Text = GenerateLotsOfText(), - AllowsTab = false, - WordWrap = true, - }); - - nestedSplitContainer.IntegratedBorder = BorderStyle.None; - - nestedSplitContainer.Panel2.Add (lbl2 = new Label ("Type Here Too:") { Y = 0 }); - nestedSplitContainer.Panel2.Add (new TextField () { Width = Dim.Fill (), Y = 0, X = Pos.Right (lbl2) + 1 }); - nestedSplitContainer.Panel2.Add (new Label ("Here is a Text box:") { Y = 1 }); - nestedSplitContainer.Panel2.Add (new TextView () { Y = 2, Width = Dim.Fill (), Height = Dim.Fill (), AllowsTab = false }); - - Win.Add (splitContainer); - - var menu = new MenuBar (new MenuBarItem [] { - new MenuBarItem ("_File", new MenuItem [] { - new MenuItem ("_Quit", "", () => Quit()), - }), - new MenuBarItem ("_Options", new MenuItem [] { - miVertical = new MenuItem ("_Vertical", "", () => ToggleOrientation()) - { - Checked = splitContainer.Orientation == Orientation.Vertical, - CheckType = MenuItemCheckStyle.Checked - }, - miSplitContainer1Border = new MenuItem ("_Outer Panel Border", "", () => ToggleBorder(miSplitContainer1Border, splitContainer)) - { - Checked = splitContainer.IntegratedBorder == BorderStyle.Single, - CheckType = MenuItemCheckStyle.Checked - }, - minestedSplitContainerBorder = new MenuItem ("_Inner Panel Border", "", () => ToggleBorder(minestedSplitContainerBorder,nestedSplitContainer)) - { - Checked = nestedSplitContainer.IntegratedBorder == BorderStyle.Single, - CheckType = MenuItemCheckStyle.Checked - }, - new MenuBarItem ("_Show", new MenuItem [] { - miShowBoth = new MenuItem ("Both", "",()=>{ - splitContainer.Panel1.Visible = true; - splitContainer.Panel2.Visible = true; - UpdateShowMenuCheckedStates(); - }), - miShowPanel1 = new MenuItem ("Panel 1", "", () => { - splitContainer.Panel1.Visible = true; - splitContainer.Panel2.Visible = false; - UpdateShowMenuCheckedStates(); - }), - miShowPanel2 = new MenuItem ("Panel 2", "", () => { - splitContainer.Panel1.Visible = false; - splitContainer.Panel2.Visible = true; - UpdateShowMenuCheckedStates(); - }), - miShowNeither = new MenuItem ("Neither", "",()=>{ - splitContainer.Panel1.Visible = false; - splitContainer.Panel2.Visible = false; - UpdateShowMenuCheckedStates(); - }), - }) - }), - }); - - UpdateShowMenuCheckedStates (); - - Application.Top.Add (menu); - } - - private ustring GenerateLotsOfText () - { - return "Hello There ".Repeat(100); - } - - private void UpdateShowMenuCheckedStates () - { - miShowBoth.Checked = (splitContainer.Panel1.Visible) && (splitContainer.Panel2.Visible); - miShowBoth.CheckType = MenuItemCheckStyle.Checked; - - miShowPanel1.Checked = splitContainer.Panel1.Visible && !splitContainer.Panel2.Visible; - miShowPanel1.CheckType = MenuItemCheckStyle.Checked; - - miShowPanel2.Checked = !splitContainer.Panel1.Visible && splitContainer.Panel2.Visible; - miShowPanel2.CheckType = MenuItemCheckStyle.Checked; - - miShowNeither.Checked = (!splitContainer.Panel1.Visible) && (!splitContainer.Panel2.Visible); - miShowNeither.CheckType = MenuItemCheckStyle.Checked; - } - - public void ToggleOrientation () - { - miVertical.Checked = !miVertical.Checked; - splitContainer.Orientation = miVertical.Checked ? Orientation.Vertical : Orientation.Horizontal; - nestedSplitContainer.Orientation = miVertical.Checked ? Orientation.Horizontal : Orientation.Vertical; - } - - private void ToggleBorder (MenuItem menuItem, SplitContainer splitContainer) - { - menuItem.Checked = !menuItem.Checked; - - if(menuItem.Checked) { - splitContainer.IntegratedBorder = BorderStyle.Single; - } else { - splitContainer.IntegratedBorder = BorderStyle.None; - } - } - - private void Quit () - { - Application.RequestStop (); - } - } -} \ No newline at end of file diff --git a/UICatalog/Scenarios/SplitContainerNesting.cs b/UICatalog/Scenarios/SplitContainerNesting.cs index 1c9838803..527d4343f 100644 --- a/UICatalog/Scenarios/SplitContainerNesting.cs +++ b/UICatalog/Scenarios/SplitContainerNesting.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel; using System.Linq; +using System.Threading; using Terminal.Gui; using Terminal.Gui.Graphs; @@ -17,6 +18,8 @@ namespace UICatalog.Scenarios { private CheckBox cbTitles; bool loaded = false; + int panelsCreated; + int panelsToCreate; /// /// Setup the scenario. @@ -87,7 +90,7 @@ namespace UICatalog.Scenarios { bool startHorizontal = cbHorizontal.Checked; workArea.RemoveAll (); - + if (numberOfPanels <= 0) { return; } @@ -113,7 +116,9 @@ namespace UICatalog.Scenarios { if (numberOfPanels > 2) { - AddMorePanels (root, 2, numberOfPanels); + panelsCreated = 2; + panelsToCreate = numberOfPanels; + AddMorePanels (root); } if (loaded) { @@ -128,59 +133,57 @@ namespace UICatalog.Scenarios { Height = Dim.Fill (), Text = number.ToString ().Repeat (1000), AllowsTab = false, - WordWrap = true, + //WordWrap = true, // TODO: This is very slow (like 10s to render with 45 panels) }; } - private void AddMorePanels (SplitContainer to, int done, int numberOfPanels) + private void AddMorePanels (SplitContainer to) { - if (done == numberOfPanels) { - return; + bool canSplitLeft = !(to.Panel1 is SplitContainer); + bool canSplitRight = !(to.Panel2 is SplitContainer); + + if(canSplitRight) { + SplitRight (to); } - View toSplit; - - if (!(to.Panel1 is SplitContainer)) { - - // we can split Panel1 - var tv = (TextView)to.Panel1.Subviews.Single (); - - var newContainer = CreateSplitContainer (to.Orientation, true); - - to.Remove (to.Panel1); - to.Add (newContainer); - to.Panel1 = newContainer; - - newContainer.Panel1.Add (tv); - newContainer.Panel2.Add (CreateTextView (++done)); - - AddMorePanels (to, done, numberOfPanels); - } else - if (!(to.Panel2 is SplitContainer)) { - // we can split Panel2 - var tv = (TextView)to.Panel2.Subviews.Single (); - - var newContainer = CreateSplitContainer (to.Orientation, true); - - to.Remove (to.Panel2); - to.Add (newContainer); - to.Panel2 = newContainer; - - newContainer.Panel1.Add (tv); - newContainer.Panel2.Add (CreateTextView (++done)); - - AddMorePanels (to, done, numberOfPanels); - } else { - // Both Panel1 and Panel2 are already SplitContainer - - // So split one of the children - if(done % 2 == 0) { - AddMorePanels ((SplitContainer)to.Panel1, done, numberOfPanels); - } else { - - AddMorePanels ((SplitContainer)to.Panel2, done, numberOfPanels); - } + if (canSplitLeft && panelsCreated < panelsToCreate) { + SplitLeft(to); } + + if (to.Panel1 is SplitContainer && to.Panel2 is SplitContainer) { + + AddMorePanels ((SplitContainer)to.Panel1); + AddMorePanels ((SplitContainer)to.Panel2); + } + + } + private void SplitLeft(SplitContainer to) + { + // we can split Panel1 + var tv = (TextView)to.Panel1.Subviews.Single (); + + var newContainer = CreateSplitContainer (to.Orientation, true); + + to.Remove (to.Panel1); + to.Add (newContainer); + to.Panel1 = newContainer; + + newContainer.Panel1.Add (tv); + newContainer.Panel2.Add (CreateTextView (++panelsCreated)); + } + private void SplitRight(SplitContainer to) + { + // we can split Panel2 + var tv = (TextView)to.Panel2.Subviews.Single (); + + var newContainer = CreateSplitContainer (to.Orientation, true); + + to.Remove (to.Panel2); + to.Add (newContainer); + to.Panel2 = newContainer; + + newContainer.Panel2.Add (tv); + newContainer.Panel1.Add (CreateTextView (++panelsCreated)); } private SplitContainer CreateSplitContainer (Orientation orientation, bool flip)