From 1982a0639e43405c72cf0675263443771b83fd86 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 27 Sep 2021 11:39:31 +0200 Subject: [PATCH] Expand all but last region for broken up auto rows --- src/layout/grid.rs | 52 +++++++++++++++++++----------------- tests/ref/layout/grid-5.png | Bin 1427 -> 3068 bytes tests/typ/layout/grid-5.typ | 17 ++++++++++++ 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/layout/grid.rs b/src/layout/grid.rs index 91cc0014a..f2a38d7c2 100644 --- a/src/layout/grid.rs +++ b/src/layout/grid.rs @@ -358,9 +358,7 @@ impl<'a> GridLayouter<'a> { /// break across multiple regions. fn layout_auto_row(&mut self, ctx: &mut LayoutContext, y: usize) { let base = self.regions.base.get(self.inline); - - let mut first = Length::zero(); - let mut rest: Vec = vec![]; + let mut resolved: Vec = vec![]; // Determine the size for each region of the row. for (x, &rcol) in self.rcols.iter().enumerate() { @@ -381,24 +379,31 @@ impl<'a> GridLayouter<'a> { .into_iter() .map(|frame| frame.item.size.get(self.block)); - if let Some(size) = sizes.next() { - first.set_max(size); + for (target, size) in resolved.iter_mut().zip(&mut sizes) { + target.set_max(size); } - for (resolved, size) in rest.iter_mut().zip(&mut sizes) { - resolved.set_max(size); - } - - rest.extend(sizes); + resolved.extend(sizes); } } // Layout the row. - if rest.is_empty() { + if let &[first] = resolved.as_slice() { let frame = self.layout_single_row(ctx, first, y); self.push_row(ctx, frame); } else { - let frames = self.layout_multi_row(ctx, first, &rest, y); + // Expand all but the last region if the space is not eaten up by any fr + // rows. + if self.fr.is_zero() { + let len = resolved.len(); + for (target, (current, _)) in + resolved[.. len - 1].iter_mut().zip(self.regions.iter()) + { + target.set_max(current.get(self.block)); + } + } + + let frames = self.layout_multi_row(ctx, &resolved, y); let len = frames.len(); for (i, frame) in frames.into_iter().enumerate() { if i + 1 < len { @@ -450,24 +455,26 @@ impl<'a> GridLayouter<'a> { fn layout_multi_row( &self, ctx: &mut LayoutContext, - first: Length, - rest: &[Length], + resolved: &[Length], y: usize, ) -> Vec { let base = self.regions.base.get(self.inline); // Prepare frames. - let mut outputs: Vec<_> = std::iter::once(first) - .chain(rest.iter().copied()) - .map(|v| self.complete(v)) + let mut outputs: Vec<_> = resolved + .iter() + .map(|&v| self.complete(v)) .map(|size| Frame::new(size, size.h)) .collect(); // Prepare regions. - let size = self.complete(first); + let size = self.complete(resolved[0]); let mut regions = Regions::one(size, self.regions.base, Spec::splat(true)); - regions.backlog = - rest.iter().map(|&v| self.complete(v)).collect::>().into_iter(); + regions.backlog = resolved[1 ..] + .iter() + .map(|&v| self.complete(v)) + .collect::>() + .into_iter(); // Layout the row. let mut pos = Gen::zero(); @@ -537,10 +544,7 @@ impl<'a> GridLayouter<'a> { Row::Frame(frame) => frame, Row::Fr(v, y) => { let ratio = v / self.fr; - if remaining > Length::zero() - && remaining.is_finite() - && ratio.is_finite() - { + if remaining.is_finite() && ratio.is_finite() { let resolved = ratio * remaining; self.layout_single_row(ctx, resolved, y) } else { diff --git a/tests/ref/layout/grid-5.png b/tests/ref/layout/grid-5.png index a43408f8aea84bd1dd4130c6d59d002ff2573696..37666cc38fb7e7c18f21406afbd8edca591e5015 100644 GIT binary patch delta 2764 zcmYk8dpy&98^?c}(a#~aXv%q(L}Hag2s4N2cIQwjXX_y3Sczn8X``D&);+|MTXCx# zGKYw;!Y!-}vpK8BsX3H#m?jTB&+BuwPU0Mc)c*;=2vJ}@`jeYxNrk~+?STmW`sC5}t%6Z;1U`0x%0ARlVlU3o}@BAais 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 Jmf{Er{|0DiBkceH delta 1274 zcmV zI=~%32c!e&fOLR6ARUZ5m=dOhDdD|80Ley2SIIp(=gQ-?evJ|miN}1-#v3z5Q4~c{ z6h--Fc(apX1s8we|3V-Fklq>Lb~OlH;d4iTzBH?5fT=Vqr~T(Jn}bl=J8TKws(pA^ zVdsG1RSzXUL>Ts=dtO8cLU?xsAa?zAIUx9JbG_w^aJ_H27(j55a9W-ax&f9`mn#C^ zs$olM0Otj`G>-^V1u*T~Ozyh_%;ubPZhk~4`t`pS?}C4@9|?B^+ZQ<=IP*qGM+9&E zn;|SV9TB3PVLMRdig4M7>)D|!W=O;1F`>5^NER|h2v@T%0EE%(BSJXYr7iG!W<%+P)qV5PJH~XOoPY8?izAti}Spsh-x8-C2^$fW75h0us z(Ae@WyF;)`UDrkbh;VKI;yxvtJHjuEFJW7xdY6B?gDOyKEpj;`gl#`?Rjvr$nkR&0 z=L9^R9h^k~d#%&McM*We_K)71d0?{QW2^_#<(#0i0O53r@X@}M!FLfLHE!r#1JJv^ zcRjE;s}@o-3@-Kk&@2$!s_$RyGC`9nLJ)!wgdhYV2tf#c8iDu;aErMkz&MWMI0Jm{ zqb+~VN|+1Fy#fWq)@+IZaWL!mj~z&*1DZFPZQgICk26QAI|xAtK!`^K(*4zHFTaQI z*$(cSo)A*s4`uygMfx8hoa-%x0Sp6BJw4!^&H++Yyw)Yd&r0)tOJzW`ZXCz6dqij* z&qe&)cZbRR_Eh(dK-v~5ReX7;;>%?5h_GT`Pq|aB2*<~DqFq_LChQ1M775^->sJC< z)`}C5&K7~juJ>^3!Cm(6h0WFhOZ8fp3g1P5t}rV)fRD4;d4klMS(D#=KJ>~iV%<`a@Xt}et^dz?`-OOwD08y+@G>MI{=M& z2&K)?&k)LW_XsdqmBO+i)Dz%yMOdtb*4qWn3F_^&9`)XNXGK`nzppYyptP7;8VjL; zxWCrJo)MZV=K~`QHcShPwf+3uS?UpCTl-uQh*mh@RGbrpy|Yw#*b-INchKjG0FCuP zzpj3{UNjc-Gr~5`^b`p!7J<0F&Lo^J38ofU))!?Zy8^9s_j_9w_g861_|seI_5OJ4 zCKcMU?q|R|=URx3b1g8G=0efVxgum4ld%gblh6wblh6wblh6wblh6wblh6wblh6wa kAl@87Q4~c{6h%4aAN5ZY3#O#<82|tP07*qoM6N<$f|N&Bb^rhX diff --git a/tests/typ/layout/grid-5.typ b/tests/typ/layout/grid-5.typ index cd1c8dc94..18736b904 100644 --- a/tests/typ/layout/grid-5.typ +++ b/tests/typ/layout/grid-5.typ @@ -9,3 +9,20 @@ World ] + +--- +// Test that broken cell expands vertically. +#page(height: 2.25cm) +#grid( + columns: 2, + gutter: 10pt, + [#align(bottom) A], + [ + Top + #align(bottom) + Bottom \ + Bottom \ + Top + ], + [#align(top) B], +)