diff --git a/Terminal.Gui/Core/Container.cs b/Terminal.Gui/Core/Container.cs index f69e60ddb..aec05fa69 100644 --- a/Terminal.Gui/Core/Container.cs +++ b/Terminal.Gui/Core/Container.cs @@ -20,22 +20,16 @@ namespace Terminal.Gui { } foreach (var view in Subviews) { - if (!view.NeedDisplay.IsEmpty || view.ChildNeedsDisplay || view.LayoutNeeded) { - if (true) {//) && (view.Frame.IntersectsWith (boundsAdjustedForBorder) || boundsAdjustedForBorder.X < 0 || bounds.Y < 0)) { - if (view.LayoutNeeded) { - view.LayoutSubviews (); - } + // 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); - // 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); - view.Redraw (rect); - //view.OnDrawContentComplete (rect); - } - } 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; } } @@ -50,18 +44,12 @@ namespace Terminal.Gui { // Draw any Text if (TextFormatter != null) { TextFormatter.NeedsFormat = true; + Rect containerBounds = GetContainerBounds (); + TextFormatter?.Draw (ViewToScreen (viewport), HasFocus ? ColorScheme.Focus : GetNormalColor (), + HasFocus ? ColorScheme.HotFocus : Enabled ? ColorScheme.HotNormal : ColorScheme.Disabled, + containerBounds); } - Rect containerBounds = GetContainerBounds (); - TextFormatter?.Draw (ViewToScreen (viewport), HasFocus ? ColorScheme.Focus : GetNormalColor (), - HasFocus ? ColorScheme.HotFocus : Enabled ? ColorScheme.HotNormal : ColorScheme.Disabled, - containerBounds); } - //base.OnDrawContent (viewport); - } - - public override void OnDrawContentComplete (Rect viewport) - { - //base.OnDrawContentComplete (viewport); } public override void Redraw (Rect bounds) @@ -81,28 +69,34 @@ namespace Terminal.Gui { } + /// + /// A used for the rectangles that compose the outer frames of a . + /// public class Frame : Container { - public Label DiagnosticsLabel { get; set; } + //public Label DiagnosticsLabel { get; set; } + // TODO: v2 = This is teporary; need to also enable (or not) simple way of setting + // other border properties + // TOOD: v2 - Missing 3D effect public BorderStyle BorderStyle { get; set; } = BorderStyle.None; - public Frame () => IgnoreBorderPropertyOnRedraw = true; - public Thickness Thickness { get; set; } + // TODO: v2 - This is confusing. It is a read-only property and actually only returns a size, so + // should not be a Rect. However, it may make sense to keep it a Rect and support negative Location + // for scrolling. Still noodling this. + /// + /// Gets the rectangle that describes the inner area of the frame. The Location is always 0, 0. + /// public new Rect Bounds { get { if (Thickness != null) { new Rect (Point.Empty, Frame.Size); } - var frameRelativeBounds = Thickness.GetInnerRect (new Rect (Point.Empty, Frame.Size)); - return frameRelativeBounds; + // Return the frame-relative bounds + return Thickness.GetInnerRect (new Rect (Point.Empty, Frame.Size)); } set { throw new InvalidOperationException ("It makes no sense to explicitly set Bounds."); - //Frame = new Rect (Frame.Location, value.Size - // + new Size (Margin.Thickness.Right, Margin.Thickness.Bottom) - // + new Size (BorderFrame.Thickness.Right, BorderFrame.Thickness.Bottom) - // + new Size (BorderFrame.Thickness.Right, BorderFrame.Thickness.Bottom)); } } diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs index ba5a4347d..7efaa0c48 100644 --- a/Terminal.Gui/Core/View.cs +++ b/Terminal.Gui/Core/View.cs @@ -963,6 +963,8 @@ namespace Terminal.Gui { } } + // BUGBUG: v2 - this is poorly named. First, is this reallly just about Children or + // both subviews and children? And why "Display"? It should be "Redraw". internal bool ChildNeedsDisplay { get; set; } /// @@ -975,6 +977,7 @@ namespace Terminal.Gui { container.SetChildNeedsDisplay (); } + // BUGBUG: v2 - this feels like a hack internal bool addingView; /// @@ -1152,6 +1155,7 @@ namespace Terminal.Gui { }); } + // TODO: v2 - remove duplicate code here /// /// Clears the view region with the current color. ///