summaryrefslogtreecommitdiffstats
path: root/native
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2021-11-16 16:00:31 +0700
committerLibravatar GitHub <noreply@github.com>2021-11-16 16:00:31 +0700
commitd165b789df603e3b93cc9f92184afa6aa6aaf64b (patch)
treeddacbb70d18e04dbeedb5577e5378731c3af947c /native
parent27bc2b90867c3c846934c888322ae9d4804296e4 (diff)
parent1ce02e8c7aa7dae2122e3577788d04f2638b3a84 (diff)
downloadiced-d165b789df603e3b93cc9f92184afa6aa6aaf64b.tar.gz
iced-d165b789df603e3b93cc9f92184afa6aa6aaf64b.tar.bz2
iced-d165b789df603e3b93cc9f92184afa6aa6aaf64b.zip
Merge pull request #1114 from tarkah/fix/slider-optimization
Don't rebroadcast redundant slider messages
Diffstat (limited to 'native')
-rw-r--r--native/src/widget/slider.rs22
1 files changed, 16 insertions, 6 deletions
diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs
index 49bafab4..3ce53f6c 100644
--- a/native/src/widget/slider.rs
+++ b/native/src/widget/slider.rs
@@ -193,12 +193,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 +213,16 @@ where
let value = steps * step + start;
if let Some(value) = T::from_f64(value) {
- messages.push((self.on_change)(value));
+ value
+ } else {
+ return;
}
+ };
+
+ if (self.value.into() - new_value.into()).abs() > f64::EPSILON {
+ messages.push((self.on_change)(new_value));
+
+ self.value = new_value;
}
};
@@ -229,7 +239,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 +250,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;