deft 0.15.0

Cross platform ui framework
use crate as deft;
use crate::base::Rect;
use crate::element::common::image_object::ImageObject;
use crate::element::{Element, ElementBackend, ElementWeak};
use crate::ok_or_return;
use crate::render::RenderFn;
use crate::style::StylePropKey;
use deft_macros::{element_backend, js_methods};
use yoga::Size;
#[element_backend]
pub struct Image {
    element: ElementWeak,
    src: String,
    img: ImageObject,
}

#[js_methods]
impl Image {
    #[js_func]
    pub fn set_src(&mut self, src: String) {
        self.img = ImageObject::new(&src);
        self.element.mark_dirty(true);
    }

    pub fn set_src_svg_raw(&mut self, svg: &[u8]) {
        self.img = ImageObject::from_svg_bytes(svg);
        self.element.mark_dirty(true);
    }
}

impl ElementBackend for Image {
    fn create(element: &mut Element) -> Self {
        let img = ImageData {
            element: element.as_weak(),
            src: "".to_string(),
            img: ImageObject::none(),
        }
        .to_ref();
        element
            .style
            .yoga_node
            .set_measure_func(img.as_weak(), |img, _params| {
                if let Ok(img) = img.upgrade() {
                    let (width, height) = img.img.get_size();
                    return Size { width, height };
                }
                return Size {
                    width: 0.0,
                    height: 0.0,
                };
            });
        img
    }

    fn get_base_mut(&mut self) -> Option<&mut dyn ElementBackend> {
        None
    }

    fn handle_style_changed(&mut self, key: StylePropKey) {
        let element = ok_or_return!(self.element.upgrade());
        match key {
            StylePropKey::Color => {
                if self.img.set_color(element.style.color) {
                    self.element.mark_dirty(false);
                }
            }
            _ => {}
        }
    }

    fn render(&mut self) -> RenderFn {
        self.img.render()
    }

    fn handle_origin_bounds_change(&mut self, bounds: &Rect) {
        self.img.set_container_size((bounds.width, bounds.height));
    }
}