diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index 4b4359dd..303a1520 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -363,7 +363,11 @@ impl Dialog { } "solid.pattern.rectangular" => Dialog::new( Kind::PatternRect { count: "3".into(), spacing: "20 mm".into(), count2: "1".into(), spacing2: "20 mm".into() }, - vec![SelInput::new("Objects", BODIES, true), SelInput::new("Direction", AXES, false), SelInput::new("Direction 2", AXES, false)], + vec![ + SelInput::new("Objects", BODIES, true), + SelInput::new("Direction", AXES | EDGES, false), + SelInput::new("Direction 2", AXES | EDGES, false), + ], ), "solid.pattern.circular" => Dialog::new( Kind::PatternCirc { count: "6".into(), angle: "360 deg".into() }, @@ -713,16 +717,30 @@ fn plane_value(s: &Session, sel: Option<&Sel>) -> Option { /// A value field; true when Enter was pressed in it. pub(crate) fn field(ui: &mut egui::Ui, s: &mut String) -> bool { let r = ui.text_edit_singleline(s); + publish_row(&r); crate::params_dialog::complete(ui, &r, s); r.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)) } pub(crate) fn combo(ui: &mut egui::Ui, id: &str, labels: &[&str], sel: &mut usize) { - egui::ComboBox::from_id_salt(id).selected_text(labels.get(*sel).copied().unwrap_or("")).width(FIELD_W).show_ui(ui, |ui| { + let row = ROW.with(|r| r.borrow().clone()); + let r = egui::ComboBox::from_id_salt(id).selected_text(labels.get(*sel).copied().unwrap_or("")).width(FIELD_W).show_ui(ui, |ui| { for (i, l) in labels.iter().enumerate() { - ui.selectable_value(sel, i, *l); + let item = ui.selectable_value(sel, i, *l); + crate::scenario::publish_handle(&format!("dialog:{row}:{l}"), item.rect.center()); } }); + publish_row(&r.response); +} + +thread_local! { + /// The label of the dialog row being laid out (its widgets publish `dialog: