From 50f8c0d42bdc5d2524619209caf10087b2c215ae Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 14 Oct 2026 22:16:10 +0200 Subject: [PATCH 1/2] Fix font dropdown resizing and keyboard navigation --- crates/ui-egui/src/ribbon.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/crates/ui-egui/src/ribbon.rs b/crates/ui-egui/src/ribbon.rs index 9c6d89eeb..5a05397ab 100644 --- a/crates/ui-egui/src/ribbon.rs +++ b/crates/ui-egui/src/ribbon.rs @@ -439,6 +439,7 @@ pub(crate) fn editable_combo( let filtered: Vec = items.iter().enumerate().filter(|(_, (_, d))| d.to_lowercase().contains(&lower)).map(|(i, _)| i).collect(); if !filtered.is_empty() { let n = filtered.len() as i32; + st.sel = st.sel.clamp(0, n - 1); if down { st.sel = (st.sel + 1).rem_euclid(n); } @@ -458,15 +459,27 @@ pub(crate) fn editable_combo( } } ui.separator(); - egui::ScrollArea::vertical().max_height(240.0).show(ui, |ui| { - for i in &filtered { + let row_h = 20.0 + ui.spacing().item_spacing.y; + let content_h = filtered.len() as f32 * row_h + 4.0; + let desired_h = content_h.min(240.0); + ui.set_min_height(desired_h); + + egui::ScrollArea::vertical().max_height(desired_h).show(ui, |ui| { + for (pos, i) in filtered.iter().enumerate() { let (value, disp) = &items[*i]; - let row = ui.add(egui::Button::selectable(*i as i32 == st.sel, egui::RichText::new(disp)).min_size(vec2(220.0, 20.0))); + + let row = ui.add(egui::Button::selectable(pos as i32 == st.sel, egui::RichText::new(disp)).min_size(vec2(220.0, 20.0))); + + if (down || up) && pos as i32 == st.sel { + row.scroll_to_me(None); + } + if row.clicked() { result = ComboResult::Picked(value.to_string()); } + if row.hovered() { - st.sel = *i as i32; + st.sel = pos as i32; } } }); From f9802ecc9ddf339486051ed23c746db232ddf44a Mon Sep 17 00:00:00 2001 From: Mario Date: Thu, 15 Oct 2026 01:15:15 +0200 Subject: [PATCH 2/2] Improved font dropdown row sizing and scroll alignment --- crates/ui-egui/src/ribbon.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/crates/ui-egui/src/ribbon.rs b/crates/ui-egui/src/ribbon.rs index 5a05397ab..1b275f7fd 100644 --- a/crates/ui-egui/src/ribbon.rs +++ b/crates/ui-egui/src/ribbon.rs @@ -459,9 +459,18 @@ pub(crate) fn editable_combo( } } ui.separator(); - let row_h = 20.0 + ui.spacing().item_spacing.y; - let content_h = filtered.len() as f32 * row_h + 4.0; - let desired_h = content_h.min(240.0); + + let button_h = ui.spacing().interact_size.y.max(20.0); + let spacing = ui.spacing().item_spacing.y; + let n = filtered.len() as f32; + + let content_h = n * button_h + (n - 1.0).max(0.0) * spacing; + + let max_rows = 9.0_f32; + let max_h = max_rows * button_h + (max_rows - 1.0) * spacing; + + let desired_h = content_h.min(max_h); + ui.set_min_height(desired_h); egui::ScrollArea::vertical().max_height(desired_h).show(ui, |ui| { @@ -470,8 +479,8 @@ pub(crate) fn editable_combo( let row = ui.add(egui::Button::selectable(pos as i32 == st.sel, egui::RichText::new(disp)).min_size(vec2(220.0, 20.0))); - if (down || up) && pos as i32 == st.sel { - row.scroll_to_me(None); + if (down || up) && pos as i32 == st.sel && !ui.clip_rect().contains_rect(row.rect) { + row.scroll_to_me(Some(if down { egui::Align::Max } else { egui::Align::Min })); } if row.clicked() {