فهرست منبع

Fixed little things.

Tig 1 سال پیش
والد
کامیت
e93eebb708

+ 9 - 2
Terminal.Gui/Text/TextFormatter.cs

@@ -648,14 +648,21 @@ public class TextFormatter
     /// <summary>Gets the size required to hold the formatted text, given the constraints placed by <see cref="Size"/>.</summary>
     /// <remarks>Causes a format, resetting <see cref="NeedsFormat"/> to <see langword="false"/>.</remarks>
     /// <returns>The size required to hold the formatted text.</returns>
-    public Size FormatAndGetSize ()
+    public Size FormatAndGetSize (Size? constrainSize = null)
     {
-        if (string.IsNullOrEmpty (Text) || Size.Height == 0 || Size.Width == 0)
+        if (constrainSize is null)
+        {
+            constrainSize = Size;
+        }
+        if (string.IsNullOrEmpty (Text) || constrainSize.Value.Height == 0 || constrainSize.Value.Width == 0)
         {
             return Size.Empty;
         }
 
+        Size prevSize = Size;
+        Size = constrainSize.Value;
         List<string> lines = GetLines ();
+        Size = prevSize;
 
         if (lines.Count == 0)
         {

+ 88 - 282
Terminal.Gui/View/Layout/DimAuto.cs

@@ -66,25 +66,30 @@ public class DimAuto () : Dim
         int screen = dimension == Dimension.Width ? Application.Screen.Width * 4 : Application.Screen.Height * 4;
         int autoMax = MaximumContentDim?.GetAnchor (superviewContentSize) ?? screen;
 
+        Debug.Assert (autoMin <= autoMax, "MinimumContentDim must be less than or equal to MaximumContentDim.");
+
         if (Style.FastHasFlags (DimAutoStyle.Text))
         {
             if (dimension == Dimension.Width)
             {
-                us.TextFormatter.Size = new (superviewContentSize, 2048);
+                //us.TextFormatter.Size = new (superviewContentSize, 2048);
                 textSize = us.TextFormatter.FormatAndGetSize ().Width;
-                us.TextFormatter.Size = new Size (textSize, 2048);
+                //us.TextFormatter.Size = new Size (textSize, 2048);
             }
             else
             {
-                if (us.TextFormatter.Size.Width == 0)
-                {
-                    us.TextFormatter.Size = us.TextFormatter.GetAutoSize ();
-                }
+                //if (us.TextFormatter.Size.Width == 0)
+                //{
+                //    us.TextFormatter.Size = us.TextFormatter.GetAutoSize ();
+                //}
                 textSize = us.TextFormatter.FormatAndGetSize ().Height;
-                us.TextFormatter.Size = us.TextFormatter.Size with { Height = textSize };
+                //us.TextFormatter.Size = us.TextFormatter.Size with { Height = textSize };
             }
         }
 
+        List<View> viewsNeedingLayout = new List<View> ();
+
+
         if (Style.FastHasFlags (DimAutoStyle.Content))
         {
             if (!us.ContentSizeTracksViewport)
@@ -105,14 +110,14 @@ public class DimAuto () : Dim
                 // -------------------- Pos types that are dependent on `us.Subviews`
                 // [ ] PosAlign     - Position is dependent on other views with `GroupId` AND `us.ContentSize`
                 // [x] PosView      - Position is dependent on `subview.Target` - it can cause a change in `us.ContentSize`
-                // [x] PosCombine   - Position is dependent if `Pos.Has ([one of the above]` - it can cause a change in `us.ContentSize`
+                // [x] PosCombine   - Position is dependent if `Pos.Has [one of the above]` - it can cause a change in `us.ContentSize`
 
                 // -------------------- Pos types that are dependent on `us.ContentSize`
                 // [ ] PosAlign     - Position is dependent on other views with `GroupId` AND `us.ContentSize`
                 // [x] PosAnchorEnd - Position is dependent on `us.ContentSize` AND `subview.Frame` - it can cause a change in `us.ContentSize`
-                // [ ] PosCenter    - Position is dependent `us.ContentSize` AND `subview.Frame`
-                // [ ] PosPercent   - Position is dependent `us.ContentSize`
-                // [x] PosCombine   - Position is dependent if `Pos.Has ([one of the above]` - it can cause a change in `us.ContentSize`
+                // [ ] PosCenter    - Position is dependent `us.ContentSize` AND `subview.Frame` - 
+                // [ ] PosPercent   - Position is dependent `us.ContentSize` - Will always be 0 if there is no other content that makes the superview have a size.
+                // [x] PosCombine   - Position is dependent if `Pos.Has [one of the above]` - it can cause a change in `us.ContentSize`
 
                 // -------------------- Pos types that are not dependent on either `us.Subviews` or `us.ContentSize`
                 // [ ] PosAbsolute  - Position is fixed.
@@ -120,12 +125,12 @@ public class DimAuto () : Dim
 
                 // -------------------- Dim types that are dependent on `us.Subviews`
                 // [x] DimView      - Dimension is dependent on `subview.Target`
-                // [x] DimCombine   - Dimension is dependent if `Dim.Has ([one of the above]` - it can cause a change in `us.ContentSize`
+                // [x] DimCombine   - Dimension is dependent if `Dim.Has [one of the above]` - it can cause a change in `us.ContentSize`
 
                 // -------------------- Dim types that are dependent on `us.ContentSize`
-                // [ ] DimFill      - Dimension is dependent on `us.ContentSize`
-                // [ ] DimPercent   - Dimension is dependent on `us.ContentSize`
-                // [ ] DimCombine   - Dimension is dependent if `Dim.Has ([one of the above]`
+                // [ ] DimFill      - Dimension is dependent on `us.ContentSize` - Will always be 0 if there is no other content that makes the superview have a size.
+                // [ ] DimPercent   - Dimension is dependent on `us.ContentSize` - Will always be 0 if there is no other content that makes the superview have a size.
+                // [ ] DimCombine   - Dimension is dependent if `Dim.Has [one of the above]`
 
                 // -------------------- Dim types that are not dependent on either `us.Subviews` or `us.ContentSize`
                 // [ ] DimAuto      - Dimension is internally calculated
@@ -143,23 +148,29 @@ public class DimAuto () : Dim
                 List<View> notDependentSubViews;
                 if (dimension == Dimension.Width)
                 {
-                    notDependentSubViews = includedSubviews.Where (v => v.Width is { } &&
-                                                                        (v.X is PosAbsolute or PosFunc || v.Width is DimAuto or DimAbsolute or DimFunc) &&
-                                                                        !v.X.Has (typeof (PosAnchorEnd), out _) &&
-                                                                        !v.X.Has (typeof (PosAlign), out _) &&
-                                                                        !v.X.Has (typeof (PosView), out _) &&
-                                                                        !v.Width.Has (typeof (DimView), out _) &&
-                                                                        !v.X.Has (typeof (PosCenter), out _)).ToList ();
+                    notDependentSubViews = includedSubviews.Where (v => v.Width is { }
+                                                                        && (v.X is PosAbsolute or PosFunc || v.Width is DimAuto or DimAbsolute or DimFunc)
+                                                                        && !v.X.Has (typeof (PosAnchorEnd), out _)
+                                                                        && !v.X.Has (typeof (PosAlign), out _)
+                                                                        && !v.X.Has (typeof (PosView), out _)
+                                                                        && !v.X.Has (typeof (PosCenter), out _)
+                                                                        && !v.Width.Has (typeof (DimView), out _)
+                                                                        && !v.Width.Has (typeof (DimFill), out _)
+                                                                        && !v.Width.Has (typeof (DimPercent), out _)
+                                                                        ).ToList ();
                 }
                 else
                 {
-                    notDependentSubViews = includedSubviews.Where (v => v.Height is { } &&
-                                                                        (v.Y is PosAbsolute or PosFunc || v.Height is DimAuto or DimAbsolute or DimFunc) &&
-                                                                        !v.Y.Has (typeof (PosAnchorEnd), out _) &&
-                                                                        !v.Y.Has (typeof (PosAlign), out _) &&
-                                                                        !v.Y.Has (typeof (PosView), out _) &&
-                                                                        !v.Height.Has (typeof (DimView), out _) &&
-                                                                        !v.Y.Has (typeof (PosCenter), out _)).ToList ();
+                    notDependentSubViews = includedSubviews.Where (v => v.Height is { }
+                                                                        && (v.Y is PosAbsolute or PosFunc || v.Height is DimAuto or DimAbsolute or DimFunc)
+                                                                        && !v.Y.Has (typeof (PosAnchorEnd), out _)
+                                                                        && !v.Y.Has (typeof (PosAlign), out _)
+                                                                        && !v.Y.Has (typeof (PosView), out _)
+                                                                        && !v.Y.Has (typeof (PosCenter), out _)
+                                                                        && !v.Height.Has (typeof (DimView), out _)
+                                                                        && !v.Height.Has (typeof (DimFill), out _)
+                                                                        && !v.Height.Has (typeof (DimPercent), out _)
+                                                                        ).ToList ();
                 }
 
                 for (var i = 0; i < notDependentSubViews.Count; i++)
@@ -170,12 +181,12 @@ public class DimAuto () : Dim
 
                     if (dimension == Dimension.Width)
                     {
-                        int width = v.Width!.Calculate (0, 0, v, dimension);
+                        int width = v.Width!.Calculate (0, superviewContentSize, v, dimension);
                         size = v.X.GetAnchor (0) + width;
                     }
                     else
                     {
-                        int height = v.Height!.Calculate (0, 0, v, dimension);
+                        int height = v.Height!.Calculate (0, superviewContentSize, v, dimension);
                         size = v.Y.GetAnchor (0) + height;
                     }
 
@@ -199,6 +210,8 @@ public class DimAuto () : Dim
                     centeredSubViews = us.Subviews.Where (v => v.Y.Has (typeof (PosCenter), out _)).ToList ();
                 }
 
+                viewsNeedingLayout.AddRange (centeredSubViews);
+
                 int maxCentered = 0;
 
                 for (var i = 0; i < centeredSubViews.Count; i++)
@@ -207,48 +220,51 @@ public class DimAuto () : Dim
 
                     if (dimension == Dimension.Width)
                     {
-                        int width = v.Width!.Calculate (0, 0, v, dimension);
-                        maxCentered = (v.X.GetAnchor (0) + width) * 2;
+                        int width = v.Width!.Calculate (0, screen, v, dimension);
+                        maxCentered = (v.X.GetAnchor (0) + width);
                     }
                     else
                     {
-                        int height = v.Height!.Calculate (0, 0, v, dimension);
-                        maxCentered = (v.Y.GetAnchor (0) + height) * 2;
+                        int height = v.Height!.Calculate (0, screen, v, dimension);
+                        maxCentered = (v.Y.GetAnchor (0) + height);
                     }
                 }
                 maxCalculatedSize = int.Max (maxCalculatedSize, maxCentered);
                 #endregion Centered
 
                 #region Percent
-                // [ ] DimPercent   - Dimension is dependent on `us.ContentSize`
-                List<View> percentSubViews;
-                if (dimension == Dimension.Width)
-                {
-                    percentSubViews = us.Subviews.Where (v => v.Width.Has (typeof (DimPercent), out _)).ToList ();
-                }
-                else
-                {
-                    percentSubViews = us.Subviews.Where (v => v.Height.Has (typeof (DimPercent), out _)).ToList ();
-                }
-
-                int maxPercent = 0;
-
-                for (var i = 0; i < percentSubViews.Count; i++)
-                {
-                    View v = percentSubViews [i];
-
-                    if (dimension == Dimension.Width)
-                    {
-                        int width = v.Width!.Calculate (0, 0, v, dimension);
-                        maxPercent = (v.X.GetAnchor (0) + width);
-                    }
-                    else
-                    {
-                        int height = v.Height!.Calculate (0, 0, v, dimension);
-                        maxPercent = (v.Y.GetAnchor (0) + height);
-                    }
-                }
-                maxCalculatedSize = int.Max (maxCalculatedSize, maxPercent);
+                //// [ ] DimPercent   - Dimension is dependent on `us.ContentSize`
+                ////     - DimPercent will always be 0 if there is no other content that makes the superview have a size.
+                //List<View> dimPercentSubViews;
+                //if (dimension == Dimension.Width)
+                //{
+                //    dimPercentSubViews = us.Subviews.Where (v => v.Width.Has (typeof (DimPercent), out _)).ToList ();
+                //}
+                //else
+                //{
+                //    dimPercentSubViews = us.Subviews.Where (v => v.Height.Has (typeof (DimPercent), out _)).ToList ();
+                //}
+
+                //viewsNeedingLayout.AddRange (dimPercentSubViews);
+
+                //int maxDimPercent = 0;
+
+                //for (var i = 0; i < dimPercentSubViews.Count; i++)
+                //{
+                //    View v = dimPercentSubViews [i];
+
+                //    if (dimension == Dimension.Width)
+                //    {
+                //        int width = v.Width!.Calculate (0, superviewContentSize, null, dimension);
+                //        maxDimPercent = (v.X.GetAnchor (0) + width);
+                //    }
+                //    else
+                //    {
+                //        int height = v.Height!.Calculate (0, superviewContentSize, null, dimension);
+                //        maxDimPercent = (v.Y.GetAnchor (0) + height);
+                //    }
+                //}
+                //maxCalculatedSize = int.Max (maxCalculatedSize, maxDimPercent);
                 #endregion Percent
 
 
@@ -317,6 +333,8 @@ public class DimAuto () : Dim
                     anchoredSubViews = includedSubviews.Where (v => v.Y.Has (typeof (PosAnchorEnd), out _)).ToList ();
                 }
 
