summaryrefslogtreecommitdiffstats
path: root/native
diff options
context:
space:
mode:
authorLibravatar Cory Forsstrom <cforsstrom18@gmail.com>2023-04-12 10:32:35 -0700
committerLibravatar Cory Forsstrom <cforsstrom18@gmail.com>2023-04-12 14:08:05 -0700
commitee32af2606e7c24cbe9e1c221af0ed1a2c44be50 (patch)
treef80f093b70a15cae1399a5a59442090fb3e81935 /native
parent5a056ce0510343621305474af74ade1db028c01a (diff)
downloadiced-ee32af2606e7c24cbe9e1c221af0ed1a2c44be50.tar.gz
iced-ee32af2606e7c24cbe9e1c221af0ed1a2c44be50.tar.bz2
iced-ee32af2606e7c24cbe9e1c221af0ed1a2c44be50.zip
Don't publish redundant on_scroll offsets
Diffstat (limited to '')
-rw-r--r--native/src/widget/scrollable.rs20
1 files changed, 18 insertions, 2 deletions
diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs
index d9cdf296..23fa20f4 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,21 @@ 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;
+
+ 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 +943,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 +955,7 @@ impl Default for State {
offset_x: Offset::Absolute(0.0),
x_scroller_grabbed_at: None,
keyboard_modifiers: keyboard::Modifiers::default(),
+ last_notified: None,
}
}
}