From 0e75ca8603afaaf3c4b78d2ebd516614162c0fca Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 2 Jan 2025 21:45:47 +0200 Subject: [PATCH] Fix tooltips too eager to disappear when there's a gap between the tooltip source and the tooltip itself (#22583) Follow-up of https://github.com/zed-industries/zed/pull/22548 Release Notes: - N/A Co-authored-by: Peter Tripp --- crates/gpui/src/window.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 86c2232279642805b5cf401f914a5555595aab8a..4c144ff61fb778f4fe0715c16d51d018d6e5436d 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -1557,19 +1557,6 @@ impl<'a> WindowContext<'a> { let tooltip_size = element.layout_as_root(AvailableSpace::min_size(), self); let mut tooltip_bounds = Bounds::new(mouse_position + point(px(1.), px(1.)), tooltip_size); - // Element's parent can get hidden (e.g. via the `visible_on_hover` method), - // and element's `paint` won't be called (ergo, mouse listeners also won't be active) to detect that the tooltip has to be removed. - // Ensure it's not stuck around in such cases. - let invalidate_tooltip = !tooltip_request - .tooltip - .origin_bounds - .contains(&self.mouse_position()) - && (!tooltip_request.tooltip.hoverable - || !tooltip_bounds.contains(&self.mouse_position())); - if invalidate_tooltip { - return None; - } - let window_bounds = Bounds { origin: Point::default(), size: self.viewport_size(), @@ -1599,6 +1586,19 @@ impl<'a> WindowContext<'a> { } } + // Element's parent can get hidden (e.g. via the `visible_on_hover` method), + // and element's `paint` won't be called (ergo, mouse listeners also won't be active) to detect that the tooltip has to be removed. + // Ensure it's not stuck around in such cases. + let invalidate_tooltip = !tooltip_request + .tooltip + .origin_bounds + .contains(&self.mouse_position()) + && (!tooltip_request.tooltip.hoverable + || !tooltip_bounds.contains(&self.mouse_position())); + if invalidate_tooltip { + return None; + } + self.with_absolute_element_offset(tooltip_bounds.origin, |cx| element.prepaint(cx)); self.window.tooltip_bounds = Some(TooltipBounds {