From 62c71d004a8e6188d9dfc64aaa0479457d3bbae9 Mon Sep 17 00:00:00 2001 From: MarekSpodBiedry <73122968+MarekSpodBiedry@users.noreply.github.com> Date: Thu, 22 Oct 2026 21:03:00 +0200 Subject: [PATCH 1/2] Align towards/away from spine on parent-page folios by page side (#1577) --- crates/compose/src/lib.rs | 10 +++++++--- crates/compose/src/tests.rs | 13 +++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/crates/compose/src/lib.rs b/crates/compose/src/lib.rs index 89ea89bd..959f5da3 100644 --- a/crates/compose/src/lib.rs +++ b/crates/compose/src/lib.rs @@ -679,10 +679,14 @@ pub fn frame_specs(doc: &Document, sid: StoryId) -> Vec { let abs = doc.first_page_of_spread(si) + pi; (Some(doc.page_name(abs)), Some(abs), sp.pages.get(pi).is_some_and(|p| p.side == designcraft_doc::PageSide::Left)) } - (Some(designcraft_doc::SpreadRef::Parent(pi)), Some(sp)) => { + (Some(designcraft_doc::SpreadRef::Parent(_)), Some(sp)) => { let prefix = sp.parent.as_ref().map(|p| p.prefix.clone()).unwrap_or_else(|| "A".into()); - let _ = pi; - (Some(prefix), None, false) + // The side of the parent page under the frame, so a folio there aligns to the spine of its own page. + let left = sp + .page_at_x(item.bounds().center().x) + .and_then(|pi| sp.pages.get(pi)) + .is_some_and(|p| p.side == designcraft_doc::PageSide::Left); + (Some(prefix), None, left) } _ => (None, None, false), }; diff --git a/crates/compose/src/tests.rs b/crates/compose/src/tests.rs index 15c412ad..d210a442 100644 --- a/crates/compose/src/tests.rs +++ b/crates/compose/src/tests.rs @@ -7310,3 +7310,16 @@ fn rule_above_offset_is_measured_from_the_baseline() { assert!((rule.height() - 1.5).abs() < 1e-6); assert!(rule.y0 > first.baseline, "the rule stays below the row above: {rule:?}, its baseline {}", first.baseline); } + +#[test] +fn parent_page_frames_know_which_side_of_the_spine_they_are_on() { + // Folios on a facing-pages parent: towards/away from spine must differ between its left and right page. + let mut d = Document::new(&NewDocument::default()); + let lid = d.default_layer(); + let w = d.parents[0].pages[0].width; + let para = ParaFormat { para: ParaAttrs { align: Some(Align::TowardsSpine), ..Default::default() }, ..Default::default() }; + let (_, left_story) = d.add_text_frame(SpreadRef::Parent(0), Rect::new(36.0, 700.0, w - 36.0, 730.0), lid, "7", para.clone()).unwrap(); + let (_, right_story) = d.add_text_frame(SpreadRef::Parent(0), Rect::new(w + 36.0, 700.0, 2.0 * w - 36.0, 730.0), lid, "8", para).unwrap(); + assert!(frame_specs(&d, left_story)[0].left_page); + assert!(!frame_specs(&d, right_story)[0].left_page); +} From c0daace4415bd08a1942cad01903d887bb1c8a5a Mon Sep 17 00:00:00 2001 From: MarekSpodBiedry <73122968+MarekSpodBiedry@users.noreply.github.com> Date: Fri, 23 Oct 2026 16:08:36 +0200 Subject: [PATCH 2/2] Lay out the parent-page side lookup so rustfmt passes (#1577) --- crates/compose/src/lib.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/crates/compose/src/lib.rs b/crates/compose/src/lib.rs index 959f5da3..e95ebd4b 100644 --- a/crates/compose/src/lib.rs +++ b/crates/compose/src/lib.rs @@ -682,10 +682,8 @@ pub fn frame_specs(doc: &Document, sid: StoryId) -> Vec { (Some(designcraft_doc::SpreadRef::Parent(_)), Some(sp)) => { let prefix = sp.parent.as_ref().map(|p| p.prefix.clone()).unwrap_or_else(|| "A".into()); // The side of the parent page under the frame, so a folio there aligns to the spine of its own page. - let left = sp - .page_at_x(item.bounds().center().x) - .and_then(|pi| sp.pages.get(pi)) - .is_some_and(|p| p.side == designcraft_doc::PageSide::Left); + let under = sp.page_at_x(item.bounds().center().x).and_then(|pi| sp.pages.get(pi)); + let left = under.is_some_and(|p| p.side == designcraft_doc::PageSide::Left); (Some(prefix), None, left) } _ => (None, None, false),