summaryrefslogtreecommitdiffstats
path: root/web/src/widget/slider.rs
diff options
context:
space:
mode:
Diffstat (limited to 'web/src/widget/slider.rs')
-rw-r--r--web/src/widget/slider.rs59
1 files changed, 57 insertions, 2 deletions
diff --git a/web/src/widget/slider.rs b/web/src/widget/slider.rs
index 54b2fdf6..acdef0a1 100644
--- a/web/src/widget/slider.rs
+++ b/web/src/widget/slider.rs
@@ -1,8 +1,55 @@
-use crate::{Bus, Element, Widget};
+use crate::{Bus, Element, Length, Widget};
use dodrio::bumpalo;
+use std::{ops::RangeInclusive, rc::Rc};
-pub use iced_core::slider::*;
+pub struct Slider<'a, Message> {
+ _state: &'a mut State,
+ range: RangeInclusive<f32>,
+ value: f32,
+ on_change: Rc<Box<dyn Fn(f32) -> Message>>,
+ width: Length,
+}
+
+impl<'a, Message> Slider<'a, Message> {
+ /// Creates a new [`Slider`].
+ ///
+ /// It expects:
+ /// * the local [`State`] of the [`Slider`]
+ /// * an inclusive range of possible values
+ /// * the current value of the [`Slider`]
+ /// * a function that will be called when the [`Slider`] is dragged.
+ /// It receives the new value of the [`Slider`] and must produce a
+ /// `Message`.
+ ///
+ /// [`Slider`]: struct.Slider.html
+ /// [`State`]: struct.State.html
+ pub fn new<F>(
+ state: &'a mut State,
+ range: RangeInclusive<f32>,
+ value: f32,
+ on_change: F,
+ ) -> Self
+ where
+ F: 'static + Fn(f32) -> Message,
+ {
+ Slider {
+ _state: state,
+ value: value.max(*range.start()).min(*range.end()),
+ range,
+ on_change: Rc::new(Box::new(on_change)),
+ width: Length::Fill,
+ }
+ }
+
+ /// Sets the width of the [`Slider`].
+ ///
+ /// [`Slider`]: struct.Slider.html
+ pub fn width(mut self, width: Length) -> Self {
+ self.width = width;
+ self
+ }
+}
impl<'a, Message> Widget<Message> for Slider<'a, Message>
where
@@ -60,3 +107,11 @@ where
Element::new(slider)
}
}
+
+pub struct State;
+
+impl State {
+ pub fn new() -> Self {
+ Self
+ }
+}