@@ -40,6 +40,7 @@ pub struct Slider<'a, Message, Renderer: self::Renderer> {
40
40
range : RangeInclusive < f32 > ,
41
41
value : f32 ,
42
42
on_change : Box < dyn Fn ( f32 ) -> Message > ,
43
+ on_release : Option < Message > ,
43
44
width : Length ,
44
45
style : Renderer :: Style ,
45
46
}
@@ -71,11 +72,25 @@ impl<'a, Message, Renderer: self::Renderer> Slider<'a, Message, Renderer> {
71
72
value : value. max ( * range. start ( ) ) . min ( * range. end ( ) ) ,
72
73
range,
73
74
on_change : Box :: new ( on_change) ,
75
+ on_release : None ,
74
76
width : Length :: Fill ,
75
77
style : Renderer :: Style :: default ( ) ,
76
78
}
77
79
}
78
80
81
+ /// Sets the release message of the [`Slider`].
82
+ /// This is called when the mouse is released from the slider.
83
+ ///
84
+ /// Typically, the user's interaction with the slider is finished when this message is produced.
85
+ /// This is useful if you need to spawn a long-running task from the slider's result, where
86
+ /// the default on_change message could create too many events.
87
+ ///
88
+ /// [`Slider`]: struct.Slider.html
89
+ pub fn on_release ( mut self , on_release : Message ) -> Self {
90
+ self . on_release = Some ( on_release) ;
91
+ self
92
+ }
93
+
79
94
/// Sets the width of the [`Slider`].
80
95
///
81
96
/// [`Slider`]: struct.Slider.html
@@ -114,6 +129,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
114
129
for Slider < ' a , Message , Renderer >
115
130
where
116
131
Renderer : self :: Renderer ,
132
+ Message : Clone ,
117
133
{
118
134
fn width ( & self ) -> Length {
119
135
self . width
@@ -171,7 +187,12 @@ where
171
187
}
172
188
}
173
189
mouse:: Event :: ButtonReleased ( mouse:: Button :: Left ) => {
174
- self . state . is_dragging = false ;
190
+ if self . state . is_dragging {
191
+ if let Some ( on_release) = self . on_release . clone ( ) {
192
+ messages. push ( on_release) ;
193
+ }
194
+ self . state . is_dragging = false ;
195
+ }
175
196
}
176
197
mouse:: Event :: CursorMoved { .. } => {
177
198
if self . state . is_dragging {
@@ -252,7 +273,7 @@ impl<'a, Message, Renderer> From<Slider<'a, Message, Renderer>>
252
273
for Element < ' a , Message , Renderer >
253
274
where
254
275
Renderer : ' a + self :: Renderer ,
255
- Message : ' a ,
276
+ Message : ' a + Clone ,
256
277
{
257
278
fn from (
258
279
slider : Slider < ' a , Message , Renderer > ,
0 commit comments