osgui 0.0.1

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

use minifb::{MouseButton, Window};

use crate::{component, extensions::Extension, style::RawTransform, widget::Widget};

pub struct MouseExtension(bool);

impl Extension for MouseExtension {
    fn before_render(
        &mut self,
        _widgets: &Vec<Arc<Widget>>,
        _transform: RawTransform,
        win: &Window,
    ) {
        if win.get_mouse_down(MouseButton::Left) {
            if !self.0 {
                self.0 = true;
            }
        } else {
            self.0 = false;
        }
    }

    fn render(&mut self, widget: &Arc<Widget>, transform: RawTransform, win: &Window) {
        if !self.0 {
            return;
        }

        if let Some((mx, my)) = win.get_mouse_pos(minifb::MouseMode::Discard) {
            let (mx, my) = (mx as usize, my as usize);
            if my >= transform.y
                && mx < transform.x + transform.width
                && my < transform.y + transform.height
            {
                std::thread::spawn({
                    let widget = widget.clone();
                    move || {
                        if let Some(on_click) = widget.get::<OnClick>() {
                            (on_click.0)(&widget)
                        }
                    }
                });
            }
        }
    }
}

impl MouseExtension {
    pub fn new() -> Self {
        MouseExtension(false)
    }
}

component!(OnClick(pub fn(&Arc<Widget>)));