fix(statusbar): cycling-list hover highlight on row re-entry

Row exit now clears the preview only when the highlight still points at
that row. Moving between rows can fire on_enter before the previous
row's on_exit, so the unconditional clear wiped a freshly highlighted
row (notably when returning to the first row). Guarding the clear fixes
the highlight not reappearing.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Opus 4.8 committed 2026-06-05 00:05:15 +03:00
1 parent a9228b9021
commit bb54cd034f
3 files changed
+13 -1

No files matched your search

+3
View File
@@ -769,6 +769,9 @@ pub enum Message {
CycleSelect(acadrust::Handle),
/// Preview (highlight) a cycling-list row's object, or clear with `None`.
CycleHover(Option<acadrust::Handle>),
/// 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.
+9
View File
@@ -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);
+1 -1
View File
@@ -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()
}