From e2d7c1ef91cba330b97fc7542479f0b0f5d8be27 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Tue, 29 Jul 2025 17:08:25 +0200 Subject: [PATCH] refactored div --- src/elements/div.rs | 87 +++++++++++----------------- src/elements/flex.rs | 131 +++++++++++++++++++++++++------------------ src/frontend.rs | 9 ++- src/lib.rs | 2 +- src/main.rs | 44 ++++----------- src/render_scope.rs | 2 + src/widget.rs | 2 +- 7 files changed, 130 insertions(+), 147 deletions(-) diff --git a/src/elements/div.rs b/src/elements/div.rs index 35b75c0..b119b1e 100644 --- a/src/elements/div.rs +++ b/src/elements/div.rs @@ -1,67 +1,47 @@ use std::sync::{Arc, Mutex}; -use crate::{ - extensions::Handler, - widget::{Element, Widget}, - RenderWrapperEvent, -}; +use crate::widget::{Element, Widget}; pub struct Div { color: u32, - children: Mutex, - rendered: Mutex, + children: Mutex>>, } impl Element for Arc
{ fn render(&mut self, scope: &mut crate::render_scope::RenderScope) { - let (w, h) = scope.get_size_or_parent(); - scope.draw_rect(w, h, self.color); + let (width, height) = scope.get_size_or_parent(); + scope.draw_rect(width, height, self.color); + } + + fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) { + let transform = scope.get_transform().clone(); + + scope.draw(); + let (w, h) = scope.get_parent_size(); + scope.set_parent_size(transform.width, transform.height); + + for elem in self.children.lock().unwrap().iter() { + scope.clear(); + 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 t = scope.get_transform_mut(); + t.x += transform.x; + t.y += transform.y; + + scope.draw(); + elem.0.lock().unwrap().after_render(scope); + scope.clear(); + } + scope.set_parent_size(w, h); } fn draw_child(&self, element: &Arc) { - *self.children.lock().unwrap() += 1; - 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(); - let transform = scope.get_transform().clone(); - - scope.clear(); - 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(); - elem_transform.x += transform.x; - elem_transform.y += transform.y; - - scope.draw(); - elem.0.lock().unwrap().after_render(&scope); - - scope.set_parent_size(w, h); - - { - let mut rendered = r.rendered.lock().unwrap(); - let children = r.children.lock().unwrap(); - *rendered += 1; - if *rendered < *children { - scope.set_transform_raw(transform); - } else { - *rendered = 0; - } - } - })) - }) + self.children.lock().unwrap().push(element.clone()); } fn as_any(&self) -> &dyn std::any::Any { @@ -77,8 +57,7 @@ impl Div { pub fn new(color: u32) -> Arc { Arc::new(Div { color, - children: Mutex::new(0), - rendered: Mutex::new(0), + children: Mutex::new(Vec::new()), }) } } diff --git a/src/elements/flex.rs b/src/elements/flex.rs index 332684e..5659ecd 100644 --- a/src/elements/flex.rs +++ b/src/elements/flex.rs @@ -8,9 +8,9 @@ use crate::{ }; pub struct FlexRow { - transform: Mutex, color: u32, gap: u16, + children: Mutex>>, } pub struct FlexCol { transform: Mutex, @@ -20,66 +20,85 @@ pub struct FlexCol { 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); + let (width, height) = scope.get_size_or_parent(); + scope.draw_rect(width, height, self.color); } - fn after_render(&mut self, scope: &crate::render_scope::RenderScope) { - let mut t = self.transform.lock().unwrap(); - let st = scope.get_transform(); + fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) { + let transform = scope.get_transform().clone(); - t.x = st.x; - t.y = st.y; + scope.draw(); + let (w, h) = scope.get_parent_size(); + scope.set_parent_size(transform.width, transform.height); - t.width = 0; - t.height = 0; + for elem in self.children.lock().unwrap().iter() { + scope.clear(); + 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 t = scope.get_transform_mut(); + t.x += transform.x; + t.y += transform.y; + + scope.draw(); + elem.0.lock().unwrap().after_render(scope); + scope.clear(); + } + scope.set_parent_size(w, h); } 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); - })) - }) + self.children.lock().unwrap().push(element.clone()); } + // 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 mut 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(&mut scope); + + // scope.set_parent_size(w, h); + // })) + // }) + // } + fn as_any(&self) -> &dyn std::any::Any { self } @@ -92,7 +111,7 @@ impl Element for Arc { impl FlexRow { pub fn new(color: u32, gap: u16) -> Arc { Arc::new(Self { - transform: Mutex::new(RawTransform::new()), + children: Mutex::new(Vec::new()), color, gap, }) @@ -106,7 +125,7 @@ impl Element for Arc { scope.draw_rect(w, h, self.color); } - fn after_render(&mut self, scope: &crate::render_scope::RenderScope) { + fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) { let mut t = self.transform.lock().unwrap(); let st = scope.get_transform(); @@ -122,7 +141,7 @@ impl Element for Arc { element.inject(move |w| { let r = r.clone(); w.component(Handler::new(move |elem, e: &RenderWrapperEvent| { - let scope = e.get_scope(); + let mut scope = e.get_scope(); scope.clear(); let mut transform = r.transform.lock().unwrap(); @@ -154,7 +173,7 @@ impl Element for Arc { transform.x += elem_transform.width + r.gap; scope.draw(); - elem.0.lock().unwrap().after_render(&scope); + elem.0.lock().unwrap().after_render(&mut scope); scope.set_parent_size(w, h); })) diff --git a/src/frontend.rs b/src/frontend.rs index a2610f8..f6c761e 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -25,7 +25,14 @@ impl Rsx { for rsx_elem in self.0 { match rsx_elem { RsxElement::Element(f, dep, child) => { - let w = screen.draw_box(f); + let w = if let Some(parent) = &parent { + let w = Arc::new(Widget::new(Box::new(f))); + parent.0.lock().unwrap().draw_child(&w); + w + } else { + screen.draw_box(f) + }; + for d in dep { w.dependency_box(d); } diff --git a/src/lib.rs b/src/lib.rs index 893fca8..590f5f7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -104,7 +104,7 @@ impl Screen { } scope.draw(); - elem.0.lock().unwrap().after_render(&scope); + elem.0.lock().unwrap().after_render(&mut scope); } elem.auto_refresh(); diff --git a/src/main.rs b/src/main.rs index ee4c6a2..d5a7698 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,4 @@ -use osui::{ - elements::{div::Div, flex::FlexRow}, - frontend::Rsx, - rsx, - state::use_state, - style::Transform, - Screen, -}; +use osui::{elements::div::Div, frontend::Rsx, rsx, style::Transform, Screen}; fn main() -> std::io::Result<()> { let screen = Screen::new(); @@ -17,32 +10,15 @@ fn main() -> std::io::Result<()> { 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); + @Transform::new(); Div { - %count - "{count}" - - %count - @Transform::center(); - "{count}" - } (0xff0000) + @Transform::center().dimensions(40, 3); + Div { + @Transform::center().dimensions(8, 1); + Div { + "hello" + } (0x00ff00) + } (0xff0000) + } (0x0000ff) } } diff --git a/src/render_scope.rs b/src/render_scope.rs index 6d26d99..db7df80 100644 --- a/src/render_scope.rs +++ b/src/render_scope.rs @@ -91,6 +91,8 @@ impl RenderScope { self.render_stack.clear(); self.transform.width = 0; self.transform.height = 0; + self.transform.x = 0; + self.transform.y = 0; } pub fn get_size(&self) -> (u16, u16) { diff --git a/src/widget.rs b/src/widget.rs index 024c842..5c87cdf 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -13,7 +13,7 @@ pub trait Element: Send + Sync { #[allow(unused)] fn render(&mut self, scope: &mut RenderScope) {} #[allow(unused)] - fn after_render(&mut self, scope: &RenderScope) {} + fn after_render(&mut self, scope: &mut RenderScope) {} #[allow(unused)] fn draw_child(&self, element: &Arc) {} fn as_any(&self) -> &dyn Any;