From db6680334793e705d65bad6de7ed026af4c1b575 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Tue, 29 Jul 2025 17:51:03 +0200 Subject: [PATCH] state management as a child --- src/elements/div.rs | 6 +++++- src/elements/flex.rs | 4 +++- src/frontend.rs | 2 +- src/lib.rs | 9 +++++++++ src/main.rs | 2 +- 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/elements/div.rs b/src/elements/div.rs index d34fe63..f93b51a 100644 --- a/src/elements/div.rs +++ b/src/elements/div.rs @@ -1,6 +1,9 @@ use std::sync::{Arc, Mutex}; -use crate::widget::{Element, Widget}; +use crate::{ + widget::{Element, Widget}, + NoRender, +}; pub struct Div { color: u32, @@ -40,6 +43,7 @@ impl Element for Arc
{ fn draw_child(&self, element: &Arc) { self.children.lock().unwrap().push(element.clone()); + element.inject(|w| w.component(NoRender)); } fn as_any(&self) -> &dyn std::any::Any { diff --git a/src/elements/flex.rs b/src/elements/flex.rs index 5183c53..58c973d 100644 --- a/src/elements/flex.rs +++ b/src/elements/flex.rs @@ -1,6 +1,6 @@ use std::sync::{Arc, Mutex}; -use crate::widget::{Element, Widget}; +use crate::{widget::{Element, Widget}, NoRender}; pub struct FlexRow { color: u32, @@ -55,6 +55,7 @@ impl Element for FlexRow { fn draw_child(&self, element: &Arc) { self.children.lock().unwrap().push(element.clone()); + element.inject(|w| w.component(NoRender)); } fn as_any(&self) -> &dyn std::any::Any { @@ -116,6 +117,7 @@ impl Element for FlexCol { fn draw_child(&self, element: &Arc) { self.children.lock().unwrap().push(element.clone()); + element.inject(|w| w.component(NoRender)); } fn as_any(&self) -> &dyn std::any::Any { diff --git a/src/frontend.rs b/src/frontend.rs index 91fb248..d9fac25 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -26,7 +26,7 @@ impl Rsx { match rsx_elem { RsxElement::Element(f, dep, child) => { let w = if let Some(parent) = &parent { - let w = Arc::new(Widget::new(Box::new(f))); + let w = screen.draw_box(f); parent.0.lock().unwrap().draw_child(&w); w } else { diff --git a/src/lib.rs b/src/lib.rs index 590f5f7..43bebf4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,6 +22,7 @@ pub struct Screen { } event!(RenderWrapperEvent(*mut RenderScope)); +component!(NoRender); impl RenderWrapperEvent { pub fn get_scope(&self) -> &mut RenderScope { @@ -85,6 +86,14 @@ impl Screen { utils::clear()?; for elem in self.widgets.lock().unwrap().iter() { + if let Some(NoRender) = elem.get() { + for ext in self.extensions.lock().unwrap().iter() { + ext.lock().unwrap().render_widget(&mut scope, elem); + } + elem.auto_refresh(); + continue; + } + if let Some(wrapper) = elem.get::>() { wrapper.call(elem, &RenderWrapperEvent(&mut scope)); } else { diff --git a/src/main.rs b/src/main.rs index 534ef3c..c884775 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,7 +31,7 @@ fn test(inc: i32) -> Rsx { std::thread::spawn({ let count = count.clone(); move || loop { - std::thread::sleep(std::time::Duration::from_millis(300)); + std::thread::sleep(std::time::Duration::from_millis(50)); **count.get() += inc; } });