From 3029481b72a2ca975a9bb915e23c0461334ba54f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Mon, 3 Feb 2025 04:34:13 +0100 Subject: [PATCH] Ignore redraws of invisible content in `hover` widget --- core/src/shell.rs | 12 ++++++++++++ widget/src/helpers.rs | 14 +++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core/src/shell.rs b/core/src/shell.rs index 12ebbaa89a..c2275f71c9 100644 --- a/core/src/shell.rs +++ b/core/src/shell.rs @@ -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, + ) { + 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 diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 17cf94cc0d..199b8fc021 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -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() {