initial attempt on repeating header height

- Faulty, as we have to update it when pushing new pending headers too
- Need to have a vector associating a height to each row...
This commit is contained in:
PgBiel 2025-04-05 01:45:50 -03:00
parent f21dc8b7e2
commit ecc93297f8
2 changed files with 19 additions and 0 deletions

View File

@ -80,6 +80,14 @@ pub struct GridLayouter<'a> {
/// header rows themselves are unbreakable, and unbreakable rows do not /// header rows themselves are unbreakable, and unbreakable rows do not
/// need to read this field at all. /// need to read this field at all.
pub(super) header_height: Abs, pub(super) header_height: Abs,
/// The height of effectively repeating headers, that is, ignoring
/// non-repeating pending headers.
///
/// This is used by multi-page auto rows so they can inform cell layout on
/// how much space should be taken by headers if they break across regions.
/// In particular, non-repeating headers only occupy the initial region,
/// but disappear on new regions, so they can be ignored.
pub(super) repeating_header_height: Abs,
/// The simulated footer height for this region. /// The simulated footer height for this region.
/// The simulation occurs before any rows are laid out for a region. /// The simulation occurs before any rows are laid out for a region.
pub(super) footer_height: Abs, pub(super) footer_height: Abs,
@ -152,6 +160,7 @@ impl<'a> GridLayouter<'a> {
upcoming_headers: &grid.headers, upcoming_headers: &grid.headers,
pending_headers: Default::default(), pending_headers: Default::default(),
header_height: Abs::zero(), header_height: Abs::zero(),
repeating_header_height: Abs::zero(),
footer_height: Abs::zero(), footer_height: Abs::zero(),
span, span,
} }
@ -1587,6 +1596,9 @@ impl<'a> GridLayouter<'a> {
if !last { if !last {
self.current_header_rows = 0; self.current_header_rows = 0;
self.header_height = Abs::zero();
self.repeating_header_height = Abs::zero();
let disambiguator = self.finished.len(); let disambiguator = self.finished.len();
if let Some(Repeatable::Repeated(footer)) = &self.grid.footer { if let Some(Repeatable::Repeated(footer)) = &self.grid.footer {
self.prepare_footer(footer, engine, disambiguator)?; self.prepare_footer(footer, engine, disambiguator)?;

View File

@ -224,6 +224,7 @@ impl<'a> GridLayouter<'a> {
// Reset the header height for this region. // Reset the header height for this region.
// It will be re-calculated when laying out each header row. // It will be re-calculated when laying out each header row.
self.header_height = Abs::zero(); self.header_height = Abs::zero();
self.repeating_header_height = Abs::zero();
if let Some(Repeatable::Repeated(footer)) = &self.grid.footer { if let Some(Repeatable::Repeated(footer)) = &self.grid.footer {
if skipped_region { if skipped_region {
@ -276,10 +277,16 @@ impl<'a> GridLayouter<'a> {
i += 1; i += 1;
} }
// All rows so far were repeating headers at the top of the region.
self.repeating_header_height = self.header_height;
for header in self.pending_headers { for header in self.pending_headers {
let header_height = self.header_height;
for y in header.unwrap().range() { for y in header.unwrap().range() {
self.layout_row(y, engine, disambiguator)?; self.layout_row(y, engine, disambiguator)?;
} }
if matches!(header, Repeatable::Repeated(_)) {
self.repeating_header_height += self.header_height - header_height;
}
} }
} }