diff --git a/src/frontend.rs b/src/frontend.rs index 2ba0b87..81b33c5 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -5,14 +5,25 @@ use crate::{state::DependencyHandler, widget::WidgetLoad, Screen}; pub struct Rsx( pub Vec<( Box WidgetLoad + Send + Sync>, - Vec>, + Vec>, )>, ); impl Rsx { pub fn draw(self, screen: &Arc) { for i in self.0 { - screen.draw_box(i.0); + let w = screen.draw_box(i.0); + for d in i.1 { + w.dependency_box(d); + } } } + + pub fn create_element WidgetLoad + Send + Sync + 'static>( + &mut self, + load: F, + dependencies: Vec>, + ) { + self.0.push((Box::new(load), dependencies)); + } } diff --git a/src/macros.rs b/src/macros.rs index 3e17b06..c05c9fa 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -126,7 +126,7 @@ macro_rules! event_handler { #[macro_export] macro_rules! rsx { ($($inner:tt)*) => {{ - let mut r = Rsx(Vec::new()); + let mut r = $crate::frontend::Rsx(Vec::new()); $crate::rsx_inner! { r, $($inner)* }; @@ -137,7 +137,7 @@ macro_rules! rsx { #[macro_export] macro_rules! rsx_inner { ($r:expr, $(%$dep:ident)* $(@$comp:expr;)* $s:literal $($rest:tt)*) => { - $r.0.push((Box::new({ $(let $dep = $dep.clone();)* move || Box::new(format!($s)) }), vec![$(Arc::new($dep.clone()),)*])); + $r.create_element({ $(let $dep = $dep.clone();)* move || $crate::widget::WidgetLoad::new(format!($s)) }, vec![$(Box::new($dep.clone()))*]); $crate::rsx_inner!{ $r, $($rest)* }; }; ($r:expr,) => {}; diff --git a/src/main.rs b/src/main.rs index a69a53c..92af6f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use osui::{state::use_state, widget::WidgetLoad, Screen}; +use osui::{rsx, state::use_state, Screen}; fn main() -> std::io::Result<()> { let screen = Screen::new(); @@ -13,12 +13,22 @@ fn main() -> std::io::Result<()> { } }); - screen - .draw({ - let count = count.clone(); - move || WidgetLoad::new(format!("Hello, World {count}")) - }) - .dependency(count); + // let mut r = Rsx(Vec::new()); + // r.create_element( + // { + // let count = count.clone(); + // move || WidgetLoad::new(format!("{count}")) + // }, + // vec![Box::new(count)], + // ); + + // r.draw(&screen); + + rsx! { + %count + "{count}" + } + .draw(&screen); screen.run() } diff --git a/src/widget.rs b/src/widget.rs index 76c14d4..5dbf6b3 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -61,6 +61,12 @@ impl Widget { self } + pub fn dependency_box(self: &Arc, d: Box) -> &Arc { + d.add(); + self.3.lock().unwrap().push(d); + self + } + pub fn component(self: &Arc, c: C) -> &Arc { self.1 .lock()