public Size CalcIdealSize(IUserInterfaceRenderContext renderContext, Size maxSize, IList <IRenderElement> children) { int idealCrossSize = 0; int idealAxisSize = 0; foreach (var item in children) { if (!item.Display.IsVisible) { continue; } var itemBox = item.Display.Region.MarginToContentOffset; var itemMaxSize = LayoutMath.ItemContentMaxSize(itemBox, maxSize); item.Display.Region.IdealContentSize = item.CalcIdealContentSize(renderContext, maxSize); var itemIdealContentSize = item.Display.Region.CalcConstrainedContentSize(maxSize); var itemIdealMarginSize = itemBox.Expand(itemIdealContentSize); idealCrossSize = Math.Max(idealCrossSize, CrossAxis(itemIdealMarginSize)); idealAxisSize += MainAxis(itemIdealMarginSize); } return(SetSize(idealAxisSize, idealCrossSize)); }
/// <summary> /// Updates the ideal size property for each child. /// Returns the total ideal margin size along the main axis. /// </summary> /// <param name="renderContext"></param> /// <param name="mySize"></param> /// <param name="children"></param> /// <returns></returns> private int CalcChildrenIdealSizes(IUserInterfaceRenderContext renderContext, Size mySize, IList <IRenderElement> children) { foreach (var item in children) { LayoutMath.CalcIdealSize(item, renderContext, mySize); item.Display.Region.SetContentSize(item.Display.Region.IdealContentSize); } return(children.Sum(x => MainAxis(x.Display.Region.IdealMarginSize))); }
public override Size CalcIdealContentSize(IUserInterfaceRenderContext renderContext, Size maxSize) { Array.Clear(columnWidths, 0, columnWidths.Length); Array.Clear(rowHeights, 0, rowHeights.Length); for (int y = 0; y < Rows; y++) { for (int x = 0; x < Columns; x++) { var item = ChildAt(x, y); SetSizeAt(x, y, Size.Empty); if (item == null) { continue; } var itemBox = item.Display.Region.MarginToContentOffset; var itemMaxSize = LayoutMath.ItemContentMaxSize(itemBox, maxSize); item.Display.Region.IdealContentSize = item.CalcIdealContentSize(renderContext, maxSize); var itemIdealSize = item.Display.Region.CalcConstrainedContentSize(maxSize); SetSizeAt(x, y, itemIdealSize); columnWidths[x] = Math.Max(columnWidths[x], itemIdealSize.Width + itemBox.Width); rowHeights[y] = Math.Max(rowHeights[y], itemIdealSize.Height + itemBox.Height); } } for (int i = 0; i < Columns; i++) { columnWidths[i] = Math.Min(maxSize.Width, columnWidths[i]); } for (int i = 0; i < Rows; i++) { rowHeights[i] = Math.Min(maxSize.Height, rowHeights[i]); } var idealWidth = columnWidths.Sum(); var idealHeight = rowHeights.Sum(); return(new Size(idealWidth, idealHeight)); }
public override Size CalcIdealContentSize(IUserInterfaceRenderContext renderContext, Size maxSize) { UpdateChildLists(); maxSize = LayoutMath.ConstrainMaxSize(maxSize, Style.Size); switch (Direction) { case FlexDirection.Column: case FlexDirection.ColumnReverse: return(vertical.CalcIdealSize(renderContext, maxSize, layoutChildren)); case FlexDirection.Row: case FlexDirection.RowReverse: return(horizontal.CalcIdealSize(renderContext, maxSize, layoutChildren)); default: throw new InvalidOperationException(); } }
public void ConstrainMaxSizeWithFixedSizeConstraintTest( int initialWidth, int initialHeight, int maxWidth, int maxHeight, int expectedMaxWidth, int expectedMaxHeight) { Size initial = new Size(initialWidth, initialHeight); SizeConstraints constraints = new SizeConstraints { MaxWidth = maxWidth, MaxHeight = maxHeight, }; Size result = LayoutMath.ConstrainMaxSize(initial, constraints); result.Width.Should().Be(expectedMaxWidth); result.Height.Should().Be(expectedMaxHeight); }
private void ContractItems(IList <IRenderElement> children, Size mySize, ref int extraSpace) { if (extraSpace >= 0) { return; } float fExtraSpace = extraSpace; int iter = 0; while (Math.Abs(fExtraSpace) > 1e-6 && iter < 5) { float shrinkAmount = fExtraSpace / children.Count( x => MainAxis(x.Display.Region.ContentSize) - MainAxis(x.Style.Size?.ToMinSize() ?? Size.Empty) > 0); foreach (var item in children) { Size currentSize = item.Display.Region.ContentRect.Size; Size newSize = SetSize(MainAxis(currentSize) + (int)shrinkAmount, CrossAxis(currentSize)); newSize = LayoutMath.ConstrainSize(newSize, item.Style.Size); item.Display.Region.SetContentSize(newSize); int diff = MainAxis(new Size(newSize.Width - currentSize.Width, newSize.Height - currentSize.Height)); fExtraSpace -= diff; } iter++; } extraSpace = (int)fExtraSpace; }