diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-02-12 12:15:03 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-02-12 12:57:35 +0100 |
| commit | 8951b1923a581f7454ddf4dbe3e55f69ce5799f9 (patch) | |
| tree | 86ba96f9f83ca3983bddf13ad37df2469877720d | |
| parent | e873468ea7deedd6d43f24100591c60a7de5accc (diff) | |
Skip grid region if one cell is empty
| -rw-r--r-- | library/src/layout/grid.rs | 17 | ||||
| -rw-r--r-- | tests/ref/bugs/grid-2.png | bin | 0 -> 9958 bytes | |||
| -rw-r--r-- | tests/ref/layout/grid-3.png | bin | 44308 -> 44312 bytes | |||
| -rw-r--r-- | tests/typ/bugs/grid-2.typ | 18 |
4 files changed, 31 insertions, 4 deletions
diff --git a/library/src/layout/grid.rs b/library/src/layout/grid.rs index 46518f82..544b76ed 100644 --- a/library/src/layout/grid.rs +++ b/library/src/layout/grid.rs @@ -482,6 +482,7 @@ impl<'a, 'v> GridLayouter<'a, 'v> { /// regions. fn layout_auto_row(&mut self, y: usize) -> SourceResult<()> { let mut resolved: Vec<Abs> = vec![]; + let mut skip = false; // Determine the size for each region of the row. for (x, &rcol) in self.rcols.iter().enumerate() { @@ -490,13 +491,15 @@ impl<'a, 'v> GridLayouter<'a, 'v> { pod.first.x = rcol; pod.base.x = rcol; - let mut sizes = cell - .layout(self.vt, self.styles, pod)? - .into_iter() - .map(|frame| frame.height()); + let frames = cell.layout(self.vt, self.styles, pod)?.into_frames(); + if let [first, rest @ ..] = frames.as_slice() { + skip |= + first.is_empty() && rest.iter().any(|frame| !frame.is_empty()); + } // For each region, we want to know the maximum height any // column requires. + let mut sizes = frames.iter().map(|frame| frame.height()); for (target, size) in resolved.iter_mut().zip(&mut sizes) { target.set_max(size); } @@ -519,6 +522,12 @@ impl<'a, 'v> GridLayouter<'a, 'v> { return Ok(()); } + // Skip the first region if it's empty for some cell. + if skip && !self.regions.in_last() { + self.finish_region()?; + resolved.remove(0); + } + // Expand all but the last region if the space is not // eaten up by any fr rows. if self.fr.is_zero() { diff --git a/tests/ref/bugs/grid-2.png b/tests/ref/bugs/grid-2.png Binary files differnew file mode 100644 index 00000000..2d39e186 --- /dev/null +++ b/tests/ref/bugs/grid-2.png diff --git a/tests/ref/layout/grid-3.png b/tests/ref/layout/grid-3.png Binary files differindex d9562e9a..f6c17835 100644 --- a/tests/ref/layout/grid-3.png +++ b/tests/ref/layout/grid-3.png diff --git a/tests/typ/bugs/grid-2.typ b/tests/typ/bugs/grid-2.typ new file mode 100644 index 00000000..bdcdf548 --- /dev/null +++ b/tests/typ/bugs/grid-2.typ @@ -0,0 +1,18 @@ +// Grid now skips a remaining region when one of the cells +// doesn't fit into it at all. + +--- +#set page(height: 100pt) +#grid( + columns: (2cm, auto), + rows: (auto, auto), + rect(width: 100%, fill: red), + rect(width: 100%, fill: blue), + rect(width: 100%, height: 80%, fill: green), + [Hello], +) + +--- +#set page(height: 60pt) +#lorem(5) +- #lorem(5) |
