summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;