diff options
| author | 2023-04-12 23:22:09 +0200 | |
|---|---|---|
| committer | 2023-04-12 23:22:09 +0200 | |
| commit | 3dc76ca94853fdee8611c00ceebfe82a758c5a7b (patch) | |
| tree | 4709b7859ecd79863df2ce9273894895aa0cfc21 /native | |
| parent | adb70d232ac00b3cba459374b3b1c5359970030f (diff) | |
| parent | 4125c034f5c512365c6ef73678dc0801db79b249 (diff) | |
| download | iced-3dc76ca94853fdee8611c00ceebfe82a758c5a7b.tar.gz iced-3dc76ca94853fdee8611c00ceebfe82a758c5a7b.tar.bz2 iced-3dc76ca94853fdee8611c00ceebfe82a758c5a7b.zip  | |
Merge pull request #1788 from tarkah/optimization/scrollable-publish
Don't publish redundant `on_scroll` offsets
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget/scrollable.rs | 22 | 
1 files changed, 20 insertions, 2 deletions
diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index d9cdf296..c0590b1e 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -895,7 +895,7 @@ pub fn draw<Renderer>(  }  fn notify_on_scroll<Message>( -    state: &State, +    state: &mut State,      on_scroll: &Option<Box<dyn Fn(RelativeOffset) -> Message + '_>>,      bounds: Rectangle,      content_bounds: Rectangle, @@ -916,7 +916,23 @@ fn notify_on_scroll<Message>(              .absolute(bounds.height, content_bounds.height)              / (content_bounds.height - bounds.height); -        shell.publish(on_scroll(RelativeOffset { x, y })) +        let new_offset = RelativeOffset { x, y }; + +        // Don't publish redundant offsets to shell +        if let Some(prev_offset) = state.last_notified { +            let unchanged = |a: f32, b: f32| { +                (a - b).abs() <= f32::EPSILON || (a.is_nan() && b.is_nan()) +            }; + +            if unchanged(prev_offset.x, new_offset.x) +                && unchanged(prev_offset.y, new_offset.y) +            { +                return; +            } +        } + +        shell.publish(on_scroll(new_offset)); +        state.last_notified = Some(new_offset);      }  } @@ -929,6 +945,7 @@ pub struct State {      offset_x: Offset,      x_scroller_grabbed_at: Option<f32>,      keyboard_modifiers: keyboard::Modifiers, +    last_notified: Option<RelativeOffset>,  }  impl Default for State { @@ -940,6 +957,7 @@ impl Default for State {              offset_x: Offset::Absolute(0.0),              x_scroller_grabbed_at: None,              keyboard_modifiers: keyboard::Modifiers::default(), +            last_notified: None,          }      }  }  | 
