Expand all but last region for broken up auto rows

This commit is contained in:
Laurenz 2021-09-27 11:39:31 +02:00
parent 6c478face4
commit 1982a0639e
3 changed files with 45 additions and 24 deletions

View File

@ -358,9 +358,7 @@ impl<'a> GridLayouter<'a> {
/// break across multiple regions. /// break across multiple regions.
fn layout_auto_row(&mut self, ctx: &mut LayoutContext, y: usize) { fn layout_auto_row(&mut self, ctx: &mut LayoutContext, y: usize) {
let base = self.regions.base.get(self.inline); let base = self.regions.base.get(self.inline);
let mut resolved: Vec<Length> = vec![];
let mut first = Length::zero();
let mut rest: Vec<Length> = vec![];
// Determine the size for each region of the row. // Determine the size for each region of the row.
for (x, &rcol) in self.rcols.iter().enumerate() { for (x, &rcol) in self.rcols.iter().enumerate() {
@ -381,24 +379,31 @@ impl<'a> GridLayouter<'a> {
.into_iter() .into_iter()
.map(|frame| frame.item.size.get(self.block)); .map(|frame| frame.item.size.get(self.block));
if let Some(size) = sizes.next() { for (target, size) in resolved.iter_mut().zip(&mut sizes) {
first.set_max(size); target.set_max(size);
} }
for (resolved, size) in rest.iter_mut().zip(&mut sizes) { resolved.extend(sizes);
resolved.set_max(size);
}
rest.extend(sizes);
} }
} }
// Layout the row. // Layout the row.
if rest.is_empty() { if let &[first] = resolved.as_slice() {
let frame = self.layout_single_row(ctx, first, y); let frame = self.layout_single_row(ctx, first, y);
self.push_row(ctx, frame); self.push_row(ctx, frame);
} else { } 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(); let len = frames.len();
for (i, frame) in frames.into_iter().enumerate() { for (i, frame) in frames.into_iter().enumerate() {
if i + 1 < len { if i + 1 < len {
@ -450,24 +455,26 @@ impl<'a> GridLayouter<'a> {
fn layout_multi_row( fn layout_multi_row(
&self, &self,
ctx: &mut LayoutContext, ctx: &mut LayoutContext,
first: Length, resolved: &[Length],
rest: &[Length],
y: usize, y: usize,
) -> Vec<Frame> { ) -> Vec<Frame> {
let base = self.regions.base.get(self.inline); let base = self.regions.base.get(self.inline);
// Prepare frames. // Prepare frames.
let mut outputs: Vec<_> = std::iter::once(first) let mut outputs: Vec<_> = resolved
.chain(rest.iter().copied()) .iter()
.map(|v| self.complete(v)) .map(|&v| self.complete(v))
.map(|size| Frame::new(size, size.h)) .map(|size| Frame::new(size, size.h))
.collect(); .collect();
// Prepare regions. // 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)); let mut regions = Regions::one(size, self.regions.base, Spec::splat(true));
regions.backlog = regions.backlog = resolved[1 ..]
rest.iter().map(|&v| self.complete(v)).collect::<Vec<_>>().into_iter(); .iter()
.map(|&v| self.complete(v))
.collect::<Vec<_>>()
.into_iter();
// Layout the row. // Layout the row.
let mut pos = Gen::zero(); let mut pos = Gen::zero();
@ -537,10 +544,7 @@ impl<'a> GridLayouter<'a> {
Row::Frame(frame) => frame, Row::Frame(frame) => frame,
Row::Fr(v, y) => { Row::Fr(v, y) => {
let ratio = v / self.fr; let ratio = v / self.fr;
if remaining > Length::zero() if remaining.is_finite() && ratio.is_finite() {
&& remaining.is_finite()
&& ratio.is_finite()
{
let resolved = ratio * remaining; let resolved = ratio * remaining;
self.layout_single_row(ctx, resolved, y) self.layout_single_row(ctx, resolved, y)
} else { } else {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -9,3 +9,20 @@
World 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],
)