diff options
| author | 2021-11-11 09:56:13 -0800 | |
|---|---|---|
| committer | 2021-11-11 10:32:37 -0800 | |
| commit | 9a254a211b60ede11a92e62197e922493a108fcc (patch) | |
| tree | 9e3008bda1baacd3d18ca130f9a9389b6a1859e5 /native/src/widget | |
| parent | f084ed8df154a7f3b0386cfb7e13307f6a6290d0 (diff) | |
| download | iced-9a254a211b60ede11a92e62197e922493a108fcc.tar.gz iced-9a254a211b60ede11a92e62197e922493a108fcc.tar.bz2 iced-9a254a211b60ede11a92e62197e922493a108fcc.zip | |
Don't rebroadcast redundant slider messages
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget/slider.rs | 29 | 
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; | 
