Refactored render scope
This commit is contained in:
+43
-54
@@ -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.
|
/// Applies a `Transform` to this scope, factoring in parent dimensions.
|
||||||
pub fn set_transform(&mut self, transform: &Transform) {
|
pub fn apply_transform(&mut self, transform: &Transform) {
|
||||||
transform.use_dimensions(
|
transform.use_dimensions(&self.parent_transform, &mut self.transform);
|
||||||
self.parent_transform.width,
|
transform.use_position(&self.parent_transform, &mut self.transform);
|
||||||
self.parent_transform.height,
|
|
||||||
&mut self.transform,
|
|
||||||
);
|
|
||||||
transform.use_position(
|
|
||||||
self.parent_transform.width,
|
|
||||||
self.parent_transform.height,
|
|
||||||
&mut self.transform,
|
|
||||||
);
|
|
||||||
self.transform.px = transform.px;
|
self.transform.px = transform.px;
|
||||||
self.transform.py = transform.py;
|
self.transform.py = transform.py;
|
||||||
}
|
}
|
||||||
@@ -114,7 +101,7 @@ impl RenderScope {
|
|||||||
self.transform.height = self.transform.height.max(h);
|
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) {
|
pub fn draw_text_inverted(&mut self, x: u16, y: u16, text: &str) {
|
||||||
self.render_stack
|
self.render_stack
|
||||||
.push(RenderMethod::TextInverted(x, y, text.to_string()));
|
.push(RenderMethod::TextInverted(x, y, text.to_string()));
|
||||||
@@ -164,13 +151,14 @@ impl RenderScope {
|
|||||||
utils::print_liner(
|
utils::print_liner(
|
||||||
self.transform.x,
|
self.transform.x,
|
||||||
self.transform.y,
|
self.transform.y,
|
||||||
|
&self.transform,
|
||||||
|
&self.parent_transform,
|
||||||
&utils::hex_ansi(c),
|
&utils::hex_ansi(c),
|
||||||
&format!(
|
&format!(
|
||||||
"┌{d}┐{}\n└{d}┘",
|
"┌{d}┐{}\n└{d}┘",
|
||||||
format!("\n│{}│", " ".repeat(width as usize - 2))
|
format!("\n│{}│", " ".repeat(width as usize - 2))
|
||||||
.repeat(height as usize - 2),
|
.repeat(height as usize - 2),
|
||||||
),
|
),
|
||||||
&self.parent_transform,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -182,25 +170,27 @@ impl RenderScope {
|
|||||||
utils::print_liner(
|
utils::print_liner(
|
||||||
self.transform.x,
|
self.transform.x,
|
||||||
self.transform.y,
|
self.transform.y,
|
||||||
|
&self.transform,
|
||||||
|
&self.parent_transform,
|
||||||
&utils::hex_ansi(c),
|
&utils::hex_ansi(c),
|
||||||
&format!(
|
&format!(
|
||||||
"╭{d}╮{}\n╰{d}╯",
|
"╭{d}╮{}\n╰{d}╯",
|
||||||
format!("\n│{}│", " ".repeat(width as usize - 2))
|
format!("\n│{}│", " ".repeat(width as usize - 2))
|
||||||
.repeat(height as usize - 2),
|
.repeat(height as usize - 2),
|
||||||
),
|
),
|
||||||
&self.parent_transform,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
crate::style::Background::Solid(c) => utils::print_liner(
|
crate::style::Background::Solid(c) => utils::print_liner(
|
||||||
self.transform.x,
|
self.transform.x,
|
||||||
self.transform.y,
|
self.transform.y,
|
||||||
|
&self.transform,
|
||||||
|
&self.parent_transform,
|
||||||
&hex_ansi_bg(c),
|
&hex_ansi_bg(c),
|
||||||
&std::iter::repeat(" ".repeat(width as usize))
|
&std::iter::repeat(" ".repeat(width as usize))
|
||||||
.take(height as usize)
|
.take(height as usize)
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
.join("\n"),
|
.join("\n"),
|
||||||
&self.parent_transform,
|
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,55 +199,49 @@ impl RenderScope {
|
|||||||
RenderMethod::Text(x, y, 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 + x,
|
*x,
|
||||||
self.transform.y + self.transform.py + y,
|
*y,
|
||||||
|
&self.transform,
|
||||||
|
&self.parent_transform,
|
||||||
&utils::hex_ansi(c),
|
&utils::hex_ansi(c),
|
||||||
t,
|
t,
|
||||||
&self.parent_transform,
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
utils::print(
|
utils::print(*x, *y, &self.transform, &self.parent_transform, t);
|
||||||
self.transform.x + self.transform.px,
|
|
||||||
self.transform.y + self.transform.py,
|
|
||||||
t,
|
|
||||||
&self.parent_transform,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RenderMethod::TextInverted(x, y, t) => {
|
RenderMethod::TextInverted(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 + x,
|
*x,
|
||||||
self.transform.y + self.transform.py + y,
|
*y,
|
||||||
|
&self.transform,
|
||||||
|
&self.parent_transform,
|
||||||
&utils::hex_ansi_bg(c),
|
&utils::hex_ansi_bg(c),
|
||||||
t,
|
t,
|
||||||
&self.parent_transform,
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
utils::print(
|
utils::print(*x, *y, &self.transform, &self.parent_transform, t);
|
||||||
self.transform.x + self.transform.px,
|
|
||||||
self.transform.y + self.transform.py,
|
|
||||||
t,
|
|
||||||
&self.parent_transform,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RenderMethod::TextColored(x, y, t, c) => utils::print_liner(
|
RenderMethod::TextColored(x, y, t, c) => utils::print_liner(
|
||||||
self.transform.x + self.transform.px + x,
|
*x,
|
||||||
self.transform.y + self.transform.py + y,
|
*y,
|
||||||
|
&self.transform,
|
||||||
|
&self.parent_transform,
|
||||||
&utils::hex_ansi(*c),
|
&utils::hex_ansi(*c),
|
||||||
t,
|
t,
|
||||||
&self.parent_transform,
|
|
||||||
),
|
),
|
||||||
RenderMethod::Rectangle(x, y, width, height, color) => utils::print_liner(
|
RenderMethod::Rectangle(x, y, width, height, c) => utils::print_liner(
|
||||||
self.transform.x + self.transform.px + x,
|
*x,
|
||||||
self.transform.y + self.transform.py + y,
|
*y,
|
||||||
&hex_ansi_bg(*color),
|
&self.transform,
|
||||||
|
&self.parent_transform,
|
||||||
|
&utils::hex_ansi_bg(*c),
|
||||||
&std::iter::repeat(" ".repeat(*width as usize))
|
&std::iter::repeat(" ".repeat(*width as usize))
|
||||||
.take(*height as usize)
|
.take(*height as usize)
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
.join("\n"),
|
.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.
|
/// Gets the dimensions of the parent container.
|
||||||
pub fn get_parent_transform(&self) -> &RawTransform {
|
pub fn get_parent_transform(&self) -> &RawTransform {
|
||||||
&self.parent_transform
|
&self.parent_transform
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the dimensions of the parent container.
|
/// 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;
|
|
||||||
// }
|
|
||||||
|
|
||||||
pub fn set_parent_transform(&mut self, transform: RawTransform) {
|
pub fn set_parent_transform(&mut self, transform: RawTransform) {
|
||||||
self.parent_transform = transform;
|
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.
|
/// Returns a mutable reference to the internal raw transform.
|
||||||
pub fn get_transform_mut(&mut self) -> &mut RawTransform {
|
pub fn get_transform_mut(&mut self) -> &mut RawTransform {
|
||||||
&mut self.transform
|
&mut self.transform
|
||||||
@@ -364,14 +353,14 @@ impl RenderScope {
|
|||||||
self.set_style(style);
|
self.set_style(style);
|
||||||
}
|
}
|
||||||
if let Some(t) = widget.get() {
|
if let Some(t) = widget.get() {
|
||||||
self.set_transform(&t);
|
self.apply_transform(&t);
|
||||||
}
|
}
|
||||||
|
|
||||||
widget.get_elem().render(self, &render_context);
|
widget.get_elem().render(self, &render_context);
|
||||||
ctx.render(widget, self);
|
ctx.render(widget, self);
|
||||||
|
|
||||||
if let Some(t) = widget.get() {
|
if let Some(t) = widget.get() {
|
||||||
self.set_transform(&t);
|
self.apply_transform(&t);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer.before_draw(self, widget);
|
renderer.before_draw(self, widget);
|
||||||
|
|||||||
+8
-6
@@ -146,17 +146,19 @@ impl Transform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Resolves `Dimension` rules into absolute values for the given parent size.
|
/// 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) {
|
pub fn use_dimensions(&self, parent_transform: &RawTransform, raw: &mut RawTransform) {
|
||||||
self.width.use_dimension(parent_width, &mut raw.width);
|
self.width
|
||||||
self.height.use_dimension(parent_height, &mut raw.height);
|
.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.
|
/// 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
|
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
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-4
@@ -109,13 +109,21 @@ pub fn hex_ansi_bg(hex: u32) -> String {
|
|||||||
format!("\x1b[48;2;{r};{g};{b}m")
|
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() {
|
for (i, line) in text.lines().enumerate() {
|
||||||
if parent_transform.offset_y > y + i as u16 {
|
if parent_transform.offset_y > y + i as u16 {
|
||||||
continue;
|
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 {
|
if y >= parent_transform.height + parent_transform.y + parent_transform.py {
|
||||||
break;
|
break;
|
||||||
@@ -128,16 +136,19 @@ pub(crate) fn print(x: u16, y: u16, text: &str, parent_transform: &RawTransform)
|
|||||||
pub(crate) fn print_liner(
|
pub(crate) fn print_liner(
|
||||||
x: u16,
|
x: u16,
|
||||||
y: u16,
|
y: u16,
|
||||||
|
transform: &RawTransform,
|
||||||
|
parent_transform: &RawTransform,
|
||||||
liner: &str,
|
liner: &str,
|
||||||
text: &str,
|
text: &str,
|
||||||
parent_transform: &RawTransform,
|
|
||||||
) {
|
) {
|
||||||
|
let x = transform.x + transform.px + x;
|
||||||
|
|
||||||
for (i, line) in text.lines().enumerate() {
|
for (i, line) in text.lines().enumerate() {
|
||||||
if parent_transform.offset_y > y + i as u16 {
|
if parent_transform.offset_y > y + i as u16 {
|
||||||
continue;
|
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 {
|
if y >= parent_transform.height + parent_transform.y + parent_transform.py {
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user