diff --git a/crates/ui-egui/src/panels/dialogs.rs b/crates/ui-egui/src/panels/dialogs.rs index 4ef9015f3..b5f8096d8 100644 --- a/crates/ui-egui/src/panels/dialogs.rs +++ b/crates/ui-egui/src/panels/dialogs.rs @@ -787,8 +787,9 @@ pub fn show(app: &mut LightcraftApp, ctx: &egui::Context) { ui.add_space(6.0); ui.label(egui::RichText::new(crate::i18n::tr("Keywords (⌥1–⌥9)")).color(t.text_dim)); slots.resize(9, String::new()); - let w = ((ui.available_width() - 8.0) / 3.0).floor().max(60.0); - egui::Grid::new("keyword-set-slots").num_columns(3).spacing([4.0, 4.0]).show(ui, |ui| { + // equal columns of a set width (the window is still finding its own) + let w = 130.0; + egui::Grid::new("keyword-set-slots").num_columns(3).min_col_width(w).spacing([6.0, 4.0]).show(ui, |ui| { for (i, slot) in slots.iter_mut().enumerate() { let r = crate::text_field::TextField::singleline(&format!("field:keywordSetSlot:{}", i + 1), slot) .hint(format!("⌥{}", i + 1)) diff --git a/crates/ui-egui/src/tests_keyword_set.rs b/crates/ui-egui/src/tests_keyword_set.rs index d0d699955..f62bf65ea 100644 --- a/crates/ui-egui/src/tests_keyword_set.rs +++ b/crates/ui-egui/src/tests_keyword_set.rs @@ -97,3 +97,17 @@ fn an_empty_slot_is_an_idle_button() { h.settle(SETTLE); assert!(h.app.widgets.iter().any(|(w, _)| w == "kwSetEmpty:2"), "slot 2 is shown empty"); } + +/// The nine fields are alike and wide enough for a keyword: a grid of equal columns, not one sized +/// by what the window had room for while it found its size. +#[test] +fn the_slots_are_alike() { + let mut h = keywords_panel(); + open_editor(&mut h); + let slots: Vec = + (1..=9).map(|i| h.app.widgets.iter().find(|(w, _)| *w == format!("field:keywordSetSlot:{i}")).map(|(_, r)| *r).expect("slot")).collect(); + for r in &slots { + assert!(r.width() >= 100.0, "{r:?}"); + assert!((r.width() - slots[0].width()).abs() < 1.0, "{r:?} vs {:?}", slots[0]); + } +}