示例#1
0
        public double _getIntrinsicSize(
            Axis sizingDirection,
            double extent,
            _ChildSizingFunction childSize
            )
        {
            if (this._direction == sizingDirection)
            {
                double totalFlex            = 0.0;
                double inflexibleSpace      = 0.0;
                double maxFlexFractionSoFar = 0.0;

                RenderBox child = this.firstChild;
                while (child != null)
                {
                    int flex = this._getFlex(child);
                    totalFlex += flex;
                    if (flex > 0)
                    {
                        double flexFraction = childSize(child, extent) / this._getFlex(child);
                        maxFlexFractionSoFar = Math.Max(maxFlexFractionSoFar, flexFraction);
                    }
                    else
                    {
                        inflexibleSpace += childSize(child, extent);
                    }

                    var childParentData = (FlexParentData)child.parentData;
                    child = childParentData.nextSibling;
                }

                return(maxFlexFractionSoFar * totalFlex + inflexibleSpace);
            }
            else
            {
                double    availableMainSpace = extent;
                int       totalFlex          = 0;
                double    inflexibleSpace    = 0.0;
                double    maxCrossSize       = 0.0;
                RenderBox child = this.firstChild;
                while (child != null)
                {
                    int flex = this._getFlex(child);
                    totalFlex += flex;
                    if (flex == 0)
                    {
                        double mainSize  = 0.0;
                        double crossSize = 0.0;

                        switch (this._direction)
                        {
                        case Axis.horizontal:
                            mainSize  = child.getMaxIntrinsicWidth(double.PositiveInfinity);
                            crossSize = childSize(child, mainSize);
                            break;

                        case Axis.vertical:
                            mainSize  = child.getMaxIntrinsicHeight(double.PositiveInfinity);
                            crossSize = childSize(child, mainSize);
                            break;
                        }

                        inflexibleSpace += mainSize;
                        maxCrossSize     = Math.Max(maxCrossSize, crossSize);
                    }

                    var childParentData = (FlexParentData)child.parentData;
                    child = childParentData.nextSibling;
                }

                double spacePerFlex = Math.Max(0.0, (availableMainSpace - inflexibleSpace) / totalFlex);

                child = this.firstChild;
                while (child != null)
                {
                    int flex = this._getFlex(child);
                    if (flex > 0)
                    {
                        maxCrossSize = Math.Max(maxCrossSize, childSize(child, spacePerFlex * flex));
                    }

                    var childParentData = (FlexParentData)child.parentData;
                    child = childParentData.nextSibling;
                }

                return(maxCrossSize);
            }
        }
示例#2
0
        public float _getIntrinsicSize(
            Axis sizingDirection,
            float extent,
            _ChildSizingFunction childSize
            )
        {
            if (_direction == sizingDirection)
            {
                float totalFlex            = 0.0f;
                float inflexibleSpace      = 0.0f;
                float maxFlexFractionSoFar = 0.0f;

                RenderBox child = firstChild;
                while (child != null)
                {
                    int flex = _getFlex(child);
                    totalFlex += flex;
                    if (flex > 0)
                    {
                        float flexFraction = childSize(child, extent) / _getFlex(child);
                        maxFlexFractionSoFar = Mathf.Max(maxFlexFractionSoFar, flexFraction);
                    }
                    else
                    {
                        inflexibleSpace += childSize(child, extent);
                    }

                    var childParentData = (FlexParentData)child.parentData;
                    child = childParentData.nextSibling;
                }

                return(maxFlexFractionSoFar * totalFlex + inflexibleSpace);
            }
            else
            {
                float?    availableMainSpace = extent;
                int       totalFlex          = 0;
                float     inflexibleSpace    = 0.0f;
                float     maxCrossSize       = 0.0f;
                RenderBox child = firstChild;
                while (child != null)
                {
                    int flex = _getFlex(child);
                    totalFlex += flex;
                    if (flex == 0)
                    {
                        float mainSize  = 0.0f;
                        float crossSize = 0.0f;

                        switch (_direction)
                        {
                        case Axis.horizontal:
                            mainSize  = child.getMaxIntrinsicWidth(float.PositiveInfinity);
                            crossSize = childSize(child, mainSize);
                            break;

                        case Axis.vertical:
                            mainSize  = child.getMaxIntrinsicHeight(float.PositiveInfinity);
                            crossSize = childSize(child, mainSize);
                            break;
                        }

                        inflexibleSpace += mainSize;
                        maxCrossSize     = Mathf.Max(maxCrossSize, crossSize);
                    }

                    var childParentData = (FlexParentData)child.parentData;
                    child = childParentData.nextSibling;
                }

                float spacePerFlex = Mathf.Max(0.0f, ((availableMainSpace - inflexibleSpace) / totalFlex) ?? 0.0f);

                child = firstChild;
                while (child != null)
                {
                    int flex = _getFlex(child);
                    if (flex > 0)
                    {
                        maxCrossSize = Mathf.Max(maxCrossSize, childSize(child, spacePerFlex * flex));
                    }

                    var childParentData = (FlexParentData)child.parentData;
                    child = childParentData.nextSibling;
                }

                return(maxCrossSize);
            }
        }