From a59a8eeb730c899e39c825911d96d62a28865158 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Mon, 28 Jul 2025 19:24:50 +0200 Subject: [PATCH] Widget injection --- src/elements/div.rs | 43 ++++++++-------- src/elements/grid.rs | 114 +++++++++++++++++++++++-------------------- src/lib.rs | 4 +- src/widget.rs | 25 +++++++++- 4 files changed, 108 insertions(+), 78 deletions(-) diff --git a/src/elements/div.rs b/src/elements/div.rs index 2aef76b..5067fdf 100644 --- a/src/elements/div.rs +++ b/src/elements/div.rs @@ -24,34 +24,37 @@ impl Element for Arc
{ fn draw_child(&self, element: &Arc) { let r = self.clone(); - element.component(Handler::new(move |elem, e: &RenderWrapperEvent| { - let scope = e.get_scope(); - scope.clear(); + element.inject(move |w| { + let r = r.clone(); + w.component(Handler::new(move |elem, e: &RenderWrapperEvent| { + let scope = e.get_scope(); + scope.clear(); - let transform = r.transform.lock().unwrap(); + let transform = r.transform.lock().unwrap(); - let (w, h) = scope.get_parent_size(); - scope.set_parent_size(transform.width, transform.height); + 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); - } + if let Some(t) = elem.get() { + scope.set_transform(&t); + } - elem.0.lock().unwrap().render(scope); + elem.0.lock().unwrap().render(scope); - if let Some(t) = elem.get() { - scope.set_transform(&t); - } + if let Some(t) = elem.get() { + scope.set_transform(&t); + } - let elem_transform = scope.get_transform_mut(); - elem_transform.x += transform.x; - elem_transform.y += transform.y; + let elem_transform = scope.get_transform_mut(); + elem_transform.x += transform.x; + elem_transform.y += transform.y; - scope.draw(); - elem.0.lock().unwrap().after_render(&scope); + scope.draw(); + elem.0.lock().unwrap().after_render(&scope); - scope.set_parent_size(w, h); - })); + scope.set_parent_size(w, h); + })) + }) } fn as_any(&self) -> &dyn std::any::Any { diff --git a/src/elements/grid.rs b/src/elements/grid.rs index 6dd6aef..3bf7197 100644 --- a/src/elements/grid.rs +++ b/src/elements/grid.rs @@ -38,43 +38,46 @@ impl Element for Arc { fn draw_child(&self, element: &Arc) { let r = self.clone(); - element.component(Handler::new(move |elem, e: &RenderWrapperEvent| { - let scope = e.get_scope(); - scope.clear(); + 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 mut transform = r.transform.lock().unwrap(); - let (w, h) = scope.get_parent_size(); - scope.set_parent_size(transform.width, transform.height); + 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); - } + if let Some(t) = elem.get() { + scope.set_transform(&t); + } - elem.0.lock().unwrap().render(scope); + elem.0.lock().unwrap().render(scope); - if let Some(t) = elem.get() { - scope.set_transform(&t); - } + if let Some(t) = elem.get() { + scope.set_transform(&t); + } - let elem_transform = scope.get_transform_mut(); + 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); + 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; + 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.draw(); + elem.0.lock().unwrap().after_render(&scope); - scope.set_parent_size(w, h); - })); + scope.set_parent_size(w, h); + })) + }) } fn as_any(&self) -> &dyn std::any::Any { @@ -116,43 +119,46 @@ impl Element for Arc { fn draw_child(&self, element: &Arc) { let r = self.clone(); - element.component(Handler::new(move |elem, e: &RenderWrapperEvent| { - let scope = e.get_scope(); - scope.clear(); + 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 mut transform = r.transform.lock().unwrap(); - let (w, h) = scope.get_parent_size(); - scope.set_parent_size(transform.width, transform.height); + 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); - } + if let Some(t) = elem.get() { + scope.set_transform(&t); + } - elem.0.lock().unwrap().render(scope); + elem.0.lock().unwrap().render(scope); - if let Some(t) = elem.get() { - scope.set_transform(&t); - } + if let Some(t) = elem.get() { + scope.set_transform(&t); + } - let elem_transform = scope.get_transform_mut(); + 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); + 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; + 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.draw(); + elem.0.lock().unwrap().after_render(&scope); - scope.set_parent_size(w, h); - })); + scope.set_parent_size(w, h); + })) + }); } fn as_any(&self) -> &dyn std::any::Any { diff --git a/src/lib.rs b/src/lib.rs index e6b146b..893fca8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -105,9 +105,9 @@ impl Screen { scope.draw(); elem.0.lock().unwrap().after_render(&scope); - - elem.auto_refresh(); } + + elem.auto_refresh(); } Ok(()) } diff --git a/src/widget.rs b/src/widget.rs index 07a2f53..024c842 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -30,6 +30,7 @@ pub struct Widget( Mutex>, Mutex WidgetLoad + Send + Sync>>, Mutex>>, + Mutex WidgetLoad + Send + Sync>>>, ); impl Widget { @@ -40,13 +41,33 @@ impl Widget { Mutex::new(wl.1), Mutex::new(Box::new(e)), Mutex::new(Vec::new()), + Mutex::new(None), ) } + pub fn inject WidgetLoad + 'static + Send + Sync>( + self: &Arc, + f: F, + ) { + { + *self.4.lock().unwrap() = Some(Box::new(f)); + } + self.refresh(); + } + pub fn refresh(self: &Arc) { let w = (self.2.lock().unwrap())(); - *self.0.lock().unwrap() = w.0; - *self.1.lock().unwrap() = w.1; + match &mut *self.4.lock().unwrap() { + Some(inject) => { + let w = inject(w); + *self.0.lock().unwrap() = w.0; + *self.1.lock().unwrap() = w.1; + } + None => { + *self.0.lock().unwrap() = w.0; + *self.1.lock().unwrap() = w.1; + } + } } pub fn auto_refresh(self: &Arc) {