From 9d4b247b2abad6b7dfdf3077a93df0297e2db5bb Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 1 Nov 2025 09:25:05 +0100 Subject: [PATCH] Working area stop --- examples/iter.rs | 3 +++ src/elements/div.rs | 27 ++++++-------------- src/elements/flex.rs | 60 +++++++++++++------------------------------- src/render_scope.rs | 32 +++++++++++++++-------- src/utils.rs | 10 ++++++-- 5 files changed, 58 insertions(+), 74 deletions(-) diff --git a/examples/iter.rs b/examples/iter.rs index c61589b..f551d63 100644 --- a/examples/iter.rs +++ b/examples/iter.rs @@ -20,6 +20,9 @@ pub fn app() -> Rsx { } rsx! { + @transform! { + height: 3 + }; FlexRow { for item in items { static "{item}" diff --git a/src/elements/div.rs b/src/elements/div.rs index d5c5700..631f6c2 100644 --- a/src/elements/div.rs +++ b/src/elements/div.rs @@ -11,14 +11,12 @@ pub struct DivRenderer<'a>(pub &'a mut RawTransform); pub struct Div { children: Vec>, - size: (u16, u16), } impl Div { pub fn new() -> Self { Div { children: Vec::new(), - size: (0, 0), } } } @@ -26,30 +24,21 @@ impl Div { impl Element for Div { fn render( &mut self, - scope: &mut crate::render_scope::RenderScope, - _: &crate::render_scope::RenderContext, - ) { - let (width, height) = scope.get_size_or(self.size.0, self.size.1); - scope.use_area(width, height); - } - - fn after_render( - &mut self, - scope: &mut crate::render_scope::RenderScope, + parent_scope: &mut crate::render_scope::RenderScope, render_context: &crate::render_scope::RenderContext, ) { - let mut transform = scope.get_transform().clone(); + let mut transform = parent_scope.get_transform().clone(); + let (w, h) = parent_scope.get_size_or_parent(); + + let mut scope = crate::render_scope::RenderScope::new(); + scope.set_parent_size(w, h); + let mut renderer = DivRenderer(&mut transform); - - let (w, h) = scope.get_parent_size(); - scope.set_parent_size(renderer.0.width, renderer.0.height); - for widget in &self.children { scope.render_widget(&mut renderer, render_context.get_context(), widget); } - scope.set_parent_size(w, h); - self.size = (renderer.0.width, renderer.0.height); + parent_scope.use_area(w, h); } fn draw_child(&mut self, element: &Arc) { diff --git a/src/elements/flex.rs b/src/elements/flex.rs index 26ff7d4..6b7c9f4 100644 --- a/src/elements/flex.rs +++ b/src/elements/flex.rs @@ -13,20 +13,17 @@ pub struct ColumnRenderer<'a>(&'a mut RawTransform, u16, &'a mut u16); pub struct FlexRow { pub gap: u16, children: Vec>, - size: (u16, u16), } pub struct FlexCol { pub gap: u16, children: Vec>, - size: (u16, u16), } impl FlexRow { pub fn new() -> Self { Self { children: Vec::new(), - size: (0, 0), gap: 0, } } @@ -36,7 +33,6 @@ impl FlexCol { pub fn new() -> Self { Self { children: Vec::new(), - size: (0, 0), gap: 0, } } @@ -45,32 +41,22 @@ impl FlexCol { impl Element for FlexRow { fn render( &mut self, - scope: &mut crate::render_scope::RenderScope, - _: &crate::render_scope::RenderContext, - ) { - let (width, height) = scope.get_size_or(self.size.0, self.size.1); - scope.use_area(width, height); - } - - fn after_render( - &mut self, - scope: &mut crate::render_scope::RenderScope, + parent_scope: &mut crate::render_scope::RenderScope, render_context: &crate::render_scope::RenderContext, ) { - let mut transform = scope.get_transform().clone(); - let transform_before = transform.clone(); - let (w, h) = scope.get_parent_size(); - scope.set_parent_size(transform.width, transform.height); + let mut transform = parent_scope.get_transform().clone(); + let (w, h) = parent_scope.get_size_or_parent(); + + let mut scope = crate::render_scope::RenderScope::new(); + scope.set_parent_size(w, h); + let mut v = 0; - let mut renderer = RowRenderer(&mut transform, self.gap, &mut v); - for widget in &self.children { scope.render_widget(&mut renderer, render_context.get_context(), widget); } - scope.set_parent_size(w, h); - scope.set_transform_raw(transform_before); - self.size = (transform.width, transform.height); + + parent_scope.use_area(w, h); } fn draw_child(&mut self, element: &Arc) { @@ -100,32 +86,22 @@ impl Element for FlexRow { impl Element for FlexCol { fn render( &mut self, - scope: &mut crate::render_scope::RenderScope, - _: &crate::render_scope::RenderContext, - ) { - let (width, height) = scope.get_size_or(self.size.0, self.size.1); - scope.use_area(width, height); - } - - fn after_render( - &mut self, - scope: &mut crate::render_scope::RenderScope, + parent_scope: &mut crate::render_scope::RenderScope, render_context: &crate::render_scope::RenderContext, ) { - let mut transform = scope.get_transform().clone(); - let transform_before = transform.clone(); - let (w, h) = scope.get_parent_size(); - scope.set_parent_size(transform.width, transform.height); + let mut transform = parent_scope.get_transform().clone(); + let (w, h) = parent_scope.get_size_or_parent(); + + let mut scope = crate::render_scope::RenderScope::new(); + scope.set_parent_size(w, h); + let mut v = 0; - let mut renderer = ColumnRenderer(&mut transform, self.gap, &mut v); - for widget in &self.children { scope.render_widget(&mut renderer, render_context.get_context(), widget); } - scope.set_parent_size(w, h); - scope.set_transform_raw(transform_before); - self.size = (transform.width, transform.height); + + parent_scope.use_area(w, h); } fn draw_child(&mut self, element: &Arc) { diff --git a/src/render_scope.rs b/src/render_scope.rs index 6e10914..9207f60 100644 --- a/src/render_scope.rs +++ b/src/render_scope.rs @@ -164,6 +164,7 @@ impl RenderScope { format!("\n│{}│", " ".repeat(width as usize - 2)) .repeat(height as usize - 2), ), + (self.parent_width, self.parent_height), ); } } @@ -181,6 +182,7 @@ impl RenderScope { format!("\n│{}│", " ".repeat(width as usize - 2)) .repeat(height as usize - 2), ), + (self.parent_width, self.parent_height), ); } } @@ -192,24 +194,30 @@ impl RenderScope { .take(height as usize) .collect::>() .join("\n"), + (self.parent_width, self.parent_height), ), } for m in &self.render_stack { match m { RenderMethod::Text(x, y, t) => { + if *y + self.transform.y >= self.parent_height { + continue; + } if let Some(c) = self.style.foreground { utils::print_liner( self.transform.x + self.transform.px + x, self.transform.y + self.transform.py + y, &utils::hex_ansi(c), t, + (self.parent_width, self.parent_height), ); } else { utils::print( self.transform.x + self.transform.px, self.transform.y + self.transform.py, t, + (self.parent_width, self.parent_height), ); } } @@ -220,12 +228,14 @@ impl RenderScope { self.transform.y + self.transform.py + y, &utils::hex_ansi_bg(c), t, + (self.parent_width, self.parent_height), ); } else { utils::print( self.transform.x + self.transform.px, self.transform.y + self.transform.py, t, + (self.parent_width, self.parent_height), ); } } @@ -234,18 +244,18 @@ impl RenderScope { self.transform.y + self.transform.py + y, &utils::hex_ansi(*c), t, + (self.parent_width, self.parent_height), + ), + RenderMethod::Rectangle(x, y, width, height, color) => utils::print_liner( + self.transform.x + self.transform.px + x, + self.transform.y + self.transform.py + y, + &hex_ansi_bg(*color), + &std::iter::repeat(" ".repeat(*width as usize)) + .take(*height as usize) + .collect::>() + .join("\n"), + (self.parent_width, self.parent_height), ), - RenderMethod::Rectangle(x, y, width, height, color) => { - utils::print_liner( - self.transform.x + self.transform.px + x, - self.transform.y + self.transform.py + y, - &hex_ansi_bg(*color), - &std::iter::repeat(" ".repeat(*width as usize)) - .take(*height as usize) - .collect::>() - .join("\n"), - ); - } } } } diff --git a/src/utils.rs b/src/utils.rs index 031149f..4a20819 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -107,15 +107,21 @@ pub fn hex_ansi_bg(hex: u32) -> String { format!("\x1b[48;2;{r};{g};{b}m") } -pub(crate) fn print(x: u16, y: u16, text: &str) { +pub(crate) fn print(x: u16, y: u16, text: &str, area: (u16, u16)) { for (i, line) in text.lines().enumerate() { + if y + i as u16 >= area.1 { + break; + } print!("\x1b[{};{}H{line}\x1b[0m", y + i as u16 + 1, x + 1); flush().unwrap(); } } -pub(crate) fn print_liner(x: u16, y: u16, liner: &str, text: &str) { +pub(crate) fn print_liner(x: u16, y: u16, liner: &str, text: &str, area: (u16, u16)) { for (i, line) in text.lines().enumerate() { + if y + i as u16 >= area.1 { + break; + } print!("\x1b[{};{}H{liner}{line}\x1b[0m", y + i as u16 + 1, x + 1); flush().unwrap(); }