+                viewsNeedingLayout.AddRange (anchoredSubViews);
+
                 int maxAnchorEnd = 0;
                 for (var i = 0; i < anchoredSubViews.Count; i++)
                 {
@@ -325,13 +343,13 @@ public class DimAuto () : Dim
                     // Need to set the relative layout for PosAnchorEnd subviews to calculate the size
                     if (dimension == Dimension.Width)
                     {
-                        v.SetRelativeLayout (new Size (maxCalculatedSize, 0));
+                        v.SetRelativeLayout (new Size (maxCalculatedSize, screen));
                     }
                     else
                     {
-                        v.SetRelativeLayout (new Size (0, maxCalculatedSize));
+                        v.SetRelativeLayout (new Size (screen, maxCalculatedSize));
                     }
-                    maxAnchorEnd = dimension == Dimension.Width ? v.X.GetAnchor (maxCalculatedSize) + v.Frame.Width : v.Y.GetAnchor (maxCalculatedSize) + v.Frame.Height;
+                    maxAnchorEnd = dimension == Dimension.Width ? v.X.GetAnchor (maxCalculatedSize + v.Frame.Width) : v.Y.GetAnchor (maxCalculatedSize + v.Frame.Height);
                 }
 
                 maxCalculatedSize = Math.Max (maxCalculatedSize, maxAnchorEnd);
