diff options
author | 2020-06-08 02:07:45 -0700 | |
---|---|---|
committer | 2020-06-08 11:07:45 +0200 | |
commit | 4960a8827e46cafca672ed7c4550086a9c6029bc (patch) | |
tree | c6509fe1d414af1520f4c5cb741e92caa4c3c44d /native | |
parent | 40750d9b36286056508e340ad14ac77c432366ee (diff) | |
download | iced-4960a8827e46cafca672ed7c4550086a9c6029bc.tar.gz iced-4960a8827e46cafca672ed7c4550086a9c6029bc.tar.bz2 iced-4960a8827e46cafca672ed7c4550086a9c6029bc.zip |
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
Diffstat (limited to 'native')
-rw-r--r-- | native/src/widget/slider.rs | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index 8cdfc3de..753a49fe 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -40,6 +40,7 @@ pub struct Slider<'a, Message, Renderer: self::Renderer> { range: RangeInclusive<f32>, value: f32, on_change: Box<dyn Fn(f32) -> Message>, + on_release: Option<Message>, width: Length, style: Renderer::Style, } @@ -71,11 +72,25 @@ impl<'a, Message, Renderer: self::Renderer> Slider<'a, Message, Renderer> { value: value.max(*range.start()).min(*range.end()), range, on_change: Box::new(on_change), + on_release: None, width: Length::Fill, style: Renderer::Style::default(), } } + /// Sets the release message of the [`Slider`]. + /// This is called when the mouse is released from the slider. + /// + /// Typically, the user's interaction with the slider is finished when this message is produced. + /// This is useful if you need to spawn a long-running task from the slider's result, where + /// the default on_change message could create too many events. + /// + /// [`Slider`]: struct.Slider.html + pub fn on_release(mut self, on_release: Message) -> Self { + self.on_release = Some(on_release); + self + } + /// Sets the width of the [`Slider`]. /// /// [`Slider`]: struct.Slider.html @@ -114,6 +129,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> for Slider<'a, Message, Renderer> where Renderer: self::Renderer, + Message: Clone, { fn width(&self) -> Length { self.width @@ -171,7 +187,12 @@ where } } mouse::Event::ButtonReleased(mouse::Button::Left) => { - self.state.is_dragging = false; + if self.state.is_dragging { + if let Some(on_release) = self.on_release.clone() { + messages.push(on_release); + } + self.state.is_dragging = false; + } } mouse::Event::CursorMoved { .. } => { if self.state.is_dragging { @@ -252,7 +273,7 @@ impl<'a, Message, Renderer> From<Slider<'a, Message, Renderer>> for Element<'a, Message, Renderer> where Renderer: 'a + self::Renderer, - Message: 'a, + Message: 'a + Clone, { fn from( slider: Slider<'a, Message, Renderer>, |