diff options
author | 2021-11-16 16:00:31 +0700 | |
---|---|---|
committer | 2021-11-16 16:00:31 +0700 | |
commit | d165b789df603e3b93cc9f92184afa6aa6aaf64b (patch) | |
tree | ddacbb70d18e04dbeedb5577e5378731c3af947c /native | |
parent | 27bc2b90867c3c846934c888322ae9d4804296e4 (diff) | |
parent | 1ce02e8c7aa7dae2122e3577788d04f2638b3a84 (diff) | |
download | iced-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.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; |