Skip to content

Commit d165b78

Browse files
authored
Merge pull request #1114 from tarkah/fix/slider-optimization
Don't rebroadcast redundant slider messages
2 parents 27bc2b9 + 1ce02e8 commit d165b78

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

native/src/widget/slider.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,12 +193,14 @@ where
193193
_clipboard: &mut dyn Clipboard,
194194
messages: &mut Vec<Message>,
195195
) -> event::Status {
196+
let is_dragging = self.state.is_dragging;
197+
196198
let mut change = || {
197199
let bounds = layout.bounds();
198-
if cursor_position.x <= bounds.x {
199-
messages.push((self.on_change)(*self.range.start()));
200+
let new_value = if cursor_position.x <= bounds.x {
201+
*self.range.start()
200202
} else if cursor_position.x >= bounds.x + bounds.width {
201-
messages.push((self.on_change)(*self.range.end()));
203+
*self.range.end()
202204
} else {
203205
let step = self.step.into();
204206
let start = (*self.range.start()).into();
@@ -211,8 +213,16 @@ where
211213
let value = steps * step + start;
212214

213215
if let Some(value) = T::from_f64(value) {
214-
messages.push((self.on_change)(value));
216+
value
217+
} else {
218+
return;
215219
}
220+
};
221+
222+
if (self.value.into() - new_value.into()).abs() > f64::EPSILON {
223+
messages.push((self.on_change)(new_value));
224+
225+
self.value = new_value;
216226
}
217227
};
218228

@@ -229,7 +239,7 @@ where
229239
Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left))
230240
| Event::Touch(touch::Event::FingerLifted { .. })
231241
| Event::Touch(touch::Event::FingerLost { .. }) => {
232-
if self.state.is_dragging {
242+
if is_dragging {
233243
if let Some(on_release) = self.on_release.clone() {
234244
messages.push(on_release);
235245
}
@@ -240,7 +250,7 @@ where
240250
}
241251
Event::Mouse(mouse::Event::CursorMoved { .. })
242252
| Event::Touch(touch::Event::FingerMoved { .. }) => {
243-
if self.state.is_dragging {
253+
if is_dragging {
244254
change();
245255

246256
return event::Status::Captured;

0 commit comments

Comments
 (0)