forked from 1b-agent/opencadstudio-upstream
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 <noreply@anthropic.com>
This commit is contained in:
1 parent
a9228b9021
commit
bb54cd034f
3 files changed
+13
-1
No files matched your search
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user