diff --git a/src/elements/div.rs b/src/elements/div.rs index f93b51a..222c89b 100644 --- a/src/elements/div.rs +++ b/src/elements/div.rs @@ -8,16 +8,17 @@ use crate::{ pub struct Div { color: u32, children: Mutex>>, + size: (u16, u16), } -impl Element for Arc
{ +impl Element for Div { fn render(&mut self, scope: &mut crate::render_scope::RenderScope) { - let (width, height) = scope.get_size_or_parent(); + let (width, height) = scope.get_size_or(self.size.0, self.size.1); scope.draw_rect(width, height, self.color); } fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) { - let transform = scope.get_transform().clone(); + let mut transform = scope.get_transform().clone(); let (w, h) = scope.get_parent_size(); scope.set_parent_size(transform.width, transform.height); @@ -31,6 +32,8 @@ impl Element for Arc
{ scope.set_transform(&t); } let t = scope.get_transform_mut(); + transform.width = transform.width.max(t.x + t.width); + transform.height = transform.height.max(t.y + t.height); t.x += transform.x; t.y += transform.y; @@ -39,6 +42,7 @@ impl Element for Arc
{ scope.clear(); } scope.set_parent_size(w, h); + self.size = (transform.width, transform.height); } fn draw_child(&self, element: &Arc) { @@ -56,10 +60,11 @@ impl Element for Arc
{ } impl Div { - pub fn new(color: u32) -> Arc { - Arc::new(Div { + pub fn new(color: u32) -> Self { + Div { color, children: Mutex::new(Vec::new()), - }) + size: (0, 0), + } } } diff --git a/src/render_scope.rs b/src/render_scope.rs index db7df80..8d4a8d4 100644 --- a/src/render_scope.rs +++ b/src/render_scope.rs @@ -35,7 +35,7 @@ impl RenderScope { } pub fn set_transform(&mut self, transform: &Transform) { - transform.use_dimensions(&mut self.transform); + transform.use_dimensions(self.parent_width, self.parent_height, &mut self.transform); transform.use_position(self.parent_width, self.parent_height, &mut self.transform); } diff --git a/src/style.rs b/src/style.rs index c71b2e7..a255b54 100644 --- a/src/style.rs +++ b/src/style.rs @@ -17,7 +17,8 @@ pub enum Position { #[derive(Debug, Clone)] pub enum Dimension { - Auto, + Full, + Content, Const(u16), } @@ -37,8 +38,8 @@ impl Transform { y: Position::Const(0), mx: 0, my: 0, - width: Dimension::Auto, - height: Dimension::Auto, + width: Dimension::Content, + height: Dimension::Content, } } @@ -48,8 +49,8 @@ impl Transform { y: Position::Center, mx: 0, my: 0, - width: Dimension::Auto, - height: Dimension::Auto, + width: Dimension::Content, + height: Dimension::Content, } } @@ -75,9 +76,9 @@ impl Transform { self } - pub fn use_dimensions(&self, raw: &mut RawTransform) { - self.width.use_dimension(&mut raw.width); - self.height.use_dimension(&mut raw.height); + pub fn use_dimensions(&self, parent_width: u16, parent_height: u16, raw: &mut RawTransform) { + self.width.use_dimension(parent_width, &mut raw.width); + self.height.use_dimension(parent_height, &mut raw.height); } pub fn use_position(&self, parent_width: u16, parent_height: u16, raw: &mut RawTransform) { @@ -100,9 +101,10 @@ impl RawTransform { } impl Dimension { - pub fn use_dimension(&self, r: &mut u16) { + pub fn use_dimension(&self, parent: u16, r: &mut u16) { match self { - Self::Auto => {} + Self::Full => *r = parent, + Self::Content => {} Self::Const(n) => *r = *n, } }