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