Fixed little things.

This commit is contained in:
Tig
2024-07-16 18:40:51 -06:00
parent 0e7e1e2c1e
commit e93eebb708
10 changed files with 364 additions and 465 deletions

View File

@@ -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)
{

View File

@@ -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 ();
}
//// [ ] 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 ();
//}
int maxPercent = 0;
//viewsNeedingLayout.AddRange (dimPercentSubViews);
for (var i = 0; i < percentSubViews.Count; i++)
{
View v = percentSubViews [i];
//int maxDimPercent = 0;
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);
//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)
{

View File

@@ -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)

View File

@@ -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;

View File

@@ -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>

View File

@@ -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 ();

View File

@@ -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.Width = width;
}
if (height != 0)
{
dialog.Height = height;
dialog.Width = width;
}
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."
};

View File

@@ -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

View File

@@ -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);
view.SetRelativeLayout(Application.Screen.Size);
Assert.Equal (new (expectedW, expectedH), view.Frame.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);
}
[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 = 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);
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 (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)
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, 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, 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)
{
// 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 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);
}
[Theory]
[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)
{
var view = new View ()
{
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 = 0,
Y = 0,
Width = Fill (),
Height = Fill ()
};
view.Add (subview);
// 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);

View File

@@ -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));