use stdweb::{Reference, JsSerialize}; use stdweb::web::TextNode; use stdweb::traits::{IElement, IHtmlElement, INode}; use stdweb::unstable::TryInto; use dom::{Dom, IStyle, Dynamic}; use callbacks::Callbacks; use signals::signal::Signal; use signals::signal_vec::SignalVec; use operations; pub trait IntoDynamic where Self: Sized { fn dynamic(self) -> Dynamic; } impl IntoDynamic for A { #[inline] fn dynamic(self) -> Dynamic { Dynamic(self) } } // TODO if I change these traits to inherit from Signal, and I implement Signal for &str / bool, then I might be able to avoid using Dynamic pub trait Text { fn into_dom(self) -> Dom; } pub trait Property { fn set_property + Clone + 'static>(self, element: &A, callbacks: &mut Callbacks, name: &str); } pub trait Attribute { fn set_attribute(self, element: &A, callbacks: &mut Callbacks, name: &str, namespace: Option<&str>); } pub trait Style { fn set_style(self, element: &A, callbacks: &mut Callbacks, name: &str, important: bool); } pub trait Class { fn toggle_class(self, element: &A, callbacks: &mut Callbacks, name: &str); } pub trait Focused { fn toggle_focused(self, element: &A, callbacks: &mut Callbacks); } pub trait Children { fn insert_children(self, element: &A, callbacks: &mut Callbacks); } impl<'a> Text for &'a str { #[inline] fn into_dom(self) -> Dom { Dom::new(js!( return document.createTextNode(@{self}); ).try_into().unwrap()) } } impl<'a> Text for String { #[inline] fn into_dom(self) -> Dom { self.as_str().into_dom() } } impl<'a, A: JsSerialize> Property for A { #[inline] fn set_property>(self, element: &B, _callbacks: &mut Callbacks, name: &str) { operations::set_property_str(element, name, &self) } } impl<'a> Attribute for &'a str { #[inline] fn set_attribute(self, element: &A, _callbacks: &mut Callbacks, name: &str, namespace: Option<&str>) { operations::set_attribute_str(element, name, self, namespace) } } impl<'a> Style for &'a str { #[inline] fn set_style(self, element: &A, _callbacks: &mut Callbacks, name: &str, important: bool) { operations::set_style_str(element, name, self, important) } } impl Class for bool { #[inline] fn toggle_class(self, element: &A, _callbacks: &mut Callbacks, name: &str) { operations::toggle_class_bool(element, name, self) } } impl Focused for bool { #[inline] fn toggle_focused(self, element: &A, callbacks: &mut Callbacks) { operations::set_focused_bool(element, callbacks, self) } } // TODO figure out how to make this owned rather than &mut impl<'a, A: IntoIterator> Children for A { #[inline] fn insert_children(self, element: &B, callbacks: &mut Callbacks) { operations::insert_children_iter(element, callbacks, self) } } impl + 'static> Text for Dynamic { // TODO should this inline ? fn into_dom(self) -> Dom { let element: TextNode = js!( return document.createTextNode(""); ).try_into().unwrap(); let mut callbacks = Callbacks::new(); operations::set_text_signal(&element, &mut callbacks, self.0); Dom { element: element.into(), callbacks: callbacks, } } } impl + 'static, B: JsSerialize> Property for Dynamic { #[inline] fn set_property + Clone + 'static>(self, element: &C, callbacks: &mut Callbacks, name: &str) { operations::set_property_signal(element, callbacks, name, self.0) } } impl> + 'static> Attribute for Dynamic { #[inline] fn set_attribute(self, element: &B, callbacks: &mut Callbacks, name: &str, namespace: Option<&str>) { operations::set_attribute_signal(element, callbacks, name, self.0, namespace) } } impl> + 'static> Style for Dynamic { #[inline] fn set_style(self, element: &B, callbacks: &mut Callbacks, name: &str, important: bool) { operations::set_style_signal(element, callbacks, name, self.0, important) } } impl + 'static> Class for Dynamic { #[inline] fn toggle_class(self, element: &B, callbacks: &mut Callbacks, name: &str) { operations::toggle_class_signal(element, callbacks, name, self.0) } } impl + 'static> Focused for Dynamic { #[inline] fn toggle_focused(self, element: &B, callbacks: &mut Callbacks) { operations::set_focused_signal(element, callbacks, self.0) } } /*impl Children for Dynamic where A: IntoIterator, B: Signal + 'static { #[inline] fn insert_children(self, element: &C, callbacks: &mut Callbacks) { operations::insert_children_signal(element, callbacks, self.0) } }*/ impl Children for Dynamic where A: SignalVec + 'static { #[inline] fn insert_children(self, element: &C, callbacks: &mut Callbacks) { operations::insert_children_signal_vec(element, callbacks, self.0) } }