From eb19c360d6c41ec00c7003baf99fc7c42b7e487e Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 10 Dec 2025 21:52:11 -0800 Subject: [PATCH] fix(mouse_area): update hover state on scroll events Hover state was only recalculated on CursorMoved events, causing items to remain highlighted after scrolling away from them. Now hover checks also run on WheelScrolled events and viewport changes, ensuring on_enter/on_exit fire correctly when content moves under the cursor. --- src/mouse_area.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mouse_area.rs b/src/mouse_area.rs index ba009af..978861d 100644 --- a/src/mouse_area.rs +++ b/src/mouse_area.rs @@ -527,14 +527,24 @@ fn update( let offset = layout.virtual_offset(); let layout_bounds = layout.bounds(); + let viewport_changed = state.viewport.map_or(true, |v| v != *viewport); + if let Some(message) = widget.on_resize.as_ref() { - if state.viewport != Some(*viewport) { - state.viewport = Some(*viewport); + if viewport_changed { shell.publish(message(*viewport)); } } - if let Event::Mouse(mouse::Event::CursorMoved { position }) = event { + state.viewport = Some(*viewport); + + let should_check_hover = viewport_changed + || matches!( + event, + Event::Mouse(mouse::Event::CursorMoved { .. }) + | Event::Mouse(mouse::Event::WheelScrolled { .. }) + ); + + if should_check_hover { let position_in = cursor.position_in(layout_bounds); match (position_in, state.last_position) { (None, Some(_)) => { @@ -550,7 +560,9 @@ fn update( _ => {} } state.last_position = position_in; + } + if let Event::Mouse(mouse::Event::CursorMoved { position }) = event { let virtual_position = Point::new( viewport.x - layout_bounds.x + position.x, viewport.y - layout_bounds.y + position.y,