@@ -407,218 +425,6 @@ public class DimAuto () : Dim
                     }
                 }
                 #endregion DimView
-
-
-                // [x] DimCombine   - Dimension is dependent if `Dim.Has ([one of the above]` - it can cause a change in `us.ContentSize`
-
-
-
-
-
-
-
-                //        // ======================================================
-                //        // Now do PosAlign - It's dependent on other views with `GroupId` AND `us.ContentSize`
-                //        // ======================================================
-                //        // [ ] PosAlign     - Position is dependent on other views with `GroupId` AND `us.ContentSize`
-                //        #region Aligned
-
-                //        int maxAlign = 0;
-                //        if (dimension == Dimension.Width)
-                //        {
-                //            // Use Linq to get a list of distinct GroupIds from the subviews
-                //            List<int> groupIds = includedSubviews.Select (v => v.X is PosAlign posAlign ? posAlign.GroupId : -1).Distinct ().ToList ();
-
-                //            foreach (var groupId in groupIds)
-                //            {
-                //                List<int> dimensionsList = new ();
-
-                //                // PERF: If this proves a perf issue, consider caching a ref to this list in each item
-                //                List<PosAlign?> posAlignsInGroup = includedSubviews.Where (
-                //                    v =>
-                //                    {
-                //                        return dimension switch
-                //                        {
-                //                            Dimension.Width when v.X is PosAlign alignX => alignX.GroupId == groupId,
-                //                            Dimension.Height when v.Y is PosAlign alignY => alignY.GroupId == groupId,
-                //                            _ => false
-                //                        };
-                //                    })
-                //                    .Select (v => dimension == Dimension.Width ? v.X as PosAlign : v.Y as PosAlign)
-                //                    .ToList ();
-
-                //                if (posAlignsInGroup.Count == 0)
-                //                {
-                //                    continue;
-                //                }
-                //                // BUGBUG: ignores adornments
-
-                //                maxAlign = PosAlign.CalculateMinDimension (groupId, includedSubviews, dimension);
-                //            }
-                //        }
-                //        else
-                //        {
-
-                //            // BUGBUG: Incompletge
-                //            subviews = includedSubviews.Where (v => v.Y is PosAlign).ToList ();
-                //        }
-
-                //        maxCalculatedSize = int.Max (maxCalculatedSize, maxAlign);
-                //        #endregion Aligned
-
-                //        // TODO: This whole body of code is a WIP (forhttps://github.com/gui-cs/Terminal.Gui/issues/3499).
-
-
-                //        List<View> subviews;
-
-                //        #region Not Anchored and Are Not Dependent
-                //        // Start with subviews that are not anchored to the end, aligned, or dependent on content size
-                //        // [x] PosAnchorEnd
-                //        // [x] PosAlign
-                //        // [ ] PosCenter
-                //        // [ ] PosPercent
-                //        // [ ] PosView
-                //        // [ ] PosFunc
-                //        // [x] DimFill
-                //        // [ ] DimPercent
-                //        // [ ] DimFunc
-                //        // [ ] DimView
-                //        if (dimension == Dimension.Width)
-                //        {
-                //            subviews = includedSubviews.Where (v => v.X is not PosAnchorEnd
-                //                                                   && v.X is not PosAlign
-                //                                                    // && v.X is not PosCenter
-                //                                                    && v.Width is not DimAuto
-                //                                                   && v.Width is not DimFill).ToList ();
-                //        }
-                //        else
-                //        {
-                //            subviews = includedSubviews.Where (v => v.Y is not PosAnchorEnd
-                //                                                   && v.Y is not PosAlign
-                //                                                    // && v.Y is not PosCenter
-                //                                                    && v.Height is not DimAuto
-                //                                                   && v.Height is not DimFill).ToList ();
-                //        }
-
-                //        for (var i = 0; i < subviews.Count; i++)
-                //        {
-                //            View v = subviews [i];
-
-                //            int size = dimension == Dimension.Width ? v.Frame.X + v.Frame.Width : v.Frame.Y + v.Frame.Height;
-
-                //            if (size > maxCalculatedSize)
-                //            {
-                //                // BUGBUG: Should we break here? Or choose min/max?
-                //                maxCalculatedSize = size;
-                //            }
-                //        }
-                //        #endregion Not Anchored and Are Not Dependent
-
-
-
-                //        #region Auto
-
-
-
-                //        #endregion Auto
-
-                //        //#region Center
-                //        //// Now, handle subviews that are Centered
-                //        //if (dimension == Dimension.Width)
-                //        //{
-                //        //    subviews = us.Subviews.Where (v => v.X is PosCenter).ToList ();
-                //        //}
-                //        //else
-                //        //{
-                //        //    subviews = us.Subviews.Where (v => v.Y is PosCenter).ToList ();
-                //        //}
-
-                //        //int maxCenter = 0;
-                //        //for (var i = 0; i < subviews.Count; i++)
-                //        //{
-                //        //    View v = subviews [i];
-                //        //    maxCenter = dimension == Dimension.Width ? v.Frame.Width : v.Frame.Height;
-                //        //}
-
-                //        //subviewsSize += maxCenter;
-                //        //#endregion Center
-
-                //        #region Are Dependent
-                //        // Now, go back to those that are dependent on content size
-
-
-                //        // Set relative layout for all DimAuto subviews
-                //        List<View> dimAutoSubViews;
-                //        int maxAuto = 0;
-                //        if (dimension == Dimension.Width)
-                //        {
-                //            dimAutoSubViews = includedSubviews.Where (v => v.Width is DimAuto).ToList ();
-                //        }
-                //        else
-                //        {
-                //            dimAutoSubViews = includedSubviews.Where (v => v.Height is DimAuto).ToList ();
-                //        }
-                //        for (var i = 0; i < dimAutoSubViews.Count; i++)
-                //        {
-                //            View v = dimAutoSubViews [i];
-
-                //            if (dimension == Dimension.Width)
-                //            {
-                //                // BUGBUG: ignores adornments
-
-                //                v.SetRelativeLayout (new Size (autoMax - maxCalculatedSize, 0));
-                //            }
-                //            else
-                //            {
-                //                // BUGBUG: ignores adornments
-
-                //                v.SetRelativeLayout (new Size (0, autoMax - maxCalculatedSize));
-                //            }
-
-                //            maxAuto = dimension == Dimension.Width ? v.Frame.X + v.Frame.Width : v.Frame.Y + v.Frame.Height;
-
-                //            if (maxAuto > maxCalculatedSize)
-                //            {
-                //                // BUGBUG: Should we break here? Or choose min/max?
-                //                maxCalculatedSize = maxAuto;
-                //            }
-                //        }
-
-                //        // [x] DimFill
-                //        // [ ] DimPercent
-                //        if (dimension == Dimension.Width)
-                //        {
-                //            subviews = includedSubviews.Where (v => v.Width is DimFill).ToList ();
-                //        }
-                //        else
-                //        {
-                //            subviews = includedSubviews.Where (v => v.Height is DimFill).ToList ();
-                //        }
-
-                //        int maxFill = 0;
-                //        for (var i = 0; i < subviews.Count; i++)
-                //        {
-                //            View v = subviews [i];
-
-                //            if (autoMax == int.MaxValue)
-                //            {
-                //                autoMax = superviewContentSize;
-                //            }
-                //            if (dimension == Dimension.Width)
-                //            {
-                //                // BUGBUG: ignores adornments
-                //                v.SetRelativeLayout (new Size (autoMax - maxCalculatedSize, 0));
-                //            }
-                //            else
-                //            {
-                //                // BUGBUG: ignores adornments
-                //                v.SetRelativeLayout (new Size (0, autoMax - maxCalculatedSize));
-                //            }
-                //            maxFill = dimension == Dimension.Width ? v.Frame.Width : v.Frame.Height;
-                //        }
-
-                //        maxCalculatedSize += maxFill;
-                //        #endregion Are Dependent
             }
         }
 
