diff --git a/src/elements/flex/column.rs b/src/elements/flex/column.rs new file mode 100644 index 0000000..b1a4436 --- /dev/null +++ b/src/elements/flex/column.rs @@ -0,0 +1,98 @@ +use std::sync::Arc; + +use crate::{ + prelude::ElementRenderer, + style::RawTransform, + widget::{Element, Widget}, + NoRenderRoot, +}; + +pub struct ColumnRenderer<'a>(&'a mut RawTransform, u16, &'a mut u16); + +pub struct FlexCol { + pub gap: u16, + children: Vec>, + render: (u16, u16), +} + +impl FlexCol { + pub fn new() -> Self { + Self { + children: Vec::new(), + gap: 0, + render: (0, 0), + } + } +} + +impl Element for FlexCol { + fn render( + &mut self, + scope: &mut crate::prelude::RenderScope, + _: &crate::render_scope::RenderContext, + ) { + scope.use_area(self.render.0, self.render.1); + } + + fn after_render( + &mut self, + parent_scope: &mut crate::render_scope::RenderScope, + render_context: &crate::render_scope::RenderContext, + ) { + let mut transform = { + let (width, height) = parent_scope.get_size_or_parent(); + let mut t = parent_scope.get_transform().clone(); + t.width = width; + t.height = height; + t.transform_parent(parent_scope.get_parent_transform()); + t + }; + + let mut scope = crate::render_scope::RenderScope::new(); + scope.set_parent_transform(transform.clone()); + + transform.width = 0; + 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); + } + + self.render = (transform.width, transform.height); + } + + fn draw_child(&mut self, element: &Arc) { + self.children.push(element.clone()); + element.inject(|w| w.component(NoRenderRoot)); + } + + fn is_ghost(&mut self) -> bool { + true + } + + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } +} + +impl ElementRenderer for ColumnRenderer<'_> { + fn before_draw(&mut self, scope: &mut crate::prelude::RenderScope, _widget: &Arc) { + let t = scope.get_transform_mut(); + // self.0.width = self.0.width.max(*self.2 + t.width + (t.px * 2)); + self.0.height = self.0.height.max(t.height + (t.py * 2)); + + t.x += self.0.x + *self.2; + t.y += self.0.y; + *self.2 += t.width + self.1 + (t.px * 2); + + t.px += self.0.px; + t.py += self.0.py; + + self.0.width += t.width + (t.px * 2) + self.1; + t.offset_y = self.0.offset_y; + } +} diff --git a/src/elements/flex/mod.rs b/src/elements/flex/mod.rs new file mode 100644 index 0000000..48c6444 --- /dev/null +++ b/src/elements/flex/mod.rs @@ -0,0 +1,5 @@ +mod row; +pub use row::*; + +mod column; +pub use column::*; diff --git a/src/elements/flex.rs b/src/elements/flex/row.rs similarity index 53% rename from src/elements/flex.rs rename to src/elements/flex/row.rs index 53b5665..902ceb3 100644 --- a/src/elements/flex.rs +++ b/src/elements/flex/row.rs @@ -8,7 +8,6 @@ use crate::{ }; pub struct RowRenderer<'a>(&'a mut RawTransform, u16, &'a mut u16); -pub struct ColumnRenderer<'a>(&'a mut RawTransform, u16, &'a mut u16); pub struct FlexRow { pub gap: u16, @@ -16,12 +15,6 @@ pub struct FlexRow { render: (u16, u16), } -pub struct FlexCol { - pub gap: u16, - children: Vec>, - render: (u16, u16), -} - impl FlexRow { pub fn new() -> Self { Self { @@ -32,16 +25,6 @@ impl FlexRow { } } -impl FlexCol { - pub fn new() -> Self { - Self { - children: Vec::new(), - gap: 0, - render: (0, 0), - } - } -} - impl Element for FlexRow { fn render( &mut self, @@ -102,60 +85,6 @@ impl Element for FlexRow { } } -impl Element for FlexCol { - fn render( - &mut self, - scope: &mut crate::prelude::RenderScope, - _: &crate::render_scope::RenderContext, - ) { - scope.use_area(self.render.0, self.render.1); - } - - fn after_render( - &mut self, - parent_scope: &mut crate::render_scope::RenderScope, - render_context: &crate::render_scope::RenderContext, - ) { - let mut transform = { - let (width, height) = parent_scope.get_size_or_parent(); - let mut t = parent_scope.get_transform().clone(); - t.width = width; - t.height = height; - t.transform_parent(parent_scope.get_parent_transform()); - t - }; - - let mut scope = crate::render_scope::RenderScope::new(); - scope.set_parent_transform(transform.clone()); - - transform.width = 0; - 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); - } - - self.render = (transform.width, transform.height); - } - - fn draw_child(&mut self, element: &Arc) { - self.children.push(element.clone()); - element.inject(|w| w.component(NoRenderRoot)); - } - - fn is_ghost(&mut self) -> bool { - true - } - - fn as_any(&self) -> &dyn std::any::Any { - self - } - - fn as_any_mut(&mut self) -> &mut dyn std::any::Any { - self - } -} - impl ElementRenderer for RowRenderer<'_> { fn before_draw(&mut self, scope: &mut crate::prelude::RenderScope, _widget: &Arc) { let t = scope.get_transform_mut(); @@ -173,21 +102,3 @@ impl ElementRenderer for RowRenderer<'_> { t.offset_y = self.0.offset_y; } } - -impl ElementRenderer for ColumnRenderer<'_> { - fn before_draw(&mut self, scope: &mut crate::prelude::RenderScope, _widget: &Arc) { - let t = scope.get_transform_mut(); - // self.0.width = self.0.width.max(*self.2 + t.width + (t.px * 2)); - self.0.height = self.0.height.max(t.height + (t.py * 2)); - - t.x += self.0.x + *self.2; - t.y += self.0.y; - *self.2 += t.width + self.1 + (t.px * 2); - - t.px += self.0.px; - t.py += self.0.py; - - self.0.width += t.width + (t.px * 2) + self.1; - t.offset_y = self.0.offset_y; - } -}