Updated RenderScope with positions

This commit is contained in:
2025-08-02 17:07:09 -05:00
parent ec3576e6db
commit ba04a82980
3 changed files with 59 additions and 25 deletions
+9 -5
View File
@@ -32,11 +32,15 @@ impl Element for Heading {
} }
} }
if let Some(t) = self.font.convert(&s) { if let Some(t) = self.font.convert(&s) {
scope.draw_text(&if self.smooth { scope.draw_text(
format!("{t}").replace("-", "─").replace("|", "│") 0,
} else { 0,
format!("{t}") &if self.smooth {
}); format!("{t}").replace("-", "─").replace("|", "│")
} else {
format!("{t}")
},
);
} }
} }
+4 -2
View File
@@ -1,16 +1,18 @@
pub mod div; pub mod div;
pub mod flex; pub mod flex;
pub mod heading; pub mod heading;
pub mod input;
pub use div::*; pub use div::*;
pub use flex::*; pub use flex::*;
pub use heading::*; pub use heading::*;
pub use input::*;
use crate::Element; use crate::Element;
impl Element for String { impl Element for String {
fn render(&mut self, scope: &mut crate::render_scope::RenderScope) { fn render(&mut self, scope: &mut crate::render_scope::RenderScope) {
scope.draw_text(self); scope.draw_text(0, 0, self);
} }
fn as_any(&self) -> &dyn std::any::Any { fn as_any(&self) -> &dyn std::any::Any {
@@ -24,7 +26,7 @@ impl Element for String {
impl Element for (String, u32) { impl Element for (String, u32) {
fn render(&mut self, scope: &mut crate::render_scope::RenderScope) { fn render(&mut self, scope: &mut crate::render_scope::RenderScope) {
scope.draw_text_colored(&self.0, self.1); scope.draw_text_colored(0, 0, &self.0, self.1);
} }
fn as_any(&self) -> &dyn std::any::Any { fn as_any(&self) -> &dyn std::any::Any {
+46 -18
View File
@@ -19,11 +19,13 @@ use crate::{
#[derive(Clone)] #[derive(Clone)]
enum RenderMethod { enum RenderMethod {
/// Plain text rendering at current transform. /// Plain text rendering at current transform.
Text(String), Text(u16, u16, String),
/// Plain text rendering at current transform with the bg and fg swapped.
TextInverted(u16, u16, String),
/// Text rendered with a specific 24-bit color. /// Text rendered with a specific 24-bit color.
TextColored(String, u32), TextColored(u16, u16, String, u32),
/// A filled rectangle of a given size and background color. /// A filled rectangle of a given size and background color.
Rectangle(u16, u16, u32), Rectangle(u16, u16, u16, u16, u32),
} }
/// Stores renderable state and transformation data for a single UI widget. /// Stores renderable state and transformation data for a single UI widget.
@@ -65,26 +67,36 @@ impl RenderScope {
} }
/// Adds a text draw instruction. /// Adds a text draw instruction.
pub fn draw_text(&mut self, text: &str) { pub fn draw_text(&mut self, x: u16, y: u16, text: &str) {
self.render_stack.push(RenderMethod::Text(text.to_string())); self.render_stack
.push(RenderMethod::Text(x, y, text.to_string()));
let (w, h) = utils::str_size(text);
self.transform.width = self.transform.width.max(w);
self.transform.height = self.transform.height.max(h);
}
/// Adds a text draw instruction.
pub fn draw_text_inverted(&mut self, x: u16, y: u16, text: &str) {
self.render_stack
.push(RenderMethod::TextInverted(x, y, text.to_string()));
let (w, h) = utils::str_size(text); let (w, h) = utils::str_size(text);
self.transform.width = self.transform.width.max(w); self.transform.width = self.transform.width.max(w);
self.transform.height = self.transform.height.max(h); self.transform.height = self.transform.height.max(h);
} }
/// Adds a colored text draw instruction. /// Adds a colored text draw instruction.
pub fn draw_text_colored(&mut self, text: &str, color: u32) { pub fn draw_text_colored(&mut self, x: u16, y: u16, text: &str, color: u32) {
self.render_stack self.render_stack
.push(RenderMethod::TextColored(text.to_string(), color)); .push(RenderMethod::TextColored(x, y, text.to_string(), color));
let (w, h) = utils::str_size(text); let (w, h) = utils::str_size(text);
self.transform.width = self.transform.width.max(w); self.transform.width = self.transform.width.max(w);
self.transform.height = self.transform.height.max(h); self.transform.height = self.transform.height.max(h);
} }
/// Adds a background rectangle draw instruction. /// Adds a background rectangle draw instruction.
pub fn draw_rect(&mut self, width: u16, height: u16, color: u32) { pub fn draw_rect(&mut self, x: u16, y: u16, width: u16, height: u16, color: u32) {
self.render_stack self.render_stack
.push(RenderMethod::Rectangle(width, height, color)); .push(RenderMethod::Rectangle(x, y, width, height, color));
self.transform.width = self.transform.width.max(width); self.transform.width = self.transform.width.max(width);
self.transform.height = self.transform.height.max(height); self.transform.height = self.transform.height.max(height);
} }
@@ -152,11 +164,11 @@ impl RenderScope {
for m in &self.render_stack { for m in &self.render_stack {
match m { match m {
RenderMethod::Text(t) => { RenderMethod::Text(x, y, t) => {
if let Some(c) = self.style.foreground { if let Some(c) = self.style.foreground {
utils::print_liner( utils::print_liner(
self.transform.x + self.transform.px, self.transform.x + self.transform.px + x,
self.transform.y + self.transform.py, self.transform.y + self.transform.py + y,
&utils::hex_ansi(c), &utils::hex_ansi(c),
t, t,
); );
@@ -168,16 +180,32 @@ impl RenderScope {
); );
} }
} }
RenderMethod::TextColored(t, c) => utils::print_liner( RenderMethod::TextInverted(x, y, t) => {
self.transform.x + self.transform.px, if let Some(c) = self.style.foreground {
self.transform.y + self.transform.py, utils::print_liner(
self.transform.x + self.transform.px + x,
self.transform.y + self.transform.py + y,
&utils::hex_ansi_bg(c),
t,
);
} else {
utils::print(
self.transform.x + self.transform.px,
self.transform.y + self.transform.py,
t,
);
}
}
RenderMethod::TextColored(x, y, t, c) => utils::print_liner(
self.transform.x + self.transform.px + x,
self.transform.y + self.transform.py + y,
&utils::hex_ansi(*c), &utils::hex_ansi(*c),
t, t,
), ),
RenderMethod::Rectangle(width, height, color) => { RenderMethod::Rectangle(x, y, width, height, color) => {
utils::print_liner( utils::print_liner(
self.transform.x + self.transform.px, self.transform.x + self.transform.px + x,
self.transform.y + self.transform.py, self.transform.y + self.transform.py + y,
&hex_ansi_bg(*color), &hex_ansi_bg(*color),
&std::iter::repeat(" ".repeat(*width as usize)) &std::iter::repeat(" ".repeat(*width as usize))
.take(*height as usize) .take(*height as usize)