Skip to content

Commit

Permalink
Remove tooltips on scroll wheel events (zed-industries#10069)
Browse files Browse the repository at this point in the history
This fixes zed-industries#9928 by invalidating the tooltip on mouse scroll.

I think _ideally_ we'd have a solution that only invalidates it if,
after mouse scroll, we're not hovering over the element. But I tried
that (by essentially duplicating the code for `MouseMoveEvent` but that
lead to some inconsistencies. I think we don't redraw when we finish
scrolling.

This now behaves exactly like tooltips in Chrome: invalidate on scroll,
move mouse again to trigger the tooltip.

It also behaves like the hover tooltips in the editor.


https://github.com/zed-industries/zed/assets/1185253/05b9170e-414c-4453-84e5-90510b943c15


Release Notes:

- N/A
  • Loading branch information
mrnugget authored Apr 2, 2024
1 parent 84cca62 commit ad03a7e
Showing 1 changed file with 50 additions and 40 deletions.
90 changes: 50 additions & 40 deletions crates/gpui/src/elements/div.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1814,53 +1814,63 @@ impl Interactivity {
.pending_mouse_down
.get_or_insert_with(Default::default)
.clone();
let hitbox = hitbox.clone();

cx.on_mouse_event(move |_: &MouseMoveEvent, phase, cx| {
let is_hovered = pending_mouse_down.borrow().is_none() && hitbox.is_hovered(cx);
if !is_hovered {
active_tooltip.borrow_mut().take();
return;
}
cx.on_mouse_event({
let active_tooltip = active_tooltip.clone();
let hitbox = hitbox.clone();
move |_: &MouseMoveEvent, phase, cx| {
let is_hovered =
pending_mouse_down.borrow().is_none() && hitbox.is_hovered(cx);
if !is_hovered {
active_tooltip.borrow_mut().take();
return;
}

if phase != DispatchPhase::Bubble {
return;
}
if phase != DispatchPhase::Bubble {
return;
}

if active_tooltip.borrow().is_none() {
let task = cx.spawn({
let active_tooltip = active_tooltip.clone();
let tooltip_builder = tooltip_builder.clone();

move |mut cx| async move {
cx.background_executor().timer(TOOLTIP_DELAY).await;
cx.update(|cx| {
active_tooltip.borrow_mut().replace(ActiveTooltip {
tooltip: Some(AnyTooltip {
view: tooltip_builder(cx),
cursor_offset: cx.mouse_position(),
}),
_task: None,
});
cx.refresh();
})
.ok();
}
});
active_tooltip.borrow_mut().replace(ActiveTooltip {
tooltip: None,
_task: Some(task),
});
if active_tooltip.borrow().is_none() {
let task = cx.spawn({
let active_tooltip = active_tooltip.clone();
let tooltip_builder = tooltip_builder.clone();

move |mut cx| async move {
cx.background_executor().timer(TOOLTIP_DELAY).await;
cx.update(|cx| {
active_tooltip.borrow_mut().replace(ActiveTooltip {
tooltip: Some(AnyTooltip {
view: tooltip_builder(cx),
cursor_offset: cx.mouse_position(),
}),
_task: None,
});
cx.refresh();
})
.ok();
}
});
active_tooltip.borrow_mut().replace(ActiveTooltip {
tooltip: None,
_task: Some(task),
});
}
}
});

let active_tooltip = element_state
.active_tooltip
.get_or_insert_with(Default::default)
.clone();
cx.on_mouse_event(move |_: &MouseDownEvent, _, _| {
active_tooltip.borrow_mut().take();
cx.on_mouse_event({
let active_tooltip = active_tooltip.clone();
move |_: &MouseDownEvent, _, _| {
active_tooltip.borrow_mut().take();
}
});

cx.on_mouse_event({
let active_tooltip = active_tooltip.clone();
move |_: &ScrollWheelEvent, _, _| {
active_tooltip.borrow_mut().take();
}
})
}

let active_state = element_state
Expand Down

0 comments on commit ad03a7e

Please sign in to comment.