diff --git a/src/app/mod.rs b/src/app/mod.rs index b7d4250b6..b8835456d 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -769,6 +769,9 @@ pub enum Message { CycleSelect(acadrust::Handle), /// Preview (highlight) a cycling-list row's object, or clear with `None`. CycleHover(Option), + /// Cursor left a cycling-list row; clear the preview only if it still + /// points at this row (guards against enter/exit event reordering). + CycleHoverExit(acadrust::Handle), /// Dismiss the selection-cycling list box without picking. CycleCancel, /// Toggle the selection-filter type picker open/closed. diff --git a/src/app/update.rs b/src/app/update.rs index e3ebb2615..a8bec8c37 100644 --- a/src/app/update.rs +++ b/src/app/update.rs @@ -3649,6 +3649,15 @@ impl OpenCADStudio { self.tabs[i].scene.set_hover_highlight(handle); Task::none() } + Message::CycleHoverExit(handle) => { + // Only clear if another row hasn't already taken the highlight; + // enter/exit can fire out of order when moving between rows. + let i = self.active_tab; + if self.tabs[i].scene.hover_highlight == Some(handle) { + self.tabs[i].scene.set_hover_highlight(None); + } + Task::none() + } Message::CycleCancel => { self.cycle_candidates = None; self.tabs[self.active_tab].scene.set_hover_highlight(None); diff --git a/src/ui/cycle_popup.rs b/src/ui/cycle_popup.rs index 7ed1ce598..2f0f0f273 100644 --- a/src/ui/cycle_popup.rs +++ b/src/ui/cycle_popup.rs @@ -59,7 +59,7 @@ fn item_row(handle: acadrust::Handle, label: String) -> Element<'static, Message // Highlight the underlying object while the cursor is over this row. mouse_area(btn) .on_enter(Message::CycleHover(Some(handle))) - .on_exit(Message::CycleHover(None)) + .on_exit(Message::CycleHoverExit(handle)) .into() }