From 2b879ad51d2ade8892331dec903995c259801f45 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Thu, 3 Jul 2025 00:17:24 +0200 Subject: [PATCH] div centering works but there's a bug --- src/elements/div.rs | 2 +- src/main.rs | 7 ++++--- src/render.rs | 44 +++++++++++++++++++++++++++++++++++++++----- src/style.rs | 1 + 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/elements/div.rs b/src/elements/div.rs index 981b5be..875a1a0 100644 --- a/src/elements/div.rs +++ b/src/elements/div.rs @@ -26,7 +26,7 @@ impl Element for Div { } } - scope.draw_buf(scope_parent.get_buffer_mut(), 0, 0); + scope_parent.merge(scope, 0, 0); } fn as_any(&self) -> &dyn std::any::Any { diff --git a/src/main.rs b/src/main.rs index 19ebb58..1a1a1eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,10 +20,11 @@ fn main() { let mut d = Div::new(); - d.draw("test".to_string()); - d.draw("abc".to_string()).component(Transform::center()); + d.draw("test".to_string()) + .component(Transform::new().margin(20, 0)); + d.draw("abcsdsd".to_string()); - app.draw(d); + app.draw(d).component(Transform::center()); app.run().unwrap(); } diff --git a/src/render.rs b/src/render.rs index 9682ca4..94128ea 100644 --- a/src/render.rs +++ b/src/render.rs @@ -11,13 +11,16 @@ const FONT: &[u8] = include_bytes!("../assets/DejaVuSans.ttf"); pub enum RenderMethod { Text(String, usize, usize, f32, u32), Rectangle(usize, usize, usize, usize, u32), + Merge(RenderScope, usize, usize), } +#[derive(Debug, Clone)] pub struct RenderScope { transform: RawTransform, render_stack: Vec, parent_width: usize, parent_height: usize, + max_size: (usize, usize), buffer: Vec>, } @@ -29,14 +32,10 @@ impl RenderScope { parent_width: w, parent_height: h, transform: RawTransform::new(), + max_size: (0, 0), } } - pub fn set_transform(&mut self, transform: &Transform) { - transform.use_dimensions(&mut self.transform); - transform.use_position(self.parent_width, self.parent_height, &mut self.transform); - } - pub fn draw_text(&mut self, x: usize, y: usize, scale: f32, text: &str, color: u32) { self.render_stack .push(RenderMethod::Text(text.to_string(), x, y, scale, color)); @@ -44,6 +43,7 @@ impl RenderScope { let (w, h) = utils::measure_text(&font, &text, Scale::uniform(scale)); self.transform.width = self.transform.width.max(w as usize); self.transform.height = self.transform.height.max(h as usize); + self.update_size(); } pub fn draw_rect(&mut self, x: usize, y: usize, width: usize, height: usize, color: u32) { @@ -51,8 +51,21 @@ impl RenderScope { .push(RenderMethod::Rectangle(x, y, width, height, color)); self.transform.width = self.transform.width.max(width); self.transform.height = self.transform.height.max(height); + self.update_size(); } + pub fn merge(&mut self, scope: RenderScope, offset_x: usize, offset_y: usize) { + let (w, h) = scope.get_max_size(); + self.render_stack + .push(RenderMethod::Merge(scope, offset_x, offset_y)); + self.transform.width = self.transform.width.max(w as usize); + self.transform.height = self.transform.height.max(h as usize); + self.update_size(); + } +} + +// After draw +impl RenderScope { pub fn draw(&mut self) { let mut tmp = self.buffer.clone(); self.draw_buf(&mut tmp, 0, 0); @@ -114,9 +127,26 @@ impl RenderScope { } } } + RenderMethod::Merge(scope, ox, oy) => { + scope.draw_buf(buf, *ox + self.transform.x, *oy + self.transform.y); + } } } } +} + +// Update or variable functions + +impl RenderScope { + pub fn set_transform(&mut self, transform: &Transform) { + transform.use_dimensions(&mut self.transform); + transform.use_position(self.parent_width, self.parent_height, &mut self.transform); + } + + pub fn update_size(&mut self) { + self.max_size.0 = self.max_size.0.max(self.transform.width); + self.max_size.1 = self.max_size.1.max(self.transform.height); + } pub fn clear(&mut self) { self.render_stack.clear(); @@ -128,6 +158,10 @@ impl RenderScope { (self.transform.width, self.transform.height) } + pub fn get_max_size(&self) -> (usize, usize) { + self.max_size + } + pub fn get_size_or_parent(&self) -> (usize, usize) { ( if self.transform.width > 0 { diff --git a/src/style.rs b/src/style.rs index b08932e..da3cdeb 100644 --- a/src/style.rs +++ b/src/style.rs @@ -1,5 +1,6 @@ use crate::component; +#[derive(Debug, Clone)] pub struct RawTransform { pub x: usize, pub y: usize,