diff --git a/crates/ui-egui/src/ribbon.rs b/crates/ui-egui/src/ribbon.rs index c91c16e14..9308e8e75 100644 --- a/crates/ui-egui/src/ribbon.rs +++ b/crates/ui-egui/src/ribbon.rs @@ -994,7 +994,7 @@ fn design(app: &mut WordApp, ui: &mut Ui) { } fn layout(app: &mut WordApp, ui: &mut Ui) { - group(ui, "Page Setup", Some("ui.dialog"), app, |ui, app| { + group(ui, "Page Setup", Some("layout.pageSetup"), app, |ui, app| { // Text Direction works on what the caret is in: table cells, a text box, else the section. let dir = wordcraft_engine::cmd::page::text_direction_at(&app.session); menu_button(ui, app, "textDirection", Some("Text\nDirection"), "Text Direction", true, |ui, app| { @@ -2293,6 +2293,21 @@ mod tests { assert!(!contextual_tabs(&s).contains(&"Shape Format")); } + #[test] + fn page_setup_launcher_opens_the_dialog() { + // A group launcher runs its command with no parameters (#471). + let mut app = crate::WordApp::new(Session::new(wordcraft_doc::Document::new()), crate::Services::default()); + app.run("layout.pageSetup", json!({})).unwrap(); + assert!(matches!(app.dialog, Some(crate::dialogs::Dialog::PageSetup { .. }))); + // `ui.dialog` needs a dialog name, so it can't be a launcher. + let launchers: Vec<&str> = include_str!("ribbon.rs") + .split("group(ui, \"") + .filter_map(|g| g.split_once('"')?.1.strip_prefix(", Some(\"")?.split('"').next()) + .collect(); + assert!(launchers.contains(&"layout.pageSetup"), "{launchers:?}"); + assert!(!launchers.contains(&"ui.dialog"), "{launchers:?}"); + } + #[test] fn smart_art_picker_inserts_and_design_tab_follows_the_selection() { let mut app = crate::WordApp::new(Session::new(wordcraft_doc::Document::new()), Default::default());