Skip to content

Commit f0d9e54

Browse files
committed
improve handling of integers
- fix zoom and scroll behavior - round instead of floor when casting float to int
1 parent a31617c commit f0d9e54

File tree

1 file changed

+20
-21
lines changed

1 file changed

+20
-21
lines changed

src/double_slider.rs

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl<'a, T: Numeric> DoubleSlider<'a, T> {
4747
separation_distance: T::from_f64(75.0),
4848
control_point_radius: 7.0,
4949
inverted_highlighting: false,
50-
scroll_factor: 0.01,
50+
scroll_factor: if T::INTEGRAL { 0.04 } else { 0.01 },
5151
zoom_factor: 10.0,
5252
width: 100.0,
5353
cursor_fill: Color32::DARK_GRAY,
@@ -145,7 +145,7 @@ impl<'a, T: Numeric> DoubleSlider<'a, T> {
145145
let slider_width = (self.width - 2.0 * offset) as f64;
146146
let ratio = (x - offset) as f64 / slider_width;
147147

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)
149149
}
150150

151151
fn left_slider_f64(&self) -> f64 {
@@ -163,6 +163,11 @@ impl<'a, T: Numeric> DoubleSlider<'a, T> {
163163
fn range_f64(&self) -> RangeInclusive<f64> {
164164
self.range.start().to_f64()..=self.range.end().to_f64()
165165
}
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+
}
166171
}
167172

168173
impl<'a, T: Numeric> Widget for DoubleSlider<'a, T> {
@@ -246,13 +251,13 @@ impl<'a, T: Numeric> Widget for DoubleSlider<'a, T> {
246251
// handle logic
247252
if self.right_slider_f64() < self.left_slider_f64() + self.separation_distance_f64() {
248253
*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());
250255
}
251-
*self.right_slider = T::from_f64(
256+
*self.right_slider = self.f64_to_val(
252257
self.right_slider_f64()
253258
.clamp(*range_f64.start(), *range_f64.end()),
254259
);
255-
*self.left_slider = T::from_f64(
260+
*self.left_slider = self.f64_to_val(
256261
self.left_slider_f64()
257262
.clamp(*range_f64.start(), *range_f64.end()),
258263
);
@@ -279,13 +284,13 @@ impl<'a, T: Numeric> Widget for DoubleSlider<'a, T> {
279284
// handle logic
280285
if self.left_slider_f64() > self.right_slider_f64() - self.separation_distance_f64() {
281286
*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());
283288
}
284-
*self.right_slider = T::from_f64(
289+
*self.right_slider = self.f64_to_val(
285290
self.right_slider_f64()
286291
.clamp(*range_f64.start(), *range_f64.end()),
287292
);
288-
*self.left_slider = T::from_f64(
293+
*self.left_slider = self.f64_to_val(
289294
self.left_slider_f64()
290295
.clamp(*range_f64.start(), *range_f64.end()),
291296
);
@@ -382,21 +387,15 @@ impl<'a, T: Numeric> Widget for DoubleSlider<'a, T> {
382387
// scroll through time axis
383388
if zoom_response.hovered() {
384389
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);
393394

394395
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);
400399
}
401400

402401
response

0 commit comments

Comments
 (0)