From 5766a8d226628574a160e57b90d733cb40ebd3a3 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 30 Aug 2019 21:13:31 +0200 Subject: [PATCH] ui/layout: avoid accumulating rounding errors from Flexible Signed-off-by: Elias Naur --- ui/layout/flex.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/ui/layout/flex.go b/ui/layout/flex.go index 7f698c24..a9e734ba 100644 --- a/ui/layout/flex.go +++ b/ui/layout/flex.go @@ -20,12 +20,14 @@ type Flex struct { // Alignment is the alignment in the cross axis. Alignment Alignment - macro ui.MacroOp - ops *ui.Ops - cs Constraints - mode flexMode - size int - rigidSize int + macro ui.MacroOp + ops *ui.Ops + cs Constraints + mode flexMode + size int + rigidSize int + // fraction is the rounding error from a Flexible weighting. + fraction float32 maxCross int maxBaseline int } @@ -111,11 +113,14 @@ func (f *Flex) Flexible(weight float32) Constraints { mainc := axisMainConstraint(f.Axis, f.cs) var flexSize int if mainc.Max > f.size { - maxSize := mainc.Max - f.size flexSize = mainc.Max - f.rigidSize - flexSize = int(float32(flexSize)*weight + .5) - if flexSize > maxSize { - flexSize = maxSize + // Apply weight and add any leftover fraction from a + // previous Flexible. + size := float32(flexSize)*weight + f.fraction + flexSize = int(size + .5) + f.fraction = size - float32(flexSize) + if max := mainc.Max - f.size; flexSize > max { + flexSize = max } } submainc := Constraint{Max: flexSize}