From e3bbda6b59d049a04977b0b2a2128f63fdd760c5 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Mon, 28 Jul 2025 19:43:58 +0200 Subject: [PATCH] expandable rsx --- src/elements/grid.rs | 181 ------------------------------------------- src/elements/mod.rs | 2 +- src/frontend.rs | 4 + src/macros.rs | 11 ++- src/main.rs | 40 +++++++--- 5 files changed, 44 insertions(+), 194 deletions(-) delete mode 100644 src/elements/grid.rs diff --git a/src/elements/grid.rs b/src/elements/grid.rs deleted file mode 100644 index 3bf7197..0000000 --- a/src/elements/grid.rs +++ /dev/null @@ -1,181 +0,0 @@ -use std::sync::{Arc, Mutex}; - -use crate::{ - extensions::Handler, - style::RawTransform, - widget::{Element, Widget}, - RenderWrapperEvent, -}; - -pub struct VGrid { - transform: Mutex, - color: u32, - gap: u16, -} -pub struct HGrid { - transform: Mutex, - color: u32, - gap: u16, -} - -impl Element for Arc { - fn render(&mut self, scope: &mut crate::render_scope::RenderScope) { - let transform = self.transform.lock().unwrap(); - let (w, h) = scope.get_size_or(transform.width, transform.height); - scope.draw_rect(w, h, self.color); - } - - fn after_render(&mut self, scope: &crate::render_scope::RenderScope) { - let mut t = self.transform.lock().unwrap(); - let st = scope.get_transform(); - - t.x = st.x; - t.y = st.y; - - t.width = 0; - t.height = 0; - } - - fn draw_child(&self, element: &Arc) { - let r = self.clone(); - element.inject(move |w| { - let r = r.clone(); - w.component(Handler::new(move |elem, e: &RenderWrapperEvent| { - let scope = e.get_scope(); - scope.clear(); - - let mut transform = r.transform.lock().unwrap(); - - let (w, h) = scope.get_parent_size(); - scope.set_parent_size(transform.width, transform.height); - - if let Some(t) = elem.get() { - scope.set_transform(&t); - } - - elem.0.lock().unwrap().render(scope); - - if let Some(t) = elem.get() { - scope.set_transform(&t); - } - - let elem_transform = scope.get_transform_mut(); - - transform.height += if transform.height == 0 { - elem_transform.height - } else { - elem_transform.height + r.gap - }; - transform.width = transform.width.max(elem_transform.width); - - elem_transform.x = transform.x; - elem_transform.y = transform.y; - transform.y += elem_transform.height + r.gap; - - scope.draw(); - elem.0.lock().unwrap().after_render(&scope); - - scope.set_parent_size(w, h); - })) - }) - } - - fn as_any(&self) -> &dyn std::any::Any { - self - } - - fn as_any_mut(&mut self) -> &mut dyn std::any::Any { - self - } -} - -impl VGrid { - pub fn new(color: u32, gap: u16) -> Arc { - Arc::new(Self { - transform: Mutex::new(RawTransform::new()), - color, - gap, - }) - } -} - -impl Element for Arc { - fn render(&mut self, scope: &mut crate::render_scope::RenderScope) { - let transform = self.transform.lock().unwrap(); - let (w, h) = scope.get_size_or(transform.width, transform.height); - scope.draw_rect(w, h, self.color); - } - - fn after_render(&mut self, scope: &crate::render_scope::RenderScope) { - let mut t = self.transform.lock().unwrap(); - let st = scope.get_transform(); - - t.x = st.x; - t.y = st.y; - - t.width = 0; - t.height = 0; - } - - fn draw_child(&self, element: &Arc) { - let r = self.clone(); - element.inject(move |w| { - let r = r.clone(); - w.component(Handler::new(move |elem, e: &RenderWrapperEvent| { - let scope = e.get_scope(); - scope.clear(); - - let mut transform = r.transform.lock().unwrap(); - - let (w, h) = scope.get_parent_size(); - scope.set_parent_size(transform.width, transform.height); - - if let Some(t) = elem.get() { - scope.set_transform(&t); - } - - elem.0.lock().unwrap().render(scope); - - if let Some(t) = elem.get() { - scope.set_transform(&t); - } - - let elem_transform = scope.get_transform_mut(); - - transform.width += if transform.width == 0 { - elem_transform.width - } else { - elem_transform.width + r.gap - }; - transform.height = transform.height.max(elem_transform.height); - - elem_transform.x = transform.x; - elem_transform.y = transform.y; - transform.x += elem_transform.width + r.gap; - - scope.draw(); - elem.0.lock().unwrap().after_render(&scope); - - scope.set_parent_size(w, h); - })) - }); - } - - fn as_any(&self) -> &dyn std::any::Any { - self - } - - fn as_any_mut(&mut self) -> &mut dyn std::any::Any { - self - } -} - -impl HGrid { - pub fn new(color: u32, gap: u16) -> Arc { - Arc::new(Self { - transform: Mutex::new(RawTransform::new()), - color, - gap, - }) - } -} diff --git a/src/elements/mod.rs b/src/elements/mod.rs index f397332..89c0023 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -1,5 +1,5 @@ pub mod div; -pub mod grid; +pub mod flex; use crate::Element; diff --git a/src/frontend.rs b/src/frontend.rs index 8c2b1b1..a2610f8 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -47,4 +47,8 @@ impl Rsx { self.0 .push(RsxElement::Element(Box::new(load), dependencies, children)); } + + pub fn expand(&mut self, other: &mut Rsx) { + self.0.append(&mut other.0); + } } diff --git a/src/macros.rs b/src/macros.rs index 2becf63..88c429a 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -140,21 +140,26 @@ macro_rules! rsx_inner { $r.create_element({ $(let $dep = $dep.clone();)* move || { $crate::widget::WidgetLoad::new(format!($s)) $(.component($comp))* } }, vec![$(Box::new($dep.clone())),*], $crate::frontend::Rsx(Vec::new())); - $crate::rsx_inner!{ $r, $($rest)* }; + $crate::rsx_inner! { $r, $($rest)* }; }; ($r:expr, $(%$dep:ident)* $(@$comp:expr;)* $name:path { $($inner:tt)* } ($($e:expr),*) $($rest:tt)*) => { $r.create_element({ $(let $dep = $dep.clone();)* move || { $crate::widget::WidgetLoad::new(<$name>::new($($e),*)) $(.component($comp))* } }, vec![$(Box::new($dep.clone())),*], $crate::rsx!{ $($inner)* }); - $crate::rsx_inner!{ $r, $($rest)* }; + $crate::rsx_inner! { $r, $($rest)* }; }; ($r:expr, $(%$dep:ident)* $(@$comp:expr;)* $name:path { $($inner:tt)* } $($rest:tt)*) => { $r.create_element({ $(let $dep = $dep.clone();)* move || { $crate::widget::WidgetLoad::new(<$name>::new()) $(.component($comp))* } }, vec![$(Box::new($dep.clone())),*], $crate::rsx!{ $($inner)* }); - $crate::rsx_inner!{ $r, $($rest)* }; + $crate::rsx_inner! { $r, $($rest)* }; + }; + + ($r:expr, $expand:ident($($inner:tt)*) $($rest:tt)*) => { + $r.expand(&mut $expand($($inner)*)); + $crate::rsx_inner! { $r, $($rest)* }; }; ($r:expr,) => {}; diff --git a/src/main.rs b/src/main.rs index 04e6fc9..ee4c6a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,39 @@ -use osui::{elements::div::Div, rsx, state::use_state, style::Transform, Screen}; +use osui::{ + elements::{div::Div, flex::FlexRow}, + frontend::Rsx, + rsx, + state::use_state, + style::Transform, + Screen, +}; fn main() -> std::io::Result<()> { let screen = Screen::new(); + + app().draw(&screen); + + screen.run() +} + +fn app() -> Rsx { + rsx! { + FlexRow { + counter() + } (0x00000, 1) + } +} + +fn counter() -> Rsx { let count = use_state(0); + std::thread::spawn({ + let count = count.clone(); + move || loop { + std::thread::sleep(std::time::Duration::from_millis(50)); + **count.get() += 1; + } + }); + rsx! { @Transform::new().dimensions(40, 3); Div { @@ -15,12 +45,4 @@ fn main() -> std::io::Result<()> { "{count}" } (0xff0000) } - .draw(&screen); - - std::thread::spawn(move || loop { - std::thread::sleep(std::time::Duration::from_millis(50)); - **count.get() += 1; - }); - - screen.run() }