diff --git a/src/elements/grid.rs b/src/elements/grid.rs index ad0b36a..27ecb3e 100644 --- a/src/elements/grid.rs +++ b/src/elements/grid.rs @@ -54,9 +54,8 @@ impl VGrid { }) } - pub fn draw(self: &Arc, element: &Arc) -> Arc { + pub fn draw(self: &Arc, element: &Arc) -> Arc { let r2 = self.clone(); - let r = self.clone(); element.component(Handler::new(move |elem, e: &RenderWrapperEvent| { let scope = e.get_scope(); scope.clear(); @@ -94,7 +93,7 @@ impl VGrid { scope.set_parent_size(w, h); })); - r + element.clone() } } diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs index 87990b5..1745c5d 100644 --- a/src/extensions/mod.rs +++ b/src/extensions/mod.rs @@ -1,9 +1,10 @@ pub mod id; pub mod tick; pub mod velocity; +pub mod resources; use std::{ - any::Any, + any::{type_name, Any}, fmt::Debug, sync::{Arc, Mutex}, }; @@ -45,8 +46,8 @@ impl Handler { } } -impl Debug for Handler { +impl Debug for Handler { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Handler") + write!(f, "Handler({})", type_name::()) } } diff --git a/src/extensions/resources.rs b/src/extensions/resources.rs new file mode 100644 index 0000000..d529382 --- /dev/null +++ b/src/extensions/resources.rs @@ -0,0 +1,16 @@ +use crate::{event, widget::Component}; + +#[derive(Debug, Clone)] +pub struct Resource(pub T); + +impl Component for Resource { + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } +} + +event!(ResourceUpdate); diff --git a/src/main.rs b/src/main.rs index 912299d..c661349 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,12 +3,18 @@ use osui::{ div::Div, grid::{HGrid, VGrid}, }, + extensions::{ + resources::Resource, + tick::{TickEvent, TickExtension}, + Handler, + }, style::Transform, Screen, }; fn main() { let mut screen = Screen::new(); + screen.extension(TickExtension(10)); let container = Div::new(0xffff00); @@ -23,12 +29,23 @@ fn main() { for _ in 1..6 { let row = HGrid::new(0xff00ff, 1); - vgrid.draw(screen.draw(row.clone())); + let row_widget = vgrid.draw( + screen + .draw(row.clone()) + .component(Resource(Vec::<&str>::from(["Test"]))) + .component(Handler::new(|w, t: &TickEvent| { + if t.0 >= 10 { + let mut res = w.get::>>().unwrap(); + res.0.push("Hello World"); + w.set_component(res); + } + })), + ); - for i in 1..10 { + for i in row_widget.get::>>().unwrap().0 { row.draw( screen - .draw((format!("Item {i}"), 0xff0000)) + .draw((i.to_string(), 0xff0000)) .component(Transform::new()), ); }