From 9a254a211b60ede11a92e62197e922493a108fcc Mon Sep 17 00:00:00 2001 From: Cory Forsstrom Date: Thu, 11 Nov 2021 09:56:13 -0800 Subject: Don't rebroadcast redundant slider messages --- native/src/widget/slider.rs | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'native') 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, } impl State { @@ -193,12 +194,14 @@ where _clipboard: &mut dyn Clipboard, messages: &mut Vec, ) -> 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; -- cgit From 94d62bca9ac651888a42b7f878e4afb97688ad47 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 15 Nov 2021 15:30:53 +0700 Subject: Use `value` in `Slider` to store the `previous` value --- native/src/widget/slider.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'native') diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index ef9dea01..7a3e8071 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -147,7 +147,6 @@ where #[derive(Debug, Clone, Copy, PartialEq, Default)] pub struct State { is_dragging: bool, - previous: Option, } impl State { @@ -220,14 +219,10 @@ where } }; - 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 { + if (self.value.into() - new_value.into()).abs() > f64::EPSILON { messages.push((self.on_change)(new_value)); - self.state.previous = Some(new_value.into()); + + self.value = new_value; } }; -- cgit From 1ce02e8c7aa7dae2122e3577788d04f2638b3a84 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 15 Nov 2021 15:33:02 +0700 Subject: Derive `Eq` for `slider::State` again --- native/src/widget/slider.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'native') diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index 7a3e8071..3ce53f6c 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -144,7 +144,7 @@ where } /// The local state of a [`Slider`]. -#[derive(Debug, Clone, Copy, PartialEq, Default)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub struct State { is_dragging: bool, } -- cgit