Explorar o código

new Frame stuff working

Tig Kindel %!s(int64=2) %!d(string=hai) anos
pai
achega
7c086522dd
Modificáronse 1 ficheiros con 24 adicións e 11 borrados
  1. 24 11
      Terminal.Gui/Core/View.cs

+ 24 - 11
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;
 
 		/// <summary>
@@ -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;
 			}