Merge pull request #1114 from tarkah/fix/slider-optimization

Don't rebroadcast redundant slider messages
This commit is contained in:
Héctor Ramón 2021-11-16 16:00:31 +07:00 committed by GitHub
commit d165b789df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -193,12 +193,14 @@ where
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
) -> event::Status { ) -> event::Status {
let is_dragging = self.state.is_dragging;
let mut change = || { let mut change = || {
let bounds = layout.bounds(); let bounds = layout.bounds();
if cursor_position.x <= bounds.x { let new_value = if cursor_position.x <= bounds.x {
messages.push((self.on_change)(*self.range.start())); *self.range.start()
} else if cursor_position.x >= bounds.x + bounds.width { } else if cursor_position.x >= bounds.x + bounds.width {
messages.push((self.on_change)(*self.range.end())); *self.range.end()
} else { } else {
let step = self.step.into(); let step = self.step.into();
let start = (*self.range.start()).into(); let start = (*self.range.start()).into();
@ -211,8 +213,16 @@ where
let value = steps * step + start; let value = steps * step + start;
if let Some(value) = T::from_f64(value) { 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::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left))
| Event::Touch(touch::Event::FingerLifted { .. }) | Event::Touch(touch::Event::FingerLifted { .. })
| Event::Touch(touch::Event::FingerLost { .. }) => { | Event::Touch(touch::Event::FingerLost { .. }) => {
if self.state.is_dragging { if is_dragging {
if let Some(on_release) = self.on_release.clone() { if let Some(on_release) = self.on_release.clone() {
messages.push(on_release); messages.push(on_release);
} }
@ -240,7 +250,7 @@ where
} }
Event::Mouse(mouse::Event::CursorMoved { .. }) Event::Mouse(mouse::Event::CursorMoved { .. })
| Event::Touch(touch::Event::FingerMoved { .. }) => { | Event::Touch(touch::Event::FingerMoved { .. }) => {
if self.state.is_dragging { if is_dragging {
change(); change();
return event::Status::Captured; return event::Status::Captured;