@@ -632,11 +438,11 @@ public class DimAuto () : Dim
         // And, if max: is set, it wins if smaller
         max = int.Min (max, autoMax);
 
-
         // ************** We now definitively know `us.ContentSize` ***************
 
-        int oppositeScreen = dimension == Dimension.Width ? Application.Screen.Height * 4 : Application.Screen.Width * 4 ;
-        foreach (var v in us.Subviews)
+        int oppositeScreen = dimension == Dimension.Width ? Application.Screen.Height * 4 : Application.Screen.Width * 4;
+
+        foreach (var v in viewsNeedingLayout)
         {
             if (dimension == Dimension.Width)
             {

+ 2 - 3
Terminal.Gui/View/Layout/ViewLayout.cs

@@ -573,6 +573,8 @@ public partial class View
         Debug.Assert (_height is { });
 
         CheckDimAuto ();
+        SetTextFormatterSize ();
+
         int newX, newW, newY, newH;
 
         // Calculate the new X, Y, Width, and Height
@@ -630,7 +632,6 @@ public partial class View
             {
                 SetTitleTextFormatterSize ();
             }
-
             SetNeedsLayout ();
             SetNeedsDisplay ();
         }
@@ -742,8 +743,6 @@ public partial class View
                            Application.Top is { } && Application.Top != this && Application.Top.IsInitialized ? Application.Top.GetContentSize () :
                            Application.Screen.Size;
 
-        SetTextFormatterSize ();
-
         SetRelativeLayout (superViewContentSize);
 
         if (IsInitialized)

+ 24 - 4
Terminal.Gui/View/ViewText.cs

@@ -187,18 +187,38 @@ public partial class View
         if ((widthAuto is { } && widthAuto.Style.FastHasFlags (DimAutoStyle.Text))
             || (heightAuto is { } && heightAuto.Style.FastHasFlags (DimAutoStyle.Text)))
         {
-            // BUGBUG: This ignores wordwrap and other formatting options.
-            size = TextFormatter.GetAutoSize ();
+            int width = 0;
+            int height = 0;
 
             if (widthAuto is null || !widthAuto.Style.FastHasFlags (DimAutoStyle.Text))
             {
-                size.Width = GetContentSize ().Width;
+                width = GetContentSize ().Width;
             }
 
             if (heightAuto is null || !heightAuto.Style.FastHasFlags (DimAutoStyle.Text))
             {
-                size.Height = GetContentSize ().Height;
+                height = GetContentSize ().Height;
             }
+
+            if (widthAuto is { } && widthAuto.Style.FastHasFlags (DimAutoStyle.Text))
+            {
+                if (height == 0 && heightAuto is { } && heightAuto.Style.FastHasFlags (DimAutoStyle.Text))
+                {
+                    height = Application.Screen.Height;
+                }
+                width = TextFormatter.FormatAndGetSize (new (Application.Screen.Width, height)).Width;
+            }
+
+            if (heightAuto is { } && heightAuto.Style.FastHasFlags (DimAutoStyle.Text))
+            {
+                if (width == 0 && widthAuto is { } && widthAuto.Style.FastHasFlags (DimAutoStyle.Text))
+                {
+                    width = Application.Screen.Height;
+                }
+                height = TextFormatter.FormatAndGetSize (new (width, Application.Screen.Height)).Height;
+            }
+
+            size = new (width, height);
         }
 
         TextFormatter.Size = size;

+ 2 - 2
Terminal.Gui/Views/Dialog.cs

@@ -33,14 +33,14 @@ public class Dialog : Window
     ///     <see cref="ConfigurationManager"/>.
     /// </summary>
     [SerializableConfigurationProperty (Scope = typeof (ThemeScope))]
-    public static int DefaultMinimumWidth { get; set; } = 0;
+    public static int DefaultMinimumWidth { get; set; } = 80;
 
     /// <summary>
     ///     Defines the default minimum Dialog height, as a percentage of the container width. Can be configured via
     ///     <see cref="ConfigurationManager"/>.
     /// </summary>
     [SerializableConfigurationProperty (Scope = typeof (ThemeScope))]
-    public static int DefaultMinimumHeight { get; set; } = 0;
+    public static int DefaultMinimumHeight { get; set; } = 80;
 
 
     /// <summary>

+ 2 - 2
Terminal.Gui/Views/Shortcut.cs

@@ -484,7 +484,7 @@ public override string Text
     get => HelpView?.Text;
     set
     {
-        if (HelpView != null)
+        if (HelpView is {})
         {
             HelpView.Text = value;
             ShowHide ();
@@ -500,7 +500,7 @@ public string HelpText
     get => HelpView?.Text;
     set
     {
-        if (HelpView != null)
+        if (HelpView is {})
         {
             HelpView.Text = value;
             ShowHide ();

+ 14 - 6
UICatalog/Scenarios/Dialogs.cs

@@ -79,7 +79,12 @@ public class Dialogs : Scenario
         frame.Add (heightEdit);
 
         frame.Add (
-                   new Label { X = Pos.Right (widthEdit) + 2, Y = Pos.Top (widthEdit), Text = "If height & width are both 0," }
+                   new Label
+                   {
+                       X = Pos.Right (widthEdit) + 2,
+                       Y = Pos.Top (widthEdit),
+                       Text = $"If width is 0, the dimension will be {Dialog.DefaultMinimumWidth}%."
+                   }
                   );
 
         frame.Add (
@@ -87,7 +92,7 @@ public class Dialogs : Scenario
                    {
                        X = Pos.Right (heightEdit) + 2,
                        Y = Pos.Top (heightEdit),
-                       Text = "the Dialog will size to 80% of container."
+                       Text = $"If height is 0, the dimension will be {Dialog.DefaultMinimumWidth}%."
                    }
                   );
 
@@ -263,16 +268,19 @@ public class Dialogs : Scenario
                 Buttons = buttons.ToArray ()
             };
 
-            if (height != 0 || width != 0)
+            if (width != 0)
             {
-                dialog.Height = height;
                 dialog.Width = width;
             }
+            if (height != 0)
+            {
+                dialog.Height = height;
+            }
 
             var add = new Button
             {
                 X = Pos.Center (),
-                Y = Pos.Center (),
+                Y = Pos.Center () - 1,
                 Text = "_Add a button"
             };
 
@@ -312,7 +320,7 @@ public class Dialogs : Scenario
             var addChar = new Button
             {
                 X = Pos.Center (),
-                Y = Pos.Center () + 2,
+                Y = Pos.Center () + 1,
                 Text = $"A_dd a {char.ConvertFromUtf32 (CODE_POINT)} to each button. This text is really long for a reason."
             };
 

+ 62 - 0
UnitTests/Text/TextFormatterTests.cs

@@ -6047,6 +6047,68 @@ B")]
         TestHelpers.AssertDriverContentsWithFrameAre (expectedText, _output);
     }
 
+
+    // Test that changing TextFormatter does not impact View dimensions if Dim.Auto is not in play
+    [Fact]
+    public void Not_Used_TextFormatter_Does_Not_Change_View_Size ()
+    {
+        View view = new ()
+        {
+            Text = "_1234"
+        };
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+
+        view.TextFormatter.Text = "ABC";
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+
+        view.TextFormatter.Alignment = Alignment.Fill;
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+
+        view.TextFormatter.VerticalAlignment = Alignment.Center;
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+
+        view.TextFormatter.HotKeySpecifier = (Rune)'*';
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+
+        view.TextFormatter.Text = "*ABC";
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+    }
+
+
+    [Fact]
+    public void Not_Used_TextSettings_Do_Not_Change_View_Size ()
+    {
+        View view = new ()
+        {
+            Text = "_1234"
+        };
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+
+        view.TextAlignment = Alignment.Fill;
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+
+        view.VerticalTextAlignment = Alignment.Center;
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+
+        view.HotKeySpecifier = (Rune)'*';
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+
+        view.Text = "*ABC";
+        Assert.False (view.TextFormatter.AutoSize);
+        Assert.Equal (Size.Empty, view.Frame.Size);
+    }
+
+
     #region FormatAndGetSizeTests
 
     // TODO: Add multi-line examples

+ 162 - 166
UnitTests/View/Layout/Dim.AutoTests.cs

@@ -592,51 +592,6 @@ public class DimAutoTests (ITestOutputHelper output)
         Assert.Equal (expectedWidth, superView.Frame.Width);
     }
 
-    //// Test Dim.Fill - Fill should not impact width of the DimAuto superview
-    //[Theory]
-    //[InlineData (0, 0, 0, 10, 10)]
-    //[InlineData (0, 1, 0, 10, 10)]
-    //[InlineData (0, 11, 0, 10, 10)]
-    //[InlineData (0, 10, 0, 10, 10)]
-    //[InlineData (0, 5, 0, 10, 10)]
-    //[InlineData (1, 5, 0, 10, 9)]
-    //[InlineData (1, 10, 0, 10, 9)]
-    //[InlineData (0, 0, 1, 10, 9)]
-    //[InlineData (0, 10, 1, 10, 9)]
-    //[InlineData (0, 5, 1, 10, 9)]
-    //[InlineData (1, 5, 1, 10, 8)]
-    //[InlineData (1, 10, 1, 10, 8)]
-    //public void Width_Fill_Fills (int subX, int superMinWidth, int fill, int expectedSuperWidth, int expectedSubWidth)
-    //{
-    //    var superView = new View
-    //    {
-    //        X = 0,
-    //        Y = 0,
-    //        Width = Dim.Auto (minimumContentDim: superMinWidth),
-    //        Height = 1,
-    //        ValidatePosDim = true
-    //    };
-
-    //    var subView = new View
-    //    {
-    //        X = subX,
-    //        Y = 0,
-    //        Width = Dim.Fill (fill),
-    //        Height = 1,
-    //        ValidatePosDim = true
-    //    };
-
-    //    superView.Add (subView);
-
-    //    superView.BeginInit ();
-    //    superView.EndInit ();
-    //    superView.SetRelativeLayout (new (10, 1));
-    //    Assert.Equal (expectedSuperWidth, superView.Frame.Width);
-    //    superView.LayoutSubviews ();
-    //    Assert.Equal (expectedSubWidth, subView.Frame.Width);
-    //    Assert.Equal (expectedSuperWidth, superView.Frame.Width);
-    //}
-
     [Theory]
     [InlineData (0, 1, 1)]
     [InlineData (1, 1, 1)]
@@ -726,6 +681,40 @@ public class DimAutoTests (ITestOutputHelper output)
         Assert.Equal (expectedSubWidth, subView.Frame.Width);
     }
 
+    #region DimAutoStyle.Auto tests
+
+    [Fact]
+    public void DimAutoStyle_Auto_Text_Size_Is_Used ()
+    {
+        var view = new View ()
+        {
+            Text = "0123\n4567",
+            Width = Auto (),
+            Height = Auto (),
+        };
+
+        view.SetRelativeLayout (new Size (100, 100));
+        Assert.Equal (new (4, 2), view.Frame.Size);
+
+        var subView = new View ()
+        {
+            Text = "ABCD",
+            Width = Auto (),
+            Height = Auto (),
+        };
+        view.Add (subView);
+
+        view.SetRelativeLayout (new Size (100, 100));
+        Assert.Equal (new (4, 2), view.Frame.Size);
+
+        subView.Text = "ABCDE";
+
+        view.SetRelativeLayout (new Size (100, 100));
+        Assert.Equal (new (5, 2), view.Frame.Size);
+    }
+
+    #endregion
+
     [Fact]
     public void DimAutoStyle_Text_Viewport_Stays_Set ()
     {
@@ -755,84 +744,21 @@ public class DimAutoTests (ITestOutputHelper output)
         super.Dispose ();
     }
 
-
-    // TextFormatter.Size normally tracks ContentSize, but with DimAuto, tracks the text size
     [Theory]
     [InlineData ("", 0, 0)]
     [InlineData (" ", 1, 1)]
     [InlineData ("01234", 5, 1)]
-    public void DimAutoStyle_Text_TextFormatter_Size_Ignores_ContentSize (string text, int expectedW, int expectedH)
+    public void DimAutoStyle_Text_Ignores_ContentSize (string text, int expectedW, int expectedH)
     {
         var view = new View ();
         view.Width = Auto (DimAutoStyle.Text);
         view.Height = Auto (DimAutoStyle.Text);
         view.SetContentSize (new (1, 1));
         view.Text = text;
-        Assert.Equal (new (expectedW, expectedH), view.TextFormatter.Size);
-    }
-
-
-    // Test that changing TextFormatter does not impact View dimensions if Dim.Auto is not in play
-    [Fact]
-    public void Not_Used_TextFormatter_Does_Not_Change_View_Size ()
-    {
-        View view = new ()
-        {
-            Text = "_1234"
-        };
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-
-        view.TextFormatter.Text = "ABC";
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-
-        view.TextFormatter.Alignment = Alignment.Fill;
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-
-        view.TextFormatter.VerticalAlignment = Alignment.Center;
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-
-        view.TextFormatter.HotKeySpecifier = (Rune)'*';
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-
-        view.TextFormatter.Text = "*ABC";
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
+        view.SetRelativeLayout(Application.Screen.Size);
+        Assert.Equal (new (expectedW, expectedH), view.Frame.Size);
     }
 
-
-    [Fact]
-    public void Not_Used_TextSettings_Do_Not_Change_View_Size ()
-    {
-        View view = new ()
-        {
-            Text = "_1234"
-        };
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-
-        view.TextAlignment = Alignment.Fill;
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-
-        view.VerticalTextAlignment = Alignment.Center;
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-
-        view.HotKeySpecifier = (Rune)'*';
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-
-        view.Text = "*ABC";
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.Equal (Size.Empty, view.Frame.Size);
-    }
-
-
     [Fact]
     public void TextFormatter_Settings_Change_View_Size ()
     {
@@ -841,39 +767,50 @@ public class DimAutoTests (ITestOutputHelper output)
             Text = "_1234",
             Width = Dim.Auto ()
         };
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.NotEqual (Size.Empty, view.Frame.Size);
+        Assert.Equal (Size.Empty, view.Frame.Size); // Height is 0, so width is 0 regardless of text
+
+        view.Height = 1;
+        view.SetRelativeLayout (Application.Screen.Size);
+        Assert.Equal (new Size (4, 1), view.Frame.Size);
+        Size lastSize = view.Frame.Size;
 
         view.TextAlignment = Alignment.Fill;
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.NotEqual (Size.Empty, view.Frame.Size);
+        Assert.Equal (lastSize, view.Frame.Size);
 
         view = new ()
         {
             Text = "_1234",
-            Width = Dim.Auto ()
+            Width = Dim.Auto (),
+            Height = 1
         };
+        view.SetRelativeLayout (Application.Screen.Size);
+
+        lastSize = view.Frame.Size;
         view.VerticalTextAlignment = Alignment.Center;
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.NotEqual (Size.Empty, view.Frame.Size);
+        Assert.Equal (lastSize, view.Frame.Size);
 
         view = new ()
         {
             Text = "_1234",
-            Width = Dim.Auto ()
+            Width = Dim.Auto (),
+            Height = 1,
         };
+        view.SetRelativeLayout (Application.Screen.Size);
+        lastSize = view.Frame.Size;
         view.HotKeySpecifier = (Rune)'*';
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.NotEqual (Size.Empty, view.Frame.Size);
+        view.SetRelativeLayout (Application.Screen.Size);
+        Assert.NotEqual (lastSize, view.Frame.Size);
 
         view = new ()
         {
             Text = "_1234",
-            Width = Dim.Auto ()
+            Width = Dim.Auto (),
+            Height = 1
         };
-        view.Text = "*ABC";
-        Assert.False (view.TextFormatter.AutoSize);
-        Assert.NotEqual (Size.Empty, view.Frame.Size);
+        view.SetRelativeLayout (Application.Screen.Size);
+        lastSize = view.Frame.Size;
+        view.Text = "*ABCD";
+        Assert.NotEqual (lastSize, view.Frame.Size);
     }
 
     // Ensure TextFormatter.AutoSize is never used for View.Text
