diff --git a/Terminal.Gui/Core/Container.cs b/Terminal.Gui/Core/Container.cs index 0400f7459..01f87d815 100644 --- a/Terminal.Gui/Core/Container.cs +++ b/Terminal.Gui/Core/Container.cs @@ -9,31 +9,69 @@ namespace Terminal.Gui { public class Frame : View { + /// + /// Frames are a special form of that act as adornments; they appear outside of the + /// eanbling borders, menus, etc... + /// public Frame () { IgnoreBorderPropertyOnRedraw = true; } + /// + /// The Parent of this Frame (Adornment). + /// + public View Parent { get; set; } + + /// + /// Frames cannot be used as sub-views, so this method always throws an . + /// TODO: Are we sure? + /// + public override View SuperView { + get { + return null; + } + set { + throw new NotImplementedException (); + } + } + + /// + public override void ViewToScreen (int col, int row, out int rcol, out int rrow, bool clipped = true) + { + // Frames are children of a View, not SubViews. Thus ViewToScreen will not work. + // To get the screen-relative coordinates of a Frame, we need to know who + // the Parent is + + // Computes the real row, col relative to the screen. + var inner = Parent?.Bounds ?? Bounds; + rrow = row - inner.Y; + rcol = col - inner.X; + + Parent?.ViewToScreen (rcol, rrow, out rcol, out rrow, clipped); + + } + public virtual void OnDrawSubViews (Rect clipRect) { - // if (Subviews == null) { - // return; - // } + // if (Subviews == null) { + // return; + // } - // foreach (var view in Subviews) { - // // BUGBUG: v2 - shouldn't this be !view.LayoutNeeded? Why draw if layout is going to happen and we'll just draw again? - // if (view.LayoutNeeded) { - // view.LayoutSubviews (); - // } - // if ((view.Visible && !view.NeedDisplay.IsEmpty && view.Frame.Width > 0 && view.Frame.Height > 0) || view.ChildNeedsDisplay) { - // view.Redraw (view.Bounds); + // foreach (var view in Subviews) { + // // BUGBUG: v2 - shouldn't this be !view.LayoutNeeded? Why draw if layout is going to happen and we'll just draw again? + // if (view.LayoutNeeded) { + // view.LayoutSubviews (); + // } + // if ((view.Visible && !view.NeedDisplay.IsEmpty && view.Frame.Width > 0 && view.Frame.Height > 0) || view.ChildNeedsDisplay) { + // view.Redraw (view.Bounds); - // view.NeedDisplay = Rect.Empty; - // // BUGBUG - v2 why does this need to be set to false? - // // Shouldn't it be set when the subviews draw? - // view.ChildNeedsDisplay = false; - // } - // } + // view.NeedDisplay = Rect.Empty; + // // BUGBUG - v2 why does this need to be set to false? + // // Shouldn't it be set when the subviews draw? + // view.ChildNeedsDisplay = false; + // } + // } } @@ -53,9 +91,13 @@ namespace Terminal.Gui { } } - public override void Redraw (Rect bounds) + /// + /// Redraws the Frames that comprise the . + /// + /// + public override void Redraw (Rect clipRect) { - + //OnDrawContent (bounds); //OnDrawSubViews (bounds); //OnDrawContentComplete (bounds); @@ -64,24 +106,25 @@ namespace Terminal.Gui { Driver.SetAttribute (ColorScheme.Normal); } - Thickness.Draw (Frame, (string)Data); + var screenBounds = ViewToScreen (Frame); + Thickness.Draw (screenBounds, (string)Data); //OnDrawContent (bounds); if (BorderStyle != BorderStyle.None) { var lc = new LineCanvas (); - lc.AddLine (Frame.Location, Frame.Width - 1, Orientation.Horizontal, BorderStyle); - lc.AddLine (Frame.Location, Frame.Height - 1, Orientation.Vertical, BorderStyle); + lc.AddLine (screenBounds.Location, Frame.Width - 1, Orientation.Horizontal, BorderStyle); + lc.AddLine (screenBounds.Location, Frame.Height - 1, Orientation.Vertical, BorderStyle); - lc.AddLine (new Point (Frame.X, Frame.Y + Frame.Height - 1), Frame.Width - 1, Orientation.Horizontal, BorderStyle); - lc.AddLine (new Point (Frame.X + Frame.Width - 1, Frame.Y), Frame.Height - 1, Orientation.Vertical, BorderStyle); - foreach (var p in lc.GenerateImage (Frame)) { + lc.AddLine (new Point (screenBounds.X, screenBounds.Y + screenBounds.Height - 1), screenBounds.Width - 1, Orientation.Horizontal, BorderStyle); + lc.AddLine (new Point (screenBounds.X + screenBounds.Width - 1, screenBounds.Y), screenBounds.Height - 1, Orientation.Vertical, BorderStyle); + foreach (var p in lc.GenerateImage (screenBounds)) { Driver.Move (p.Key.X, p.Key.Y); Driver.AddRune (p.Value); } if (!ustring.IsNullOrEmpty (Title)) { - Driver.DrawWindowTitle (Frame, Title, 0, 0, 0, 0); + Driver.DrawWindowTitle (screenBounds, Title, 0, 0, 0, 0); } } } @@ -100,7 +143,7 @@ namespace Terminal.Gui { /// /// Gets the rectangle that describes the inner area of the frame. The Location is always 0, 0. /// - public new Rect Bounds { + public Rect Bounds { get { if (Thickness != null) { new Rect (Point.Empty, Frame.Size); diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs index 6e209d5da..fb396cc32 100644 --- a/Terminal.Gui/Core/View.cs +++ b/Terminal.Gui/Core/View.cs @@ -467,22 +467,34 @@ namespace Terminal.Gui { IgnoreBorderPropertyOnRedraw = true; Margin?.Dispose (); Margin = new Frame () { + X = 0, + Y = 0, Thickness = new Thickness (0), - ColorScheme = SuperView?.ColorScheme ?? ColorScheme + ColorScheme = SuperView?.ColorScheme ?? ColorScheme, + // TODO: Create View.AddAdornment + Parent = this }; //Margin.DiagnosticsLabel.Text = "Margin"; BorderFrame?.Dispose (); BorderFrame = new Frame () { + X = 0, + Y = 0, BorderStyle = BorderStyle.Single, Thickness = new Thickness (0), - ColorScheme = ColorScheme + ColorScheme = ColorScheme, + // TODO: Create View.AddAdornment + Parent = this }; Padding?.Dispose (); Padding = new Frame () { + X = 0, + Y = 0, Thickness = new Thickness (0), - ColorScheme = ColorScheme + ColorScheme = ColorScheme, + // TODO: Create View.AddAdornment + Parent = this }; } @@ -539,8 +551,8 @@ namespace Terminal.Gui { if (Padding == null || BorderFrame == null || Margin == null) { return new Rect (Point.Empty, Frame.Size); } - var frameRelativeBounds = Padding.Thickness.GetInnerRect (BorderFrame.Thickness.GetInnerRect (Margin.Thickness.GetInnerRect (new Rect (Point.Empty, Frame.Size)))); - return frameRelativeBounds; + var superviewRelativeBounds = Padding.Thickness.GetInnerRect (BorderFrame.Thickness.GetInnerRect (Margin.Thickness.GetInnerRect (Frame))); + return new Rect (Point.Empty, superviewRelativeBounds.Size); } set { Debug.WriteLine ($"It makes no sense to set Bounds. Use Frame instead. Bounds: {value}"); @@ -548,15 +560,6 @@ namespace Terminal.Gui { } } - public Rect ScreenRelativeBounds { - get { - if (Padding == null || BorderFrame == null || Margin == null) { - return Frame; - } - return Padding.Thickness.GetInnerRect (BorderFrame.Thickness.GetInnerRect (Margin.Thickness.GetInnerRect (Frame))); - } - } - Pos x, y; /// @@ -727,7 +730,14 @@ namespace Terminal.Gui { /// Returns the container for this view, or null if this view has not been added to a container. /// /// The super view. - public View SuperView => container; + public virtual View SuperView { + get { + return container; + } + set { + throw new NotImplementedException (); + } + } /// /// Initializes a new instance of a class with the absolute @@ -1200,8 +1210,8 @@ namespace Terminal.Gui { public virtual void ViewToScreen (int col, int row, out int rcol, out int rrow, bool clipped = true) { // Computes the real row, col relative to the screen. - rrow = row + frame.Y; - rcol = col + frame.X; + rrow = row + Frame.Y; + rcol = col + Frame.X; var curContainer = container; while (curContainer != null) { @@ -1537,8 +1547,9 @@ namespace Terminal.Gui { ChildNeedsDisplay = false; } - public virtual bool OnDrawFrames (Rect frame) + public virtual bool OnDrawFrames () { + // TODO: add cancellable event //if (!DrawFrames?.Invoke (frame)) { // return false; //} @@ -1547,26 +1558,82 @@ namespace Terminal.Gui { return false; } - Margin.Redraw (Margin.Bounds); + Margin.Redraw (Margin.Frame); BorderFrame.Title = Title; - BorderFrame.Redraw (BorderFrame.Bounds); - Padding.Redraw (BorderFrame.Bounds); - - var border = Margin.Thickness.GetInnerRect (frame); - var padding = BorderFrame.Thickness.GetInnerRect (border); - var content = Padding.Thickness.GetInnerRect (padding); - - //// Draw the diagnostics label on the bottom of the content - //var tf = new TextFormatter () { - // Text = $"Content {Bounds}", - // Alignment = TextAlignment.Centered, - // VerticalAlignment = VerticalTextAlignment.Bottom - //}; - //tf.Draw (content, ColorScheme.Normal, ColorScheme.Normal); + BorderFrame.Redraw (BorderFrame.Frame); + Padding.Redraw (Padding.Frame); return true; } + + /// + /// Event invoked when the content area of the View is to be drawn. + /// + /// + /// + /// Will be invoked before any subviews added with have been drawn. + /// + /// + /// Rect provides the view-relative rectangle describing the currently visible viewport into the . + /// + /// + public event Action DrawContent; + + /// + /// Enables overrides to draw infinitely scrolled content and/or a background behind added controls. + /// + /// The view-relative rectangle describing the currently visible viewport into the + /// + /// This method will be called before any subviews added with have been drawn. + /// + public virtual void OnDrawContent (Rect contentArea) + { + // TODO: Make DrawContent a cancelable event + DrawContent?.Invoke (contentArea); + + // if (!DrawContent?.Invoke(viewport)) { + if (!ustring.IsNullOrEmpty (TextFormatter.Text)) { + //Rect containerBounds = GetContainerBounds (); + //Clear (ViewToScreen (GetNeedDisplay (containerBounds))); + SetChildNeedsDisplay (); + // Draw any Text + if (TextFormatter != null) { + TextFormatter.NeedsFormat = true; + } + TextFormatter?.Draw (ViewToScreen(Bounds), HasFocus ? ColorScheme.Focus : GetNormalColor (), + HasFocus ? ColorScheme.HotFocus : Enabled ? ColorScheme.HotNormal : ColorScheme.Disabled, + contentArea, false); + } + // } + + } + + /// + /// Event invoked when the content area of the View is completed drawing. + /// + /// + /// + /// Will be invoked after any subviews removed with have been completed drawing. + /// + /// + /// Rect provides the view-relative rectangle describing the currently visible viewport into the . + /// + /// + public event Action DrawContentComplete; + + /// + /// Enables overrides after completed drawing infinitely scrolled content and/or a background behind removed controls. + /// + /// The view-relative rectangle describing the currently visible viewport into the + /// + /// This method will be called after any subviews removed with have been completed drawing. + /// + public virtual void OnDrawContentComplete (Rect viewport) + { + DrawContentComplete?.Invoke (viewport); + } + /// /// Redraws this view and its subviews; only redraws the views that have been flagged for a re-display. /// @@ -1590,53 +1657,37 @@ namespace Terminal.Gui { return; } - OnDrawFrames (Frame); + OnDrawFrames (); + + // TODO: Implement complete event // OnDrawFramesComplete (Frame) if (ColorScheme != null) { Driver.SetAttribute (HasFocus ? ColorScheme.Focus : ColorScheme.Normal); } - var clipRect = new Rect (Point.Empty, frame.Size); + var prevClip = Driver.Clip; + Driver.Clip = ViewToScreen(Bounds); - var boundsAdjustedForBorder = Bounds; + // TODO: Remove once new v2 api is complete if (!IgnoreBorderPropertyOnRedraw && Border != null) { throw new InvalidOperationException ("Don't use Border!"); - //Border.DrawContent (this); - //boundsAdjustedForBorder = new Rect (bounds.X + 1, bounds.Y + 1, Math.Max (0, bounds.Width - 2), Math.Max (0, bounds.Height - 2)); - } else if (ustring.IsNullOrEmpty (TextFormatter.Text) && - (GetType ().IsNestedPublic) && !IsOverridden (this, "Redraw") && - (!NeedDisplay.IsEmpty || ChildNeedsDisplay || LayoutNeeded)) { - - Clear (); - SetChildNeedsDisplay (); - } - - if (!ustring.IsNullOrEmpty (TextFormatter.Text)) { - Rect containerBounds = GetContainerBounds (); - Clear (ViewToScreen (GetNeedDisplay (containerBounds))); - SetChildNeedsDisplay (); - // Draw any Text - if (TextFormatter != null) { - TextFormatter.NeedsFormat = true; - } - TextFormatter?.Draw (ViewToScreen (boundsAdjustedForBorder), HasFocus ? ColorScheme.Focus : GetNormalColor (), - HasFocus ? ColorScheme.HotFocus : Enabled ? ColorScheme.HotNormal : ColorScheme.Disabled, - containerBounds); - } - - // Invoke DrawContentEvent - OnDrawContent (boundsAdjustedForBorder); + } + // Draw content + OnDrawContent (Bounds); + + // Draw subviews + // TODO: Implement OnDrawSubviews (cancelable); if (subviews != null) { foreach (var view in subviews) { if (!view.NeedDisplay.IsEmpty || view.ChildNeedsDisplay || view.LayoutNeeded) { - if (view.Frame.IntersectsWith (clipRect) && (view.Frame.IntersectsWith (boundsAdjustedForBorder) || boundsAdjustedForBorder.X < 0 || bounds.Y < 0)) { - if (view.LayoutNeeded) + if (view.Frame.IntersectsWith (Driver.Clip) && (view.Frame.IntersectsWith (Bounds) || Bounds.X < 0 || Bounds.Y < 0)) { + if (view.LayoutNeeded) { view.LayoutSubviews (); + } // Draw the subview - // Use the view's bounds (view-relative; Location will always be (0,0) if (view.Visible && view.Frame.Width > 0 && view.Frame.Height > 0) { var rect = view.Bounds; view.OnDrawContent (rect); @@ -1651,8 +1702,9 @@ namespace Terminal.Gui { } // Invoke DrawContentCompleteEvent - OnDrawContentComplete (boundsAdjustedForBorder); + OnDrawContentComplete (Bounds); + Driver.Clip = prevClip; ClearLayoutNeeded (); ClearNeedsDisplay (); } @@ -1689,56 +1741,6 @@ namespace Terminal.Gui { return containerBounds; } - /// - /// Event invoked when the content area of the View is to be drawn. - /// - /// - /// - /// Will be invoked before any subviews added with have been drawn. - /// - /// - /// Rect provides the view-relative rectangle describing the currently visible viewport into the . - /// - /// - public event Action DrawContent; - - /// - /// Enables overrides to draw infinitely scrolled content and/or a background behind added controls. - /// - /// The view-relative rectangle describing the currently visible viewport into the - /// - /// This method will be called before any subviews added with have been drawn. - /// - public virtual void OnDrawContent (Rect viewport) - { - DrawContent?.Invoke (viewport); - } - - /// - /// Event invoked when the content area of the View is completed drawing. - /// - /// - /// - /// Will be invoked after any subviews removed with have been completed drawing. - /// - /// - /// Rect provides the view-relative rectangle describing the currently visible viewport into the . - /// - /// - public event Action DrawContentComplete; - - /// - /// Enables overrides after completed drawing infinitely scrolled content and/or a background behind removed controls. - /// - /// The view-relative rectangle describing the currently visible viewport into the - /// - /// This method will be called after any subviews removed with have been completed drawing. - /// - public virtual void OnDrawContentComplete (Rect viewport) - { - DrawContentComplete?.Invoke (viewport); - } - /// /// Causes the specified subview to have focus. /// @@ -2269,8 +2271,8 @@ namespace Terminal.Gui { /// The superview-relative bounds for . /// /// is screen-relative; is view-relative. - /// In v1, always has a location of {0, 0}. In v2, can be non-zero, - /// refelcting the Margin, Border, and Padding. + ///// In v1, always has a location of {0, 0}. In v2, can be non-zero, + ///// refelcting the Margin, Border, and Padding. /// internal void SetRelativeLayout (Rect superviewRelativeBounds) { @@ -2281,7 +2283,11 @@ namespace Terminal.Gui { autosize = GetAutoSize (); } - bool hasFrame = SuperView?.Margin != null || SuperView?.BorderFrame != null || SuperView?.Padding != null; + bool superviewHasFrame = SuperView?.Margin != null || SuperView?.BorderFrame != null || SuperView?.Padding != null; + var contentArea = superviewRelativeBounds; + if (superviewHasFrame) { + contentArea = SuperView.Padding.Thickness.GetInnerRect (SuperView.BorderFrame.Thickness.GetInnerRect (SuperView.Margin.Thickness.GetInnerRect (superviewRelativeBounds))); + } actX = x?.Anchor (superviewRelativeBounds.Width) ?? 0; actW = Math.Max (CalculateActualWidth (width, superviewRelativeBounds, actX, autosize), 0); @@ -2295,45 +2301,45 @@ namespace Terminal.Gui { actW = !autosize.IsEmpty && autosize.Width > actW ? autosize.Width : actW; } actX = x.Anchor (superviewRelativeBounds.Width - actW); - if (hasFrame) { - actX += superviewRelativeBounds.X; + if (superviewHasFrame) { + actX += contentArea.X; } break; case Pos.PosAbsolute: - if (hasFrame) { - actX += superviewRelativeBounds.X; + if (superviewHasFrame) { + actX += contentArea.X; } break; case Pos.PosAnchorEnd: - if (hasFrame) { - actX += superviewRelativeBounds.X; + if (superviewHasFrame) { + actX += contentArea.X; } break; case Pos.PosCombine: - if (hasFrame) { + if (superviewHasFrame) { var pc = x as Pos.PosCombine; switch (pc.left) { case Pos.PosAbsolute: - actX += superviewRelativeBounds.X; + actX += contentArea.X; break; case Pos.PosAnchorEnd: - actX += superviewRelativeBounds.X; + actX -= contentArea.X; break; case Pos.PosCenter: actX = x.Anchor (superviewRelativeBounds.Width - actW); - actX += superviewRelativeBounds.X; + actX += contentArea.X; break; case Pos.PosFactor: - actX += superviewRelativeBounds.X; + actX += contentArea.X; break; } @@ -2342,8 +2348,8 @@ namespace Terminal.Gui { case Pos.PosFactor: - if (hasFrame) { - actX += superviewRelativeBounds.X;// - SuperView.Frame.X; + if (superviewHasFrame) { + actX += contentArea.X;// - SuperView.Frame.X; } break; @@ -2357,7 +2363,7 @@ namespace Terminal.Gui { if (y is Pos.PosCenter) { if (height == null) { - actH = !autosize.IsEmpty ? autosize.Height : superviewRelativeBounds.Height; + actH = !autosize.IsEmpty ? autosize.Height : contentArea.Height; } else { actH = height.Anchor (superviewRelativeBounds.Height); actH = !autosize.IsEmpty && autosize.Height > actH ? autosize.Height : actH; @@ -2370,14 +2376,14 @@ namespace Terminal.Gui { - if ((y is Pos.PosAbsolute || y is Pos.PosCenter) && (hasFrame)) { - actY += superviewRelativeBounds.Y; + if ((y is Pos.PosAbsolute || y is Pos.PosCenter) && (superviewHasFrame)) { + actY += contentArea.Y; } - if ((y is Pos.PosAnchorEnd) && (hasFrame)) { - actY += superviewRelativeBounds.Y;// - SuperView.Frame.Y; + if ((y is Pos.PosAnchorEnd) && (superviewHasFrame)) { + actY -= contentArea.Y;// - SuperView.Frame.Y; } - if ((y is Pos.PosFactor) && (hasFrame)) { - actY += superviewRelativeBounds.Y;// - SuperView.Frame.Y; + if ((y is Pos.PosFactor) && (superviewHasFrame)) { + actY += contentArea.Y;// - SuperView.Frame.Y; } var r = new Rect (actX, actY, actW, actH); @@ -2559,9 +2565,10 @@ namespace Terminal.Gui { return; } + // TODO: Move to new method: LayoutAdornments if (Margin != null) { - Margin.X = Frame.Location.X; - Margin.Y = Frame.Location.Y; + Margin.X = 0; // Adornment location is parent-relative + Margin.Y = 0; Margin.Width = Frame.Size.Width; Margin.Height = Frame.Size.Height; Margin.SetNeedsLayout (); @@ -2665,7 +2672,7 @@ namespace Terminal.Gui { if (hasFrame) { // in v2 Bounds really is Frame-relative - bounds = Bounds; + bounds = new Rect (Point.Empty, Frame.Size); } foreach (var v in ordered) { diff --git a/UICatalog/Scenarios/TileViewExperiment.cs b/UICatalog/Scenarios/TileViewExperiment.cs index 2bff3e0f1..eb46db649 100644 --- a/UICatalog/Scenarios/TileViewExperiment.cs +++ b/UICatalog/Scenarios/TileViewExperiment.cs @@ -20,51 +20,54 @@ namespace UICatalog.Scenarios { /// public override void Setup () { - var menu = new MenuBar (new MenuBarItem [] { - new MenuBarItem ("_File", new MenuItem [] { - new MenuItem ("_Quit", "", () => Application.RequestStop()), - }) }); + //var menu = new MenuBar (new MenuBarItem [] { + //new MenuBarItem ("_File", new MenuItem [] { + // new MenuItem ("_Quit", "", () => Application.RequestStop()), + //}) }); - Application.Top.Add (menu); + //Application.Top.Add (menu); var frame1 = new FrameView () { + Title = "frame1", X = 0, - Y = 1, - Width = 15, //Dim.Fill (), + Y = 0, + Width = 70, //Dim.Fill (), Height = 15, //Dim.Fill (), //IgnoreBorderPropertyOnRedraw = true }; frame1.Border.BorderStyle = BorderStyle.Double; - var frame2 = new FrameView () { - X = 0, - Y = Pos.Bottom (frame1) + 1, - Width = 15, //Dim.Fill (), - Height = 15, //Dim.Fill (), - //IgnoreBorderPropertyOnRedraw = true + //var frame2 = new FrameView () { + // Title = "frame2", + // X = 0, + // Y = Pos.Bottom (frame1) + 1, + // Width = 20, //Dim.Fill (), + // Height = 15, //Dim.Fill (), + // //IgnoreBorderPropertyOnRedraw = true - }; - frame2.Border.BorderStyle = BorderStyle.Single; + //}; + //frame2.Border.BorderStyle = BorderStyle.Single; //ConsoleDriver.Diagnostics ^= ConsoleDriver.DiagnosticFlags.FrameRuler; Application.Top.Add (frame1); - Application.Top.Add (frame2); + //Application.Top.Add (frame2); - var view1 = new TextField () { - //Title = "View 1", + var view1 = new View () { + AutoSize = false, + Title = "view1", Text = "View1 30%/50% Single", X = 0, Y = 0, - Width = 14, //Dim.Percent (30) - 5, - Height = 14, //Dim.Percent (50) - 5, + Width = 30, //Dim.Percent (30) - 5, + Height = 10, //Dim.Percent (50) - 5, ColorScheme = Colors.ColorSchemes ["Dialog"], - Border = new Border () { - BorderStyle = BorderStyle.Single, + Border = new Border () { + BorderStyle = BorderStyle.Single, //BorderThickness = new Thickness (1), - DrawMarginFrame = true, - Padding = new Thickness(1), + //DrawMarginFrame = true, + //Padding = new Thickness (1), BorderBrush = Color.BrightMagenta, } }; @@ -73,18 +76,18 @@ namespace UICatalog.Scenarios { //var view12splitter = new SplitterEventArgs - //var view2 = new FrameView () { - // Title = "View 2", - // Text = "View2 right of view1, 30%/70% Single.", - // X = Pos.Right (view1) - 1, - // Y = -1, - // Width = Dim.Percent (30), - // Height = Dim.Percent (70), - // ColorScheme = Colors.ColorSchemes ["Error"], - // Border = new Border () { BorderStyle = BorderStyle.Single } - //}; + var view2 = new FrameView () { + Title = "view2", + Text = "View2 right of view1, 30%/70% Single.", + X = Pos.Right (view1) - 1, + Y = 0, + Width = Dim.Percent (30), + Height = Dim.Percent (70), + ColorScheme = Colors.ColorSchemes ["Error"], + Border = new Border () { BorderStyle = BorderStyle.Single } + }; - //frame.Add (view2); + frame1.Add (view2); //var view3 = new FrameView () { // Title = "View 3",