Don't rebroadcast redundant slider messages

This commit is contained in:
Cory Forsstrom 2021-11-11 09:56:13 -08:00
parent f084ed8df1
commit 9a254a211b

View file

@ -144,9 +144,10 @@ where
} }
/// The local state of a [`Slider`]. /// The local state of a [`Slider`].
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] #[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct State { pub struct State {
is_dragging: bool, is_dragging: bool,
previous: Option<f64>,
} }
impl State { impl State {
@ -193,12 +194,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 +214,20 @@ 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 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::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 +255,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;