summaryrefslogtreecommitdiffstats
path: root/native
diff options
context:
space:
mode:
authorLibravatar Cory Forsstrom <cory.forsstrom@lich.io>2021-11-11 09:56:13 -0800
committerLibravatar Cory Forsstrom <cory.forsstrom@lich.io>2021-11-11 10:32:37 -0800
commit9a254a211b60ede11a92e62197e922493a108fcc (patch)
tree9e3008bda1baacd3d18ca130f9a9389b6a1859e5 /native
parentf084ed8df154a7f3b0386cfb7e13307f6a6290d0 (diff)
downloadiced-9a254a211b60ede11a92e62197e922493a108fcc.tar.gz
iced-9a254a211b60ede11a92e62197e922493a108fcc.tar.bz2
iced-9a254a211b60ede11a92e62197e922493a108fcc.zip
Don't rebroadcast redundant slider messages
Diffstat (limited to 'native')
-rw-r--r--native/src/widget/slider.rs29
1 files changed, 22 insertions, 7 deletions
diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs
index 49bafab4..ef9dea01 100644
--- a/native/src/widget/slider.rs
+++ b/native/src/widget/slider.rs
@@ -144,9 +144,10 @@ where
}
/// The local state of a [`Slider`].
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
+#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct State {
is_dragging: bool,
+ previous: Option<f64>,
}
impl State {
@@ -193,12 +194,14 @@ where
_clipboard: &mut dyn Clipboard,
messages: &mut Vec<Message>,
) -> event::Status {
+ let is_dragging = self.state.is_dragging;
+
let mut change = || {
let bounds = layout.bounds();
- if cursor_position.x <= bounds.x {
- messages.push((self.on_change)(*self.range.start()));
+ let new_value = if cursor_position.x <= bounds.x {
+ *self.range.start()
} else if cursor_position.x >= bounds.x + bounds.width {
- messages.push((self.on_change)(*self.range.end()));
+ *self.range.end()
} else {
let step = self.step.into();
let start = (*self.range.start()).into();
@@ -211,8 +214,20 @@ where
let value = steps * step + start;
if let Some(value) = T::from_f64(value) {
- messages.push((self.on_change)(value));
+ value
+ } else {
+ return;
+ }
+ };
+
+ if let Some(previous) = self.state.previous {
+ if (new_value.into() - previous).abs() > f64::EPSILON {
+ messages.push((self.on_change)(new_value));
+ self.state.previous = Some(new_value.into());
}
+ } else {
+ messages.push((self.on_change)(new_value));
+ self.state.previous = Some(new_value.into());
}
};
@@ -229,7 +244,7 @@ where
Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left))
| Event::Touch(touch::Event::FingerLifted { .. })
| Event::Touch(touch::Event::FingerLost { .. }) => {
- if self.state.is_dragging {
+ if is_dragging {
if let Some(on_release) = self.on_release.clone() {
messages.push(on_release);
}
@@ -240,7 +255,7 @@ where
}
Event::Mouse(mouse::Event::CursorMoved { .. })
| Event::Touch(touch::Event::FingerMoved { .. }) => {
- if self.state.is_dragging {
+ if is_dragging {
change();
return event::Status::Captured;