コード例 #1
0
ファイル: FlexBox.cs プロジェクト: eylvisaker/BallBusterX
            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));
            }
コード例 #2
0
ファイル: FlexBox.cs プロジェクト: eylvisaker/BallBusterX
            /// <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)));
            }
コード例 #3
0
ファイル: Grid.cs プロジェクト: eylvisaker/BallBusterX
        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));
        }
コード例 #4
0
ファイル: FlexBox.cs プロジェクト: eylvisaker/BallBusterX
        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();
            }
        }
コード例 #5
0
        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);
        }
コード例 #6
0
ファイル: FlexBox.cs プロジェクト: eylvisaker/BallBusterX
            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;
            }