Integration: #870 the page menu always offers Delete Page for the clicked page, Delete Spread separately for multi-page spreads

(cherry picked from commit 9912a386a84baaf91f426482d7b9d88d3cd9994a)
This commit is contained in:
aiongg authored and moppeeer committed 2026-10-14 09:43:18 +02:00
1 parent 02ddeb86da
commit 1758642a96
1 file changed
+33 -8
+33 -8
View File
@@ -292,9 +292,13 @@ fn page_menu(app: &mut DesignApp, ui: &mut egui::Ui, doc: &designcraft_doc::Docu
let _ = app.run("layout.pages.duplicateSpread", json!({"spread": si, "atEnd": true}));
ui.close();
}
if item(ui, if pages_in_spread > 1 { "Delete Spread" } else { "Delete Page" }) {
if item(ui, "Delete Page") {
let _ = app.run("layout.pages.delete", json!({"pages": [abs]}));
ui.close();
}
if pages_in_spread > 1 && item(ui, "Delete Spread") {
let first = doc.first_page_of_spread(si);
let _ = app.run("layout.pages.delete", json!({"pages": (first..first + pages_in_spread).collect::<Vec<_>>()}));
let _ = app.run("layout.pages.delete", json!({"pages": (first..first.saturating_add(pages_in_spread)).collect::<Vec<_>>()}));
ui.close();
}
ui.separator();
@@ -401,12 +405,10 @@ mod tests {
h.run_steps(3);
}
#[test]
fn the_panel_menu_follows_indesigns_order() {
let mut app = DesignApp::new(designcraft_engine::Session::new(), crate::Services::default());
app.run("file.new", json!({"pages": 2, "facingPages": false})).unwrap();
/// The page menu for page `abs` of spread `si`.
fn menu_harness(app: DesignApp, abs: usize, si: usize) -> Harness<'static, DesignApp> {
let mut h = Harness::builder().with_size(vec2(320.0, 600.0)).build_ui_state(
|ui, app: &mut DesignApp| {
move |ui, app: &mut DesignApp| {
let key = egui::Id::new("test_fonts");
if ui.data(|d| d.get_temp::<bool>(key)).is_none() {
crate::theme::install_fonts(ui.ctx(), "");
@@ -414,11 +416,34 @@ mod tests {
return;
}
let doc = app.session.doc().unwrap().doc.clone();
page_menu(app, ui, &doc, 0, 0);
page_menu(app, ui, &doc, abs, si);
},
app,
);
h.run_steps(3);
h
}
#[test]
fn a_page_in_a_spread_offers_delete_page_and_delete_spread() {
let mut app = DesignApp::new(designcraft_engine::Session::new(), crate::Services::default());
app.run("file.new", json!({"pages": 5, "facingPages": true})).unwrap();
let doc = app.session.doc().unwrap().doc.clone();
let (si, _) = doc.page_loc(2).unwrap();
assert_eq!(doc.spreads[si].pages.len(), 2);
let mut h = menu_harness(app, 2, si);
let _ = h.get_by_label("Delete Spread");
h.get_by_label("Delete Page").click();
h.run_steps(3);
assert_eq!(h.state().session.doc().unwrap().doc.page_count(), 4, "only the clicked page");
}
#[test]
fn the_panel_menu_follows_indesigns_order() {
let mut app = DesignApp::new(designcraft_engine::Session::new(), crate::Services::default());
app.run("file.new", json!({"pages": 2, "facingPages": false})).unwrap();
let mut h = menu_harness(app, 0, 0);
assert!(h.query_by_label("Delete Spread").is_none(), "a single-page spread has no Delete Spread");
// InDesign's items, top to bottom.
let ys: Vec<f32> = ["Insert Pages…", "Move Pages…", "Duplicate Spread", "Duplicate Spread at End of Document", "Delete Page", "New Parent…"]
.iter()