@@ -193,12 +193,14 @@ where
193
193
_clipboard : & mut dyn Clipboard ,
194
194
messages : & mut Vec < Message > ,
195
195
) -> event:: Status {
196
+ let is_dragging = self . state . is_dragging ;
197
+
196
198
let mut change = || {
197
199
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 ( )
200
202
} else if cursor_position. x >= bounds. x + bounds. width {
201
- messages . push ( ( self . on_change ) ( * self . range . end ( ) ) ) ;
203
+ * self . range . end ( )
202
204
} else {
203
205
let step = self . step . into ( ) ;
204
206
let start = ( * self . range . start ( ) ) . into ( ) ;
@@ -211,8 +213,16 @@ where
211
213
let value = steps * step + start;
212
214
213
215
if let Some ( value) = T :: from_f64 ( value) {
214
- messages. push ( ( self . on_change ) ( value) ) ;
216
+ value
217
+ } else {
218
+ return ;
215
219
}
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;
216
226
}
217
227
} ;
218
228
@@ -229,7 +239,7 @@ where
229
239
Event :: Mouse ( mouse:: Event :: ButtonReleased ( mouse:: Button :: Left ) )
230
240
| Event :: Touch ( touch:: Event :: FingerLifted { .. } )
231
241
| Event :: Touch ( touch:: Event :: FingerLost { .. } ) => {
232
- if self . state . is_dragging {
242
+ if is_dragging {
233
243
if let Some ( on_release) = self . on_release . clone ( ) {
234
244
messages. push ( on_release) ;
235
245
}
@@ -240,7 +250,7 @@ where
240
250
}
241
251
Event :: Mouse ( mouse:: Event :: CursorMoved { .. } )
242
252
| Event :: Touch ( touch:: Event :: FingerMoved { .. } ) => {
243
- if self . state . is_dragging {
253
+ if is_dragging {
244
254
change ( ) ;
245
255
246
256
return event:: Status :: Captured ;
0 commit comments