From 5fd1ca4220629b961b5f088d4d4aaf857573a3a8 Mon Sep 17 00:00:00 2001 From: Hojjat Date: Tue, 4 Aug 2026 13:58:23 -0600 Subject: [PATCH] fix: request redraw in menus --- src/widget/dropdown/menu/mod.rs | 6 ++++-- src/widget/dropdown/multi/menu.rs | 2 ++ src/widget/menu/menu_bar.rs | 1 + src/widget/menu/menu_inner.rs | 8 +++++++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/widget/dropdown/menu/mod.rs b/src/widget/dropdown/menu/mod.rs index 0c96c1c6..f18016d8 100644 --- a/src/widget/dropdown/menu/mod.rs +++ b/src/widget/dropdown/menu/mod.rs @@ -499,8 +499,10 @@ where let new_hovered_option = (cursor_position.y / option_height) as usize; let mut hovered_guard = self.hovered_option.lock().unwrap(); - if let Some(on_option_hovered) = self.on_option_hovered { - if *hovered_guard != Some(new_hovered_option) { + if *hovered_guard != Some(new_hovered_option) { + shell.request_redraw(); + + if let Some(on_option_hovered) = self.on_option_hovered { shell.publish(on_option_hovered(new_hovered_option)); } } diff --git a/src/widget/dropdown/multi/menu.rs b/src/widget/dropdown/multi/menu.rs index 0a761097..689fb0de 100644 --- a/src/widget/dropdown/multi/menu.rs +++ b/src/widget/dropdown/multi/menu.rs @@ -382,6 +382,8 @@ where if previous_hover_option.as_ref() == Some(item) { previous_hover_option } else { + shell.request_redraw(); + if let Some(on_option_hovered) = self.on_option_hovered { shell.publish(on_option_hovered(item.clone())); } diff --git a/src/widget/menu/menu_bar.rs b/src/widget/menu/menu_bar.rs index 84927b67..71a39c42 100644 --- a/src/widget/menu/menu_bar.rs +++ b/src/widget/menu/menu_bar.rs @@ -656,6 +656,7 @@ where Mouse(mouse::Event::CursorMoved { .. } | mouse::Event::CursorEntered) if open && view_cursor.is_over(layout.bounds()) => { + shell.request_redraw(); shell.capture_event(); #[cfg(wayland_platform)] if matches!(WINDOWING_SYSTEM.get(), Some(WindowingSystem::Wayland)) { diff --git a/src/widget/menu/menu_inner.rs b/src/widget/menu/menu_inner.rs index 25bbfa7b..58721124 100644 --- a/src/widget/menu/menu_inner.rs +++ b/src/widget/menu/menu_inner.rs @@ -1502,7 +1502,9 @@ where // cursor is outside { - last_menu_state.index = None; + if last_menu_state.index.take().is_some() { + shell.request_redraw(); + } shell.capture_event(); return new_menu_root; } @@ -1561,6 +1563,10 @@ where // set new index let old_index = last_menu_state.index.replace(new_index); + if old_index != Some(new_index) { + shell.request_redraw(); + } + // get new active item // * add new menu if the new item is a menu if !item.children.is_empty() && old_index.is_none_or(|i| i != new_index) {