diff --git a/src/render_scope.rs b/src/render_scope.rs index 02429bc..f1c6386 100644 --- a/src/render_scope.rs +++ b/src/render_scope.rs @@ -84,23 +84,10 @@ impl RenderScope { } } - /// Directly sets the raw transform (position and size) for this scope. - pub fn set_transform_raw(&mut self, transform: RawTransform) { - self.transform = transform; - } - /// Applies a `Transform` to this scope, factoring in parent dimensions. - pub fn set_transform(&mut self, transform: &Transform) { - transform.use_dimensions( - self.parent_transform.width, - self.parent_transform.height, - &mut self.transform, - ); - transform.use_position( - self.parent_transform.width, - self.parent_transform.height, - &mut self.transform, - ); + pub fn apply_transform(&mut self, transform: &Transform) { + transform.use_dimensions(&self.parent_transform, &mut self.transform); + transform.use_position(&self.parent_transform, &mut self.transform); self.transform.px = transform.px; self.transform.py = transform.py; } @@ -114,7 +101,7 @@ impl RenderScope { self.transform.height = self.transform.height.max(h); } - /// Adds a text draw instruction. + /// Adds a text draw instruction (inverted colors). pub fn draw_text_inverted(&mut self, x: u16, y: u16, text: &str) { self.render_stack .push(RenderMethod::TextInverted(x, y, text.to_string())); @@ -164,13 +151,14 @@ impl RenderScope { utils::print_liner( self.transform.x, self.transform.y, + &self.transform, + &self.parent_transform, &utils::hex_ansi(c), &format!( "┌{d}┐{}\n└{d}┘", format!("\n│{}│", " ".repeat(width as usize - 2)) .repeat(height as usize - 2), ), - &self.parent_transform, ); } } @@ -182,25 +170,27 @@ impl RenderScope { utils::print_liner( self.transform.x, self.transform.y, + &self.transform, + &self.parent_transform, &utils::hex_ansi(c), &format!( "╭{d}╮{}\n╰{d}╯", format!("\n│{}│", " ".repeat(width as usize - 2)) .repeat(height as usize - 2), ), - &self.parent_transform, ); } } crate::style::Background::Solid(c) => utils::print_liner( self.transform.x, self.transform.y, + &self.transform, + &self.parent_transform, &hex_ansi_bg(c), &std::iter::repeat(" ".repeat(width as usize)) .take(height as usize) .collect::>() .join("\n"), - &self.parent_transform, ), } @@ -209,55 +199,49 @@ impl RenderScope { RenderMethod::Text(x, y, t) => { if let Some(c) = self.style.foreground { utils::print_liner( - self.transform.x + self.transform.px + x, - self.transform.y + self.transform.py + y, + *x, + *y, + &self.transform, + &self.parent_transform, &utils::hex_ansi(c), t, - &self.parent_transform, ); } else { - utils::print( - self.transform.x + self.transform.px, - self.transform.y + self.transform.py, - t, - &self.parent_transform, - ); + utils::print(*x, *y, &self.transform, &self.parent_transform, t); } } RenderMethod::TextInverted(x, y, t) => { if let Some(c) = self.style.foreground { utils::print_liner( - self.transform.x + self.transform.px + x, - self.transform.y + self.transform.py + y, + *x, + *y, + &self.transform, + &self.parent_transform, &utils::hex_ansi_bg(c), t, - &self.parent_transform, ); } else { - utils::print( - self.transform.x + self.transform.px, - self.transform.y + self.transform.py, - t, - &self.parent_transform, - ); + utils::print(*x, *y, &self.transform, &self.parent_transform, t); } } RenderMethod::TextColored(x, y, t, c) => utils::print_liner( - self.transform.x + self.transform.px + x, - self.transform.y + self.transform.py + y, + *x, + *y, + &self.transform, + &self.parent_transform, &utils::hex_ansi(*c), t, - &self.parent_transform, ), - 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), + RenderMethod::Rectangle(x, y, width, height, c) => utils::print_liner( + *x, + *y, + &self.transform, + &self.parent_transform, + &utils::hex_ansi_bg(*c), &std::iter::repeat(" ".repeat(*width as usize)) .take(*height as usize) .collect::>() .join("\n"), - &self.parent_transform, ), } } @@ -306,22 +290,27 @@ impl RenderScope { }, ) } + /// Returns parent size. + pub fn get_parent_size(&self) -> (u16, u16) { + (self.parent_transform.width, self.parent_transform.height) + } /// Gets the dimensions of the parent container. pub fn get_parent_transform(&self) -> &RawTransform { &self.parent_transform } - /// Sets the dimensions of the parent container. - // pub fn set_parent_size(&mut self, width: u16, height: u16) { - // self.parent_transform.width = width; - // self.parent_transform.height = height; - // } - + /// Sets the transform of the parent container. pub fn set_parent_transform(&mut self, transform: RawTransform) { self.parent_transform = transform; } + /// Sets the transform of the parent container. + pub fn set_parent_size(&mut self, width: u16, height: u16) { + self.parent_transform.width = width; + self.parent_transform.height = height; + } + /// Returns a mutable reference to the internal raw transform. pub fn get_transform_mut(&mut self) -> &mut RawTransform { &mut self.transform @@ -364,14 +353,14 @@ impl RenderScope { self.set_style(style); } if let Some(t) = widget.get() { - self.set_transform(&t); + self.apply_transform(&t); } widget.get_elem().render(self, &render_context); ctx.render(widget, self); if let Some(t) = widget.get() { - self.set_transform(&t); + self.apply_transform(&t); } renderer.before_draw(self, widget); diff --git a/src/style.rs b/src/style.rs index a7abc1d..c61d7d3 100644 --- a/src/style.rs +++ b/src/style.rs @@ -146,17 +146,19 @@ impl Transform { } /// Resolves `Dimension` rules into absolute values for the given parent size. - 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_dimensions(&self, parent_transform: &RawTransform, raw: &mut RawTransform) { + self.width + .use_dimension(parent_transform.width, &mut raw.width); + self.height + .use_dimension(parent_transform.height, &mut raw.height); } /// Resolves `Position` rules into absolute positions for the given parent size. - pub fn use_position(&self, parent_width: u16, parent_height: u16, raw: &mut RawTransform) { + pub fn use_position(&self, parent_transform: &RawTransform, raw: &mut RawTransform) { self.x - .use_position(raw.width, parent_width, self.mx, &mut raw.x); + .use_position(raw.width, parent_transform.width, self.mx, &mut raw.x); self.y - .use_position(raw.height, parent_height, self.my, &mut raw.y); + .use_position(raw.height, parent_transform.height, self.my, &mut raw.y); } } diff --git a/src/utils.rs b/src/utils.rs index 59ebde8..d6304fe 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -109,13 +109,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, parent_transform: &RawTransform) { +pub(crate) fn print( + x: u16, + y: u16, + transform: &RawTransform, + parent_transform: &RawTransform, + text: &str, +) { + let x = transform.x + transform.px + x; + for (i, line) in text.lines().enumerate() { if parent_transform.offset_y > y + i as u16 { continue; } - let y = y + i as u16 - parent_transform.offset_y; + let y = transform.y + transform.py + y + i as u16 - parent_transform.offset_y; if y >= parent_transform.height + parent_transform.y + parent_transform.py { break; @@ -128,16 +136,19 @@ pub(crate) fn print(x: u16, y: u16, text: &str, parent_transform: &RawTransform) pub(crate) fn print_liner( x: u16, y: u16, + transform: &RawTransform, + parent_transform: &RawTransform, liner: &str, text: &str, - parent_transform: &RawTransform, ) { + let x = transform.x + transform.px + x; + for (i, line) in text.lines().enumerate() { if parent_transform.offset_y > y + i as u16 { continue; } - let y = y + i as u16 - parent_transform.offset_y; + let y = transform.y + transform.py + y + i as u16 - parent_transform.offset_y; if y >= parent_transform.height + parent_transform.y + parent_transform.py { break;