osgui 0.0.1

OSGUI is a component driven GUI library that is like OSUI
Documentation
use std::sync::Arc;

use crate::{
    render::RenderScope,
    widget::{Element, Widget},
};

#[derive(Default)]
pub struct DivStyle {
    pub background_color: u32,
    pub corner_radius: usize,
}

#[derive(Default)]
pub struct Div {
    pub children: Vec<Arc<Widget>>,
    pub style: DivStyle,
}

impl Element for Div {
    fn render(&mut self, scope_parent: &mut crate::render::RenderScope) {
        let (w, h) = scope_parent.get_size_or_parent();
        scope_parent.draw_rect_rounded(
            0,
            0,
            w,
            h,
            self.style.corner_radius,
            self.style.background_color,
        );

        let mut scope = RenderScope::new(w, h);

        for elem in &self.children {
            scope.clear();
            if let Some(t) = elem.get() {
                scope.set_transform(&t);
            }

            elem.0.lock().unwrap().render(&mut scope);

            if let Some(t) = elem.get() {
                scope.set_transform(&t);
            }
            scope_parent.merge(scope.clone());
        }
    }

    fn as_any(&self) -> &dyn std::any::Any {
        self
    }

    fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
        self
    }
}

impl Div {
    pub fn draw<E: Element + 'static>(&mut self, element: E) -> &Arc<Widget> {
        self.children.push(Arc::new(Widget::new(Box::new(element))));
        self.children.last().unwrap()
    }
}