@@ -47,7 +47,7 @@ impl<'a, T: Numeric> DoubleSlider<'a, T> {
47
47
separation_distance : T :: from_f64 ( 75.0 ) ,
48
48
control_point_radius : 7.0 ,
49
49
inverted_highlighting : false ,
50
- scroll_factor : 0.01 ,
50
+ scroll_factor : if T :: INTEGRAL { 0.04 } else { 0.01 } ,
51
51
zoom_factor : 10.0 ,
52
52
width : 100.0 ,
53
53
cursor_fill : Color32 :: DARK_GRAY ,
@@ -145,7 +145,7 @@ impl<'a, T: Numeric> DoubleSlider<'a, T> {
145
145
let slider_width = ( self . width - 2.0 * offset) as f64 ;
146
146
let ratio = ( x - offset) as f64 / slider_width;
147
147
148
- T :: from_f64 ( range_f64. start ( ) + ( * range_f64. end ( ) - * range_f64. start ( ) ) * ratio)
148
+ self . f64_to_val ( range_f64. start ( ) + ( * range_f64. end ( ) - * range_f64. start ( ) ) * ratio)
149
149
}
150
150
151
151
fn left_slider_f64 ( & self ) -> f64 {
@@ -163,6 +163,11 @@ impl<'a, T: Numeric> DoubleSlider<'a, T> {
163
163
fn range_f64 ( & self ) -> RangeInclusive < f64 > {
164
164
self . range . start ( ) . to_f64 ( ) ..=self . range . end ( ) . to_f64 ( )
165
165
}
166
+
167
+ // Rounds decimal values when casting to integers (instead of truncating like a native float-to-int cast)
168
+ fn f64_to_val ( & self , float : f64 ) -> T {
169
+ T :: from_f64 ( if T :: INTEGRAL { float. round ( ) } else { float } )
170
+ }
166
171
}
167
172
168
173
impl < ' a , T : Numeric > Widget for DoubleSlider < ' a , T > {
@@ -246,13 +251,13 @@ impl<'a, T: Numeric> Widget for DoubleSlider<'a, T> {
246
251
// handle logic
247
252
if self . right_slider_f64 ( ) < self . left_slider_f64 ( ) + self . separation_distance_f64 ( ) {
248
253
* self . right_slider =
249
- T :: from_f64 ( self . left_slider_f64 ( ) + self . separation_distance_f64 ( ) ) ;
254
+ self . f64_to_val ( self . left_slider_f64 ( ) + self . separation_distance_f64 ( ) ) ;
250
255
}
251
- * self . right_slider = T :: from_f64 (
256
+ * self . right_slider = self . f64_to_val (
252
257
self . right_slider_f64 ( )
253
258
. clamp ( * range_f64. start ( ) , * range_f64. end ( ) ) ,
254
259
) ;
255
- * self . left_slider = T :: from_f64 (
260
+ * self . left_slider = self . f64_to_val (
256
261
self . left_slider_f64 ( )
257
262
. clamp ( * range_f64. start ( ) , * range_f64. end ( ) ) ,
258
263
) ;
@@ -279,13 +284,13 @@ impl<'a, T: Numeric> Widget for DoubleSlider<'a, T> {
279
284
// handle logic
280
285
if self . left_slider_f64 ( ) > self . right_slider_f64 ( ) - self . separation_distance_f64 ( ) {
281
286
* self . left_slider =
282
- T :: from_f64 ( self . right_slider_f64 ( ) - self . separation_distance_f64 ( ) ) ;
287
+ self . f64_to_val ( self . right_slider_f64 ( ) - self . separation_distance_f64 ( ) ) ;
283
288
}
284
- * self . right_slider = T :: from_f64 (
289
+ * self . right_slider = self . f64_to_val (
285
290
self . right_slider_f64 ( )
286
291
. clamp ( * range_f64. start ( ) , * range_f64. end ( ) ) ,
287
292
) ;
288
- * self . left_slider = T :: from_f64 (
293
+ * self . left_slider = self . f64_to_val (
289
294
self . left_slider_f64 ( )
290
295
. clamp ( * range_f64. start ( ) , * range_f64. end ( ) ) ,
291
296
) ;
@@ -382,21 +387,15 @@ impl<'a, T: Numeric> Widget for DoubleSlider<'a, T> {
382
387
// scroll through time axis
383
388
if zoom_response. hovered ( ) {
384
389
let scroll_delta = ui. ctx ( ) . input ( |i| i. smooth_scroll_delta ) ;
385
- * self . left_slider = T :: from_f64 (
386
- self . left_slider_f64 ( )
387
- + ( ( scroll_delta. x + scroll_delta. y ) * self . scroll_factor ) as f64 ,
388
- ) ;
389
- * self . right_slider = T :: from_f64 (
390
- self . right_slider_f64 ( )
391
- + ( ( scroll_delta. x + scroll_delta. y ) * self . scroll_factor ) as f64 ,
392
- ) ;
390
+ let value_delta_from_scroll =
391
+ ( ( scroll_delta. x + scroll_delta. y ) * self . scroll_factor ) as f64 ;
392
+ * self . left_slider = self . f64_to_val ( self . left_slider_f64 ( ) + value_delta_from_scroll) ;
393
+ * self . right_slider = self . f64_to_val ( self . right_slider_f64 ( ) + value_delta_from_scroll) ;
393
394
394
395
let zoom_delta = ui. ctx ( ) . input ( |i| i. zoom_delta ( ) - 1.0 ) ;
395
-
396
- * self . right_slider =
397
- T :: from_f64 ( self . right_slider_f64 ( ) + ( zoom_delta * self . zoom_factor ) as f64 ) ;
398
- * self . left_slider =
399
- T :: from_f64 ( self . left_slider_f64 ( ) - ( zoom_delta * self . zoom_factor ) as f64 ) ;
396
+ let value_delta_from_zoom = ( zoom_delta * self . zoom_factor ) as f64 ;
397
+ * self . right_slider = self . f64_to_val ( self . right_slider_f64 ( ) + value_delta_from_zoom) ;
398
+ * self . left_slider = self . f64_to_val ( self . left_slider_f64 ( ) - value_delta_from_zoom) ;
400
399
}
401
400
402
401
response
0 commit comments