diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs index 9a0cabbb0..100415d97 100644 --- a/Terminal.Gui/Core/View.cs +++ b/Terminal.Gui/Core/View.cs @@ -550,6 +550,15 @@ 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; /// @@ -2271,6 +2280,8 @@ namespace Terminal.Gui { autosize = GetAutoSize (); } + bool hasFrame = SuperView?.Margin != null || SuperView?.BorderFrame != null || SuperView?.Padding != null; + actX = x?.Anchor (superviewRelativeBounds.Width) ?? 0; actW = Math.Max (CalculateActualWidth (width, superviewRelativeBounds, actX, autosize), 0); @@ -2283,28 +2294,28 @@ namespace Terminal.Gui { actW = !autosize.IsEmpty && autosize.Width > actW ? autosize.Width : actW; } actX = x.Anchor (superviewRelativeBounds.Width - actW); - if (Margin != null || BorderFrame != null || Padding != null) { + if (hasFrame) { actX += superviewRelativeBounds.X; } break; case Pos.PosAbsolute: - if (Margin != null || BorderFrame != null || Padding != null) { + if (hasFrame) { actX += superviewRelativeBounds.X; } break; case Pos.PosAnchorEnd: - if (Margin != null || BorderFrame != null || Padding != null) { + if (hasFrame) { actX += superviewRelativeBounds.X; } break; case Pos.PosCombine: - if (Margin != null || BorderFrame != null || Padding != null) { + if (hasFrame) { var pc = x as Pos.PosCombine; switch (pc.left) { case Pos.PosAbsolute: @@ -2330,7 +2341,7 @@ namespace Terminal.Gui { case Pos.PosFactor: - if (Margin != null || BorderFrame != null || Padding != null) { + if (hasFrame) { actX += superviewRelativeBounds.X;// - SuperView.Frame.X; } break; @@ -2358,13 +2369,13 @@ namespace Terminal.Gui { - if ((y is Pos.PosAbsolute || y is Pos.PosCenter) && (Margin != null || BorderFrame != null || Padding != null)) { + if ((y is Pos.PosAbsolute || y is Pos.PosCenter) && (hasFrame)) { actY += superviewRelativeBounds.Y; } - if ((y is Pos.PosAnchorEnd) && (Margin != null || BorderFrame != null || Padding != null)) { + if ((y is Pos.PosAnchorEnd) && (hasFrame)) { actY += superviewRelativeBounds.Y;// - SuperView.Frame.Y; } - if ((y is Pos.PosFactor) && (Margin != null || BorderFrame != null || Padding != null)) { + if ((y is Pos.PosFactor) && (hasFrame)) { actY += superviewRelativeBounds.Y;// - SuperView.Frame.Y; } @@ -2558,7 +2569,7 @@ namespace Terminal.Gui { } if (BorderFrame != null) { - var border = Margin?.Bounds ?? Bounds; + var border = Margin?.Thickness.GetInnerRect (Margin.Frame) ?? Frame; BorderFrame.X = border.Location.X; BorderFrame.Y = border.Location.Y; BorderFrame.Width = border.Size.Width; @@ -2569,7 +2580,7 @@ namespace Terminal.Gui { } if (Padding != null) { - var padding = BorderFrame?.Bounds ?? Margin?.Bounds ?? Bounds; + var padding = BorderFrame?.Thickness.GetInnerRect (BorderFrame.Frame) ?? Margin?.Thickness.GetInnerRect (Margin.Frame) ?? Frame; Padding.X = padding.Location.X; Padding.Y = padding.Location.Y; Padding.Width = padding.Size.Width; @@ -2649,7 +2660,9 @@ namespace Terminal.Gui { var ordered = TopologicalSort (nodes, edges); var bounds = Frame; - if ((Margin != null || BorderFrame != null || Padding != null)) { + bool hasFrame = Margin != null || BorderFrame != null || Padding != null; + + if (hasFrame) { // in v2 Bounds really is Frame-relative bounds = Bounds; }