@@ -930,7 +867,6 @@ public class DimAutoTests (ITestOutputHelper output)
         Assert.Equal (new (1, expected), view.TextFormatter.Size);
     }
 
-
     [SetupFakeDriver]
     [Fact]
     public void Change_To_Non_Auto_Resets_ContentSize ()
@@ -1042,15 +978,16 @@ public class DimAutoTests (ITestOutputHelper output)
     }
 
     [Theory]
-    [InlineData (0, 50, 50)]
-    [InlineData (1, 50, 51)]
-    [InlineData (0, 25, 25)]
-    [InlineData (-1, 50, 49)]
-    public void With_Subview_Using_DimPercent (int subViewOffset, int percent, int expectedSize)
+    [InlineData (0, 0, 0, 0, 0, 0, 0, 0)]
+    [InlineData (0, 50, 0, 0, 0, 0, 0, 0)]
+    [InlineData (0, 0, 100, 100, 100, 100, 100, 100)]
+    [InlineData (0, 50, 100, 100, 100, 100, 100, 100)]
+    public void With_Subview_Using_DimPercent (int subViewOffset, int percent, int minWidth, int maxWidth, int minHeight, int maxHeight, int expectedWidth, int expectedHeight)
     {
         var view = new View ()
         {
-            Width = 100, Height = 100
+            Width = Dim.Auto (minimumContentDim: minWidth, maximumContentDim: maxWidth),
+            Height = Dim.Auto (minimumContentDim: minHeight, maximumContentDim: maxHeight)
         };
         var subview = new View ()
         {
@@ -1061,48 +998,105 @@ public class DimAutoTests (ITestOutputHelper output)
         };
         view.Add (subview);
 
-        view.BeginInit ();
-        view.EndInit ();
+        // Assuming the calculation is done after layout
+        int calculatedX = view.X.Calculate (100, view.Width, view, Dimension.Width);
+        int calculatedY = view.Y.Calculate (100, view.Height, view, Dimension.Height);
+        int calculatedWidth = view.Width.Calculate (0, 100, view, Dimension.Width);
+        int calculatedHeight = view.Height.Calculate (0, 100, view, Dimension.Height);
+
+        Assert.Equal (expectedWidth, calculatedWidth); // subview's width
+        Assert.Equal (expectedHeight, calculatedHeight); // subview's height
+        Assert.Equal (subViewOffset, calculatedX);
+        Assert.Equal (subViewOffset, calculatedY);
+
+        view.SetRelativeLayout (new (100, 100));
+        view.LayoutSubviews ();
+
+        Assert.Equal (expectedWidth * (percent / 100f), subview.Viewport.Width);
+        Assert.Equal (expectedHeight * (percent / 100f), subview.Viewport.Height);
+    }
+
+    [Theory]
+    [InlineData (0, 0, 0, 0, 0, 0)]
+    [InlineData (0, 19, 0, 9, 0, 0)]
+    [InlineData (0, 20, 0, 10, 0, 0)]
+    [InlineData (0, 21, 0, 11, 0, 0)]
+    [InlineData (1, 21, 1, 11, 1, 1)]
+    [InlineData (21, 21, 11, 11, 21, 11)]
+    public void With_Subview_Using_DimFill (int minWidth, int maxWidth, int minHeight, int maxHeight, int expectedWidth, int expectedHeight)
+    {
+        var view = new View ()
+        {
+            Width = Dim.Auto (minimumContentDim: minWidth, maximumContentDim: maxWidth),
+            Height = Dim.Auto (minimumContentDim: minHeight, maximumContentDim: maxHeight)
+        };
+        var subview = new View ()
+        {
+            X = 0,
+            Y = 0,
+            Width = Fill (),
+            Height = Fill ()
+        };
+        view.Add (subview);
 
         // Assuming the calculation is done after layout
-        int calculatedX = subview.X.Calculate (100, subview.Width, subview, Dimension.Width);
-        int calculatedY = subview.Y.Calculate (100, subview.Height, subview, Dimension.Height);
-        int calculatedWidth = subview.Width.Calculate (0, 100, view, Dimension.Width);
-        int calculatedHeight = subview.Height.Calculate (0, 100, view, Dimension.Height);
-
-        Assert.Equal (20, calculatedWidth); // subview's width
-        Assert.Equal (10, calculatedHeight); // subview's height
-        Assert.Equal (50, calculatedX);  // 50% of 100 (Width)
-        Assert.Equal (50, calculatedY);  // 50% of 100 (Height) 
+        int calculatedX = view.X.Calculate (100, view.Width, view, Dimension.Width);
+        int calculatedY = view.Y.Calculate (100, view.Height, view, Dimension.Height);
+        int calculatedWidth = view.Width.Calculate (0, 100, view, Dimension.Width);
+        int calculatedHeight = view.Height.Calculate (0, 100, view, Dimension.Height);
+
+        Assert.Equal (expectedWidth, calculatedWidth);
+        Assert.Equal (expectedHeight, calculatedHeight);
+
+        Assert.Equal (0, calculatedX);
+        Assert.Equal (0, calculatedY);
     }
 
     [Theory]
