From 3082edde666ad06cdf720c4f883dd884ff7337a1 Mon Sep 17 00:00:00 2001 From: Pauan Date: Thu, 24 May 2018 00:22:47 -1000 Subject: [PATCH] Adding in SVG support --- src/animation.rs | 12 ++---------- src/dom.rs | 11 ++++++++++- src/macros.rs | 44 ++++++++++++++++++++++++++++++-------------- 3 files changed, 42 insertions(+), 25 deletions(-) diff --git a/src/animation.rs b/src/animation.rs index 0ddd698..1e66d1a 100644 --- a/src/animation.rs +++ b/src/animation.rs @@ -461,13 +461,6 @@ impl Percentage { } } -impl Into for Percentage { - #[inline] - fn into(self) -> f64 { - self.0 - } -} - #[inline] fn range_inclusive(percentage: f64, low: f64, high: f64) -> f64 { low + (percentage * (high - low)) @@ -540,8 +533,8 @@ impl MutableAnimation { fn start_animating(&self, lock: &mut MutableAnimationState) { if lock.playing { // TODO use Copy constraint to make value.get() faster ? - let start: f64 = self.inner.value.get().into(); - let end: f64 = lock.end.into(); + let start: f64 = self.inner.value.get().into_f64(); + let end: f64 = lock.end.into_f64(); if start != end { if lock.duration > 0.0 { @@ -660,7 +653,6 @@ impl MutableAnimation { pub mod easing { use super::Percentage; - // TODO should this use map rather than map_unchecked ? #[inline] pub fn powi(p: Percentage, n: i32) -> Percentage { diff --git a/src/dom.rs b/src/dom.rs index c50d30c..70f482d 100644 --- a/src/dom.rs +++ b/src/dom.rs @@ -1,6 +1,6 @@ use stdweb::{Reference, Value, JsSerialize}; use stdweb::unstable::{TryFrom, TryInto}; -use stdweb::web::{IEventTarget, INode, IElement, IHtmlElement, HtmlElement, Node, window, TextNode}; +use stdweb::web::{IEventTarget, INode, IElement, IHtmlElement, HtmlElement, Node, window, TextNode, EventTarget, Element}; use stdweb::web::event::ConcreteEvent; use callbacks::Callbacks; use traits::*; @@ -21,6 +21,15 @@ use discard::{Discard, DiscardOnDrop}; pub struct CssStyleRule(Reference); +/// A reference to an SVG Element. +/// +/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/SVGElement) +#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)] +#[reference(instance_of = "SVGElement")] +#[reference(subclass_of(EventTarget, Node, Element))] +pub struct SvgElement(Reference); + + // https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS#Valid%20Namespace%20URIs pub const HTML_NAMESPACE: &str = "http://www.w3.org/1999/xhtml"; pub const SVG_NAMESPACE: &str = "http://www.w3.org/2000/svg"; diff --git a/src/macros.rs b/src/macros.rs index e81b768..b24dd8c 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,20 +1,36 @@ #[macro_export] -macro_rules! html { - ($kind:expr => $t:ty) => { - html!($kind => $t, {}) +macro_rules! builder { + ($namespace:expr, $default:ty, $kind:expr => $t:ty) => { + builder!($namespace, $default, $kind => $t, {}) }; - ($kind:expr => $t:ty, { $( $name:ident( $( $args:expr ),* ); )* }) => {{ - let a: $crate::DomBuilder<$t> = $crate::DomBuilder::new($crate::create_element_ns($kind, $crate::HTML_NAMESPACE))$(.$name($($args),*))*; + ($namespace:expr, $default:ty, $kind:expr => $t:ty, { $( $name:ident( $( $args:expr ),* ); )* }) => {{ + let a: $crate::DomBuilder<$t> = $crate::DomBuilder::new($crate::create_element_ns($kind, $namespace))$(.$name($($args),*))*; let b: $crate::Dom = $crate::DomBuilder::into_dom(a); b }}; - ($kind:expr) => { - html!($kind => $crate::HtmlElement) + ($namespace:expr, $default:ty, $kind:expr) => { + builder!($namespace, $default, $kind => $default) + }; + ($namespace:expr, $default:ty, $kind:expr, { $( $name:ident( $( $args:expr ),* ); )* }) => { + builder!($namespace, $default, $kind => $default, { $( $name( $( $args ),* ); )* }) + }; +} + + +#[macro_export] +macro_rules! html { + ($($args:tt)+) => { + builder!($crate::HTML_NAMESPACE, $crate::HtmlElement, $($args)+) + }; +} + + +#[macro_export] +macro_rules! svg { + ($($args:tt)+) => { + builder!($crate::SVG_NAMESPACE, $crate::SvgElement, $($args)+) }; - ($kind:expr, { $( $name:ident( $( $args:expr ),* ); )* }) => {{ - html!($kind => $crate::HtmlElement, { $( $name( $( $args ),* ); )* }) - }}; } @@ -23,17 +39,17 @@ macro_rules! stylesheet { ($rule:expr) => { stylesheet!($rule, {}) }; - ($rule:expr, { $( $name:ident( $( $args:expr ),* ); )* }) => {{ + ($rule:expr, { $( $name:ident( $( $args:expr ),* ); )* }) => { $crate::StylesheetBuilder::new($rule)$(.$name($($args),*))*.done() - }}; + }; } #[macro_export] macro_rules! class { - ($( $name:ident( $( $args:expr ),* ); )*) => {{ + ($( $name:ident( $( $args:expr ),* ); )*) => { $crate::ClassBuilder::new()$(.$name($($args),*))*.done() - }}; + }; }