mirror of
https://github.com/typst/typst
synced 2025-05-14 04:56:26 +08:00
Expand all but last region for broken up auto rows
This commit is contained in:
parent
6c478face4
commit
1982a0639e
@ -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 |
@ -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],
|
||||||
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user