-    [InlineData (0, 0, 100)]
-    [InlineData (1, 0, 100)]
-    [InlineData (0, 1, 100)]
-    [InlineData (1, 1, 100)]
-    public void With_Subview_Using_DimFill (int subViewOffset, int dimFillMargin, int expectedSize)
+    [InlineData (0, 0, 0, 0, 0, 0)]
+    [InlineData (0, 19, 0, 9, 2, 4)]
+    [InlineData (0, 20, 0, 10, 2, 4)]
+    [InlineData (0, 21, 0, 11, 2, 4)]
+    [InlineData (1, 21, 1, 11, 2, 4)]
+    [InlineData (21, 21, 11, 11, 21, 11)]
+    public void With_Subview_Using_DimFill_And_Another_Subview (int minWidth, int maxWidth, int minHeight, int maxHeight, int expectedWidth, int expectedHeight)
     {
-        // BUGBUG: THis test is totally bogus. Dim.Fill isnot working right yet.
         var view = new View ()
         {
-            Width = Dim.Auto (DimAutoStyle.Content, minimumContentDim: 100, maximumContentDim: 100),
-            Height = Dim.Auto (DimAutoStyle.Content, minimumContentDim: 100, maximumContentDim: 100),
+            Width = Dim.Auto (minimumContentDim: minWidth, maximumContentDim: maxWidth),
+            Height = Dim.Auto (minimumContentDim: minHeight, maximumContentDim: maxHeight)
+        };
+        var absView = new View ()
+        {
+            X = 1,
+            Y = 2,
+            Width = 1,
+            Height = 2
         };
+        view.Add (absView);
         var subview = new View ()
         {
-            X = subViewOffset,
-            Y = subViewOffset,
-            Width = Dim.Fill (dimFillMargin),
-            Height = Dim.Fill (dimFillMargin)
+            X = 0,
+            Y = 0,
+            Width = Fill (),
+            Height = Fill ()
         };
         view.Add (subview);
-        //view.LayoutSubviews ();
-        view.SetRelativeLayout (new (200, 200));
 
-        Assert.Equal (expectedSize, view.Frame.Width);
+        // Assuming the calculation is done after layout
+        int calculatedX = view.X.Calculate (100, view.Width, view, Dimension.Width);
+        int calculatedY = view.Y.Calculate (100, view.Height, view, Dimension.Height);
+        int calculatedWidth = view.Width.Calculate (0, 100, view, Dimension.Width);
+        int calculatedHeight = view.Height.Calculate (0, 100, view, Dimension.Height);
+
+        Assert.Equal (expectedWidth, calculatedWidth);
+        Assert.Equal (expectedHeight, calculatedHeight);
+
+        Assert.Equal (0, calculatedX);
+        Assert.Equal (0, calculatedY);
     }
 
