Ignore redraws of invisible content in hover widget

This commit is contained in:
Héctor Ramón Jiménez 2025-02-03 04:34:13 +01:00
parent 599d8b560b
commit 3029481b72
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
2 changed files with 23 additions and 3 deletions

View file

@ -80,6 +80,18 @@ impl<'a, Message> Shell<'a, Message> {
self.redraw_request
}
/// Replaces the redraw request of the [`Shell`]; without conflict resolution.
///
/// This is useful if you want to overwrite the redraw request to a previous value.
/// Since it's a fairly advanced use case and should rarely be used, it is a static
/// method.
pub fn replace_redraw_request(
shell: &mut Self,
redraw_request: Option<window::RedrawRequest>,
) {
shell.redraw_request = redraw_request;
}
/// Returns whether the current layout is invalid or not.
pub fn is_layout_invalid(&self) -> bool {
self.is_layout_invalid

View file

@ -871,16 +871,19 @@ where
shell.request_redraw();
}
let is_visible =
is_hovered || self.is_top_focused || self.is_top_overlay_active;
if matches!(
event,
Event::Mouse(
mouse::Event::CursorMoved { .. }
| mouse::Event::ButtonReleased(_)
)
) || is_hovered
|| self.is_top_focused
|| self.is_top_overlay_active
) || is_visible
{
let redraw_request = shell.redraw_request();
self.top.as_widget_mut().update(
top_tree,
event.clone(),
@ -891,6 +894,11 @@ where
shell,
viewport,
);
// Ignore redraw requests of invisible content
if !is_visible {
Shell::replace_redraw_request(shell, redraw_request);
}
};
if shell.is_event_captured() {