diff options
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget/slider.rs | 22 | 
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; | 
