From 74fce3fc78604e1d13517f88b8f07dcd738cf865 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 11 Apr 2023 16:20:54 +0200 Subject: [PATCH] Fix square sizing Fixes #85. --- library/src/visualize/shape.rs | 14 ++++++++++---- tests/ref/visualize/shape-aspect.png | Bin 4706 -> 4717 bytes 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/library/src/visualize/shape.rs b/library/src/visualize/shape.rs index c899ad6d9..51dbabd80 100644 --- a/library/src/visualize/shape.rs +++ b/library/src/visualize/shape.rs @@ -483,7 +483,7 @@ fn layout( let mut frame; if let Some(child) = body { - let mut region = resolved.unwrap_or(regions.base()); + let region = resolved.unwrap_or(regions.base()); if kind.is_round() { inset = inset.map(|side| side + Ratio::new(0.5 - SQRT_2 / 4.0)); } @@ -494,17 +494,23 @@ fn layout( let pod = Regions::one(region, expand); frame = child.layout(vt, styles, pod)?.into_frame(); + // Enforce correct size. + *frame.size_mut() = expand.select(region, frame.size()); + // Relayout with full expansion into square region to make sure // the result is really a square or circle. if kind.is_quadratic() { + frame.set_size(Size::splat(frame.size().max_by_side())); let length = frame.size().max_by_side().min(region.min_by_side()); - region = Size::splat(length); - let pod = Regions::one(region, Axes::splat(true)); + let pod = Regions::one(Size::splat(length), Axes::splat(true)); frame = child.layout(vt, styles, pod)?.into_frame(); } - // Enforce correct size. + // Enforce correct size again. *frame.size_mut() = expand.select(region, frame.size()); + if kind.is_quadratic() { + frame.set_size(Size::splat(frame.size().max_by_side())); + } } else { // The default size that a shape takes on if it has no child and // enough space. diff --git a/tests/ref/visualize/shape-aspect.png b/tests/ref/visualize/shape-aspect.png index 39767fbc96626f12764192699568918c15c3c851..918a5e73153d980ce39d710ef6e03a5b288e7646 100644 GIT binary patch delta 3679 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 b<3JuN8obn*m{MY21|3UXMGIG;Wa0lWX${NM delta 3662 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