livid 0.2.13

livid is a lightweight frontend Rust crate for creating web apps via webassembly
Documentation
use crate::prelude::{WidgetBase, WidgetExt};
use crate::{enums::*, widget::Widget};
use wasm_bindgen::JsCast;
use wasm_bindgen::UnwrapThrowExt;

#[derive(Debug, Clone)]
pub struct Button {
    inner: Widget,
}

impl Button {
    pub fn disabled(&self) -> bool {
        let elem: &web_sys::HtmlButtonElement = self.inner.dyn_ref().unwrap_throw();
        elem.disabled()
    }
    pub fn set_disabled(&self, val: bool) {
        let elem: &web_sys::HtmlButtonElement = self.inner.dyn_ref().unwrap_throw();
        elem.set_disabled(val);
    }
}

impl WidgetBase for Button {
    fn default() -> Self {
        let inner = Widget::new(WidgetType::Button);
        Self { inner }
    }

    unsafe fn from_widget(widget: &Widget) -> Self {
        Self {
            inner: widget.clone(),
        }
    }
    fn inner(&self) -> Widget {
        self.inner.clone()
    }
}

impl WidgetExt for Button {}

#[derive(Debug, Clone)]
pub struct RadioButton {
    inner: Widget,
}

impl RadioButton {
    pub fn set_name(&self, name: &str) {
        if let Some(btn) = self.inner.first_element_child() {
            btn.set_attribute("name", name).unwrap_throw();
        }
    }
    pub fn with_name(self, name: &str) -> Self {
        self.set_name(name);
        self
    }
    pub fn checked(&self) -> bool {
        if let Some(btn) = self.inner.first_element_child() {
            let elem: &web_sys::HtmlInputElement = btn.dyn_ref().unwrap_throw();
            elem.checked()
        } else {
            false
        }
    }
    pub fn set_checked(&self, val: bool) {
        if let Some(btn) = self.inner.first_element_child() {
            let elem: &web_sys::HtmlInputElement = btn.dyn_ref().unwrap_throw();
            elem.set_checked(val);
        }
    }
    pub fn disabled(&self) -> bool {
        if let Some(btn) = self.inner.first_element_child() {
            let elem: &web_sys::HtmlInputElement = btn.dyn_ref().unwrap_throw();
            elem.disabled()
        } else {
            false
        }
    }
    pub fn set_disabled(&self, val: bool) {
        if let Some(btn) = self.inner.first_element_child() {
            let elem: &web_sys::HtmlInputElement = btn.dyn_ref().unwrap_throw();
            elem.set_disabled(val);
        }
    }
}

impl WidgetBase for RadioButton {
    fn default() -> Self {
        let inner = Widget::new(WidgetType::Div);
        let btn = Widget::new(WidgetType::Input);
        btn.set_attribute("type", "radio").unwrap_throw();
        let label = Widget::new(WidgetType::Label);
        inner.append(&btn);
        inner.append(&label);
        Self { inner }
    }

    unsafe fn from_widget(widget: &Widget) -> Self {
        Self {
            inner: widget.clone(),
        }
    }
    fn inner(&self) -> Widget {
        self.inner.clone()
    }
}

impl WidgetExt for RadioButton {
    fn set_label(&self, title: &str) {
        if let Some(label) = self.inner.last_element_child() {
            label.set_text_content(Some(title));
        }
    }
}

#[derive(Debug, Clone)]
pub struct CheckButton {
    inner: Widget,
}

impl CheckButton {
    pub fn set_name(&self, name: &str) {
        if let Some(btn) = self.inner.first_element_child() {
            btn.set_attribute("name", name).unwrap_throw();
        }
    }
    pub fn with_name(self, name: &str) -> Self {
        self.set_name(name);
        self
    }
    pub fn checked(&self) -> bool {
        if let Some(btn) = self.inner.first_element_child() {
            let elem: &web_sys::HtmlInputElement = btn.dyn_ref().unwrap_throw();
            elem.checked()
        } else {
            false
        }
    }
    pub fn set_checked(&self, val: bool) {
        if let Some(btn) = self.inner.first_element_child() {
            let elem: &web_sys::HtmlInputElement = btn.dyn_ref().unwrap_throw();
            elem.set_checked(val);
        }
    }
    pub fn disabled(&self) -> bool {
        if let Some(btn) = self.inner.first_element_child() {
            let elem: &web_sys::HtmlInputElement = btn.dyn_ref().unwrap_throw();
            elem.disabled()
        } else {
            false
        }
    }
    pub fn set_disabled(&self, val: bool) {
        if let Some(btn) = self.inner.first_element_child() {
            let elem: &web_sys::HtmlInputElement = btn.dyn_ref().unwrap_throw();
            elem.set_disabled(val);
        }
    }
}

impl WidgetBase for CheckButton {
    fn default() -> Self {
        let inner = Widget::new(WidgetType::Div);
        let btn = Widget::new(WidgetType::Input);
        btn.set_attribute("type", "checkbox").unwrap_throw();
        let label = Widget::new(WidgetType::Label);
        inner.append(&btn);
        inner.append(&label);
        Self { inner }
    }

    unsafe fn from_widget(widget: &Widget) -> Self {
        Self {
            inner: widget.clone(),
        }
    }
    fn inner(&self) -> Widget {
        self.inner.clone()
    }
}

impl WidgetExt for CheckButton {
    fn set_label(&self, title: &str) {
        if let Some(label) = self.inner.last_element_child() {
            label.set_text_content(Some(title));
        }
    }
}