From 655978f480c32bc696f0d5fe2fff834bfbf238ea Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 15 Sep 2019 18:53:13 +0200 Subject: Draft nodes for missing widgets --- web/src/widget/slider.rs | 55 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) (limited to 'web/src/widget/slider.rs') diff --git a/web/src/widget/slider.rs b/web/src/widget/slider.rs index 9c83befb..31bfcbf3 100644 --- a/web/src/widget/slider.rs +++ b/web/src/widget/slider.rs @@ -1,14 +1,61 @@ -use crate::{Element, Widget}; +use crate::{Bus, Element, Widget}; -pub use iced::slider::State; +use dodrio::bumpalo; pub type Slider<'a, Message> = iced::Slider<'a, Message>; -impl<'a, Message> Widget for Slider<'a, Message> {} +pub use iced::slider::State; + +impl<'a, Message> Widget for Slider<'a, Message> +where + Message: 'static + Copy, +{ + fn node<'b>( + &self, + bump: &'b bumpalo::Bump, + bus: &Bus, + ) -> dodrio::Node<'b> { + use dodrio::builder::*; + use wasm_bindgen::JsCast; + + let (start, end) = self.range.clone().into_inner(); + + let min = bumpalo::format!(in bump, "{}", start); + let max = bumpalo::format!(in bump, "{}", end); + let value = bumpalo::format!(in bump, "{}", self.value); + + let on_change = self.on_change.clone(); + let event_bus = bus.clone(); + + // TODO: Make `step` configurable + label(bump) + .children(vec![input(bump) + .attr("type", "range") + .attr("step", "0.01") + .attr("min", min.into_bump_str()) + .attr("max", max.into_bump_str()) + .attr("value", value.into_bump_str()) + .on("input", move |root, vdom, event| { + let slider = match event.target().and_then(|t| { + t.dyn_into::().ok() + }) { + None => return, + Some(slider) => slider, + }; + + if let Ok(value) = slider.value().parse::() { + event_bus.publish(on_change(value), root); + vdom.schedule_render(); + } + }) + .finish()]) + .finish() + } +} impl<'a, Message> From> for Element<'a, Message> where - Message: 'static, + Message: 'static + Copy, { fn from(slider: Slider<'a, Message>) -> Element<'a, Message> { Element::new(slider) -- cgit