diff --git a/src/main.rs b/src/main.rs index 71e0ee6..0ba3eb1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,7 +13,7 @@ fn main() { screen .draw("Hello, World".to_string()) - .component(Transform::new()); + .component(Transform::center()); screen.run(&mut events, &mut extensions).unwrap(); } diff --git a/src/render_scope.rs b/src/render_scope.rs index 092f169..bd4dc19 100644 --- a/src/render_scope.rs +++ b/src/render_scope.rs @@ -10,8 +10,6 @@ enum RenderMethod { pub struct RenderScope { transform: RawTransform, render_stack: Vec, - width: u16, - height: u16, parent_width: u16, parent_height: u16, } @@ -21,22 +19,22 @@ impl RenderScope { RenderScope { transform: RawTransform::new(), render_stack: Vec::new(), - width: 0, - height: 0, parent_width: 0, parent_height: 0, } } pub fn set_transform(&mut self, transform: &Transform) { + (self.parent_width, self.parent_height) = crossterm::terminal::size().unwrap(); transform.use_dimensions(&mut self.transform); + transform.use_position(self.parent_width, self.parent_height, &mut self.transform); } pub fn draw_text(&mut self, text: &str) { self.render_stack.push(RenderMethod::Text(text.to_string())); let (w, h) = utils::str_size(text); - self.width = std::cmp::max(self.width, w); - self.height = std::cmp::max(self.height, h); + self.transform.width = self.transform.width.max(w); + self.transform.height = self.transform.height.max(h); } pub fn draw(&self) { diff --git a/src/style.rs b/src/style.rs index d437b44..161d8de 100644 --- a/src/style.rs +++ b/src/style.rs @@ -58,6 +58,11 @@ impl Transform { self.width.use_dimension(&mut raw.width); self.height.use_dimension(&mut raw.height); } + + pub fn use_position(&self, parent_width: u16, parent_height: u16, raw: &mut RawTransform) { + self.x.use_position(raw.width, parent_width, &mut raw.x); + self.y.use_position(raw.height, parent_height, &mut raw.y); + } } impl RawTransform { @@ -74,8 +79,17 @@ impl RawTransform { impl Dimension { pub fn use_dimension(&self, r: &mut u16) { match self { - Dimension::Auto => {} - Dimension::Const(n) => *r = *n, + Self::Auto => {} + Self::Const(n) => *r = *n, + } + } +} + +impl Position { + pub fn use_position(&self, size: u16, parent: u16, r: &mut u16) { + match self { + Self::Center => *r = (parent - size) / 2, + Self::Const(n) => *r = *n, } } }