Skip to content

Commit 4960a88

Browse files
Add on_release message to Slider (#378)
* Add on_finish callback to Slider * Fix formatting * Rename Slider's on_finish to on_release, make the message simply an event without data * Satisfy Clone impl requirement on Message in integration test * Only call on_release after dragging a slider
1 parent 40750d9 commit 4960a88

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

examples/integration/src/controls.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub struct Controls {
99
sliders: [slider::State; 3],
1010
}
1111

12-
#[derive(Debug)]
12+
#[derive(Debug, Clone)]
1313
pub enum Message {
1414
BackgroundColorChanged(Color),
1515
}

native/src/widget/slider.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub struct Slider<'a, Message, Renderer: self::Renderer> {
4040
range: RangeInclusive<f32>,
4141
value: f32,
4242
on_change: Box<dyn Fn(f32) -> Message>,
43+
on_release: Option<Message>,
4344
width: Length,
4445
style: Renderer::Style,
4546
}
@@ -71,11 +72,25 @@ impl<'a, Message, Renderer: self::Renderer> Slider<'a, Message, Renderer> {
7172
value: value.max(*range.start()).min(*range.end()),
7273
range,
7374
on_change: Box::new(on_change),
75+
on_release: None,
7476
width: Length::Fill,
7577
style: Renderer::Style::default(),
7678
}
7779
}
7880

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+
7994
/// Sets the width of the [`Slider`].
8095
///
8196
/// [`Slider`]: struct.Slider.html
@@ -114,6 +129,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
114129
for Slider<'a, Message, Renderer>
115130
where
116131
Renderer: self::Renderer,
132+
Message: Clone,
117133
{
118134
fn width(&self) -> Length {
119135
self.width
@@ -171,7 +187,12 @@ where
171187
}
172188
}
173189
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+
}
175196
}
176197
mouse::Event::CursorMoved { .. } => {
177198
if self.state.is_dragging {
@@ -252,7 +273,7 @@ impl<'a, Message, Renderer> From<Slider<'a, Message, Renderer>>
252273
for Element<'a, Message, Renderer>
253274
where
254275
Renderer: 'a + self::Renderer,
255-
Message: 'a,
276+
Message: 'a + Clone,
256277
{
257278
fn from(
258279
slider: Slider<'a, Message, Renderer>,

0 commit comments

Comments
 (0)