+
     [Fact]
     public void With_Subview_Using_DimFunc ()
     {
@@ -1150,7 +1144,7 @@ public class DimAutoTests (ITestOutputHelper output)
     [InlineData (0, 20, 0, 10, 20, 10)]
     [InlineData (0, 21, 0, 11, 21, 11)]
     [InlineData (1, 21, 1, 11, 21, 11)]
-    [InlineData (100, 21, 100, 11, 21, 11)]
+    [InlineData (21, 21, 11, 11, 21, 11)]
     public void With_Subview_Using_PosAbsolute (int minWidth, int maxWidth, int minHeight, int maxHeight, int expectedWidth, int expectedHeight)
     {
         var view = new View ()
@@ -1186,7 +1180,7 @@ public class DimAutoTests (ITestOutputHelper output)
     [InlineData (0, 20, 0, 10, 20, 10)]
     [InlineData (0, 21, 0, 11, 20, 10)]
     [InlineData (1, 21, 1, 11, 20, 10)]
-    [InlineData (100, 21, 100, 11, 21, 11)]
+    [InlineData (21, 21, 11, 11, 21, 11)]
     public void With_Subview_Using_PosPercent (int minWidth, int maxWidth, int minHeight, int maxHeight, int expectedWidth, int expectedHeight)
     {
         var view = new View ()
@@ -1228,7 +1222,7 @@ public class DimAutoTests (ITestOutputHelper output)
     [InlineData (0, 20, 0, 10, 20, 10)]
     [InlineData (0, 21, 0, 11, 21, 11)]
     [InlineData (1, 21, 1, 11, 21, 11)]
-    [InlineData (100, 21, 100, 11, 21, 11)]
+    [InlineData (21, 21, 11, 11, 21, 11)]
     public void With_Subview_Using_PosPercent_Combine (int minWidth, int maxWidth, int minHeight, int maxHeight, int expectedWidth, int expectedHeight)
     {
         var view = new View ()
@@ -1268,9 +1262,9 @@ public class DimAutoTests (ITestOutputHelper output)
     [InlineData (0, 0, 0, 0, 0, 0)]
     [InlineData (0, 19, 0, 9, 19, 9)]
     [InlineData (0, 20, 0, 10, 20, 10)]
-    [InlineData (0, 21, 0, 11, 21, 11)]
-    [InlineData (1, 21, 1, 11, 21, 11)]
-    [InlineData (100, 21, 100, 11, 21, 11)]
+    [InlineData (0, 21, 0, 11, 20, 10)]
+    [InlineData (1, 21, 1, 11, 20, 10)]
+    [InlineData (21, 21, 11, 11, 21, 11)]
     public void With_Subview_Using_PosCenter (int minWidth, int maxWidth, int minHeight, int maxHeight, int expectedWidth, int expectedHeight)
     {
         var view = new View ()
@@ -1313,7 +1307,7 @@ public class DimAutoTests (ITestOutputHelper output)
     [InlineData (0, 20, 0, 10, 20, 10)]
     [InlineData (0, 21, 0, 11, 21, 11)]
     [InlineData (1, 21, 1, 11, 21, 11)]
-    [InlineData (100, 21, 100, 11, 21, 11)]
+    [InlineData (21, 21, 11, 11, 21, 11)]
     public void With_Subview_Using_PosCenter_Combine (int minWidth, int maxWidth, int minHeight, int maxHeight, int expectedWidth, int expectedHeight)
     {
         var view = new View ()
@@ -1357,7 +1351,7 @@ public class DimAutoTests (ITestOutputHelper output)
     [InlineData (0, 20, 0, 10, 20, 10)]
     [InlineData (0, 21, 0, 11, 20, 10)]
     [InlineData (1, 21, 1, 11, 20, 10)]
-    [InlineData (100, 21, 100, 11, 21, 11)]
+    [InlineData (21, 21, 11, 11, 21, 11)]
     public void With_Subview_Using_PosAnchorEnd (int minWidth, int maxWidth, int minHeight, int maxHeight, int expectedWidth, int expectedHeight)
     {
         var view = new View ()
@@ -1469,12 +1463,14 @@ public class DimAutoTests (ITestOutputHelper output)
         View view = new ()
         {
             Width = Auto (),
+            Height = 1,
             Text = text
         };
 
         View subView = new ()
         {
             Width = dimension,
+            Height = 1,
         };
         view.Add (subView);
 

+ 2 - 1
UnitTests/Views/ShortcutTests.cs

@@ -38,7 +38,8 @@ public class ShortcutTests
 
         Assert.IsType<DimAuto> (shortcut.Width);
         Assert.IsType<DimAuto> (shortcut.Height);
-
+        //shortcut.BeginInit();
+        //shortcut.EndInit ();
         shortcut.LayoutSubviews ();
         shortcut.SetRelativeLayout (new (100, 100));