Turn repeat into a single layouter (#4758)

This commit is contained in:
Laurenz 2024-08-15 16:00:15 +02:00 committed by GitHub
parent d84a7e423b
commit 351bac8b68
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -5,7 +5,7 @@ use crate::foundations::{
};
use crate::introspection::Locator;
use crate::layout::{
Abs, AlignElem, Axes, BlockElem, Fragment, Frame, Point, Regions, Size,
Abs, AlignElem, Axes, BlockElem, Frame, Point, Region, Regions, Size,
};
use crate::utils::Numeric;
@ -39,7 +39,7 @@ pub struct RepeatElem {
impl Show for Packed<RepeatElem> {
fn show(&self, _: &mut Engine, _: StyleChain) -> SourceResult<Content> {
Ok(BlockElem::multi_layouter(self.clone(), layout_repeat)
Ok(BlockElem::single_layouter(self.clone(), layout_repeat)
.pack()
.spanned(self.span()))
}
@ -52,20 +52,20 @@ fn layout_repeat(
engine: &mut Engine,
locator: Locator,
styles: StyleChain,
regions: Regions,
) -> SourceResult<Fragment> {
let pod = Regions::one(regions.size, Axes::new(false, false));
region: Region,
) -> SourceResult<Frame> {
let pod = Regions::one(region.size, Axes::new(false, false));
let piece = elem.body().layout(engine, locator, styles, pod)?.into_frame();
let align = AlignElem::alignment_in(styles).resolve(styles);
let fill = regions.size.x;
let fill = region.size.x;
let width = piece.width();
let count = (fill / width).floor();
let remaining = fill % width;
let apart = remaining / (count - 1.0);
let size = Size::new(regions.size.x, piece.height());
let size = Size::new(region.size.x, piece.height());
if !size.is_finite() {
bail!(elem.span(), "repeat with no size restrictions");
@ -88,5 +88,5 @@ fn layout_repeat(
}
}
Ok(Fragment::frame(frame))
Ok(frame)
}