Exemplo n.º 1
0
        private static FlexSpacingMeasurement CalculateLineSpacing(FlexSpacing spacing, int remainingEmptySpace, int lineItemCount)
        {
            var betweenCount = lineItemCount > 1
                ? lineItemCount - 1
                : 0;

            var layout = new FlexSpacingMeasurement();

            switch (spacing)
            {
            case FlexSpacing.Start:
                layout.End = remainingEmptySpace;
                break;

            case FlexSpacing.End:
                layout.Start = remainingEmptySpace;
                break;

            case FlexSpacing.Center:
                layout.Start = (int)Math.Floor(remainingEmptySpace / 2.0);
                layout.End   = (int)Math.Ceiling(remainingEmptySpace / 2.0);
                break;

            case FlexSpacing.Around:
                var halved        = remainingEmptySpace / 2.0;
                var elementSpace  = (int)Math.Ceiling(halved);
                var startEndSpace = remainingEmptySpace - elementSpace;

                layout.Between = betweenCount > 0 ? elementSpace / betweenCount : 0;
                layout.Start   = (int)Math.Floor(startEndSpace / 2.0);
                layout.End     = (int)Math.Ceiling(startEndSpace / 2.0);
                break;

            case FlexSpacing.Between:
                layout.Between = betweenCount > 0 ? remainingEmptySpace / betweenCount : 0;
                break;

            case FlexSpacing.Evenly:
                var spaceCount  = betweenCount + 2;    // the space in front and at the end
                var distributed = remainingEmptySpace / spaceCount;
                layout.Between = distributed;
                layout.Start   = distributed;
                layout.End     = distributed;
                break;

            default:
                break;
            }

            return(layout);
        }
Exemplo n.º 2
0
        private static void LayoutLine(MeasuredLayout layout, FlexSpacing spacing, Axis axis, BoxConstraint constraint)
        {
            int total = 0;

            try
            {
                total = layout
                        .Elements
                        .Select(l => l.Size.GetAxis(axis))
                        .Sum();
            }
            catch (ArithmeticException ex)
            {
                throw;
            }

            // if !isbounded, it's just a total + maxsize on offset

            // if isbounded, then calc the flex spacing
            // add it all together for the size

            var lineSpacing = constraint.IsBounded(axis)
                ? CalculateLineSpacing(spacing, constraint.GetMaxSize().GetAxis(axis) - total, layout.Elements.Count)
                : new FlexSpacingMeasurement()
            {
                Between = 0, End = 0, Start = 0
            };

            var used     = lineSpacing.Start;
            var crossMax = 0;

            for (var x = 0; x < layout.Elements.Count; x++)
            {
                var item = layout.Elements[x];

                item.Offset = used;

                used += item.Size.GetAxis(axis);

                if (x != layout.Elements.Count - 1)
                {
                    // add between for every item that's not 'last'
                    used += lineSpacing.Between;
                }

                var cross = item.Size.GetAxis(axis.CrossAxis());
                if (cross < int.MaxValue && cross > crossMax)
                {
                    crossMax = cross;
                }
            }

            used += lineSpacing.End;

            foreach (var i in layout.Elements)
            {
                i.Constraint = i.Constraint.Set(axis.CrossAxis(), crossMax);
            }

            layout.Size = axis == Axis.Horizontal
                ? new Size(used, crossMax)
                : new Size(crossMax, used);
        }