123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- using System;
- using Terminal.Gui.Graphs;
- using static Terminal.Gui.Dim;
- namespace Terminal.Gui {
- public class SplitContainer : View {
- private LineView splitterLine = new LineView ();
- private bool panel1Collapsed;
- private bool panel2Collapsed;
- public SplitContainer ()
- {
- // Default to a border of 1 so that View looks nice
- Border = new Border ();
- this.Add (splitterLine);
- this.Add (Panel1);
- this.Add (Panel2);
- SetOrientation (Orientation.Vertical, Pos.Percent (50));
- // TODO: Actually respect collapsed statuses
- }
- private void SetOrientation (Orientation orientation, Pos splitterDistance)
- {
- // TODO: Enforce minimum sizes
- splitterLine.Orientation = orientation;
- switch (orientation) {
- case Orientation.Horizontal:
- splitterLine.X = 0;
- splitterLine.Y = splitterDistance;
- splitterLine.Width = Dim.Fill ();
- splitterLine.Height = 1;
- splitterLine.LineRune = Driver.HLine;
- this.Panel1.X = 0;
- this.Panel1.Y = 0;
- this.Panel1.Width = Dim.Fill ();
- this.Panel1.Height = new DimFunc (() =>
- splitterDistance.Anchor (Bounds.Height) - 1);
- this.Panel2.Y = Pos.Bottom (splitterLine) + 1;
- this.Panel2.X = 0;
- this.Panel2.Width = Dim.Fill ();
- this.Panel2.Height = Dim.Fill ();
- break;
- case Orientation.Vertical:
- splitterLine.X = splitterDistance;
- splitterLine.Y = 0;
- splitterLine.Width = 1;
- splitterLine.Height = Dim.Fill ();
- splitterLine.LineRune = Driver.VLine;
- this.Panel1.X = 0;
- this.Panel1.Y = 0;
- this.Panel1.Height = Dim.Fill ();
- this.Panel1.Width = new DimFunc (() =>
- splitterDistance.Anchor (Bounds.Width) - 1);
- this.Panel2.X = Pos.Right (splitterLine) + 1;
- this.Panel2.Y = 0;
- this.Panel2.Width = Dim.Fill ();
- this.Panel2.Height = Dim.Fill ();
- break;
- default: throw new ArgumentOutOfRangeException (nameof (orientation));
- };
- }
- /// <summary>
- /// The left or top panel of the <see cref="SplitContainer"/>
- /// (depending on <see cref="Orientation"/>). Add panel contents
- /// to this <see cref="View"/> using <see cref="View.Add(View)"/>.
- /// </summary>
- public View Panel1 { get; } = new View ();
- public int Panel1MinSize { get; set; }
- /// <summary>
- /// This determines if <see cref="Panel1"/> is collapsed.
- /// </summary>
- public bool Panel1Collapsed {
- get { return panel1Collapsed; }
- set {
- panel1Collapsed = value;
- if (value && panel2Collapsed) {
- panel2Collapsed = false;
- }
- }
- }
- /// <summary>
- /// The right or bottom panel of the <see cref="SplitContainer"/>
- /// (depending on <see cref="Orientation"/>). Add panel contents
- /// to this <see cref="View"/> using <see cref="View.Add(View)"/>
- /// </summary>
- public View Panel2 { get; } = new View ();
- public int Panel2MinSize { get; set; }
- /// <summary>
- /// This determines if <see cref="Panel2"/> is collapsed.
- /// </summary>
- public bool Panel2Collapsed {
- get { return panel2Collapsed; }
- set {
- panel2Collapsed = value;
- if (value && panel1Collapsed) {
- panel1Collapsed = false;
- }
- }
- }
- public Orientation Orientation { get; set; }
- public Pos SplitterDistance { get; set; }
- }
- }
|