@@ -31,6 +31,7 @@ const KNOB_STROKE_WIDTH: f64 = 2.0;
3131pub struct Slider {
3232 min : f64 ,
3333 max : f64 ,
34+ step : Option < f64 > ,
3435 knob_pos : Point ,
3536 knob_hovered : bool ,
3637 x_offset : f64 ,
@@ -42,6 +43,7 @@ impl Slider {
4243 Slider {
4344 min : 0. ,
4445 max : 1. ,
46+ step : None ,
4547 knob_pos : Default :: default ( ) ,
4648 knob_hovered : Default :: default ( ) ,
4749 x_offset : Default :: default ( ) ,
@@ -56,6 +58,23 @@ impl Slider {
5658 self . max = max;
5759 self
5860 }
61+
62+ /// Builder-style method to set the stepping.
63+ ///
64+ /// The default step size is `0.0` (smooth).
65+ pub fn with_step ( mut self , step : f64 ) -> Self {
66+ if step < 0.0 {
67+ tracing:: warn!( "Bad slider step: {}" , step) ;
68+ return self ;
69+ }
70+ self . step = if step == 0.0 {
71+ // a stepping value of 0.0 would yield an infinite amount of steps
72+ None
73+ } else {
74+ Some ( step)
75+ } ;
76+ self
77+ }
5978}
6079
6180impl Slider {
@@ -68,7 +87,13 @@ impl Slider {
6887 let scalar = ( ( mouse_x + self . x_offset - knob_width / 2. ) / ( slider_width - knob_width) )
6988 . max ( 0.0 )
7089 . min ( 1.0 ) ;
71- self . min + scalar * ( self . max - self . min )
90+ let mut value = self . min + scalar * ( self . max - self . min ) ;
91+ if let Some ( stepping) = self . step {
92+ let steps = ( self . max / stepping) . round ( ) ;
93+ let step = ( value * steps) . round ( ) ;
94+ value = step / steps;
95+ }
96+ value
7297 }
7398
7499 fn normalize ( & self , data : f64 ) -> f64 {
0 commit comments