writer-rewrite 01
This commit is contained in:
+22
-15
@@ -117,7 +117,7 @@ pub struct Writer {
|
|||||||
style: ui::StyleElement,
|
style: ui::StyleElement,
|
||||||
focused: bool,
|
focused: bool,
|
||||||
size: (u16, u16),
|
size: (u16, u16),
|
||||||
absolute: (u16, u16),
|
pos: (u16, u16),
|
||||||
written: (u16, u16),
|
written: (u16, u16),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,7 +178,14 @@ impl Document {
|
|||||||
pub fn render(&self) {
|
pub fn render(&self) {
|
||||||
if !self.element.is_null() {
|
if !self.element.is_null() {
|
||||||
let (width, height) = crossterm::terminal::size().unwrap();
|
let (width, height) = crossterm::terminal::size().unwrap();
|
||||||
let mut frame = utils::Frame::new((0, 0), (width, height), &self.css);
|
let mut writer = Writer::new(
|
||||||
|
true,
|
||||||
|
ui::StyleElement::default(),
|
||||||
|
(0, 0),
|
||||||
|
(width, height),
|
||||||
|
&self.css,
|
||||||
|
);
|
||||||
|
let mut frame = writer.new_frame();
|
||||||
utils::clear();
|
utils::clear();
|
||||||
frame.render(true, unsafe { &*self.element });
|
frame.render(true, unsafe { &*self.element });
|
||||||
utils::flush();
|
utils::flush();
|
||||||
@@ -348,7 +355,7 @@ impl Writer {
|
|||||||
pub fn new(
|
pub fn new(
|
||||||
focused: bool,
|
focused: bool,
|
||||||
style: ui::StyleElement,
|
style: ui::StyleElement,
|
||||||
absolute: (u16, u16),
|
pos: (u16, u16),
|
||||||
size: (u16, u16),
|
size: (u16, u16),
|
||||||
css: &ui::Css,
|
css: &ui::Css,
|
||||||
) -> Writer {
|
) -> Writer {
|
||||||
@@ -357,7 +364,7 @@ impl Writer {
|
|||||||
style,
|
style,
|
||||||
focused,
|
focused,
|
||||||
size,
|
size,
|
||||||
absolute,
|
pos,
|
||||||
written: (0, 0),
|
written: (0, 0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -368,15 +375,15 @@ impl Writer {
|
|||||||
if self.style.outline.1 {
|
if self.style.outline.1 {
|
||||||
print!(
|
print!(
|
||||||
"\x1B[{};{}H{outline_ch}{}",
|
"\x1B[{};{}H{outline_ch}{}",
|
||||||
self.absolute.1 + 2 + i as u16,
|
self.pos.1 + 2 + i as u16,
|
||||||
self.absolute.0 + 1,
|
self.pos.0 + 1,
|
||||||
self.style.write(line),
|
self.style.write(line),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
print!(
|
print!(
|
||||||
"\x1B[{};{}H{}",
|
"\x1B[{};{}H{}",
|
||||||
self.absolute.1 + 1 + i as u16,
|
self.pos.1 + 1 + i as u16,
|
||||||
self.absolute.0 + 1,
|
self.pos.0 + 1,
|
||||||
self.style.write(line)
|
self.style.write(line)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -390,8 +397,8 @@ impl Writer {
|
|||||||
if self.style.outline.1 {
|
if self.style.outline.1 {
|
||||||
print!(
|
print!(
|
||||||
"\x1B[{};{}H{}",
|
"\x1B[{};{}H{}",
|
||||||
self.absolute.1 + 1,
|
self.pos.1 + 1,
|
||||||
self.absolute.0 + 1,
|
self.pos.0 + 1,
|
||||||
self.style.write_outline(&format!(
|
self.style.write_outline(&format!(
|
||||||
"╭{}╮",
|
"╭{}╮",
|
||||||
"─".repeat(self.get_size_root().0 as usize)
|
"─".repeat(self.get_size_root().0 as usize)
|
||||||
@@ -399,8 +406,8 @@ impl Writer {
|
|||||||
);
|
);
|
||||||
print!(
|
print!(
|
||||||
"\x1B[{};{}H{}",
|
"\x1B[{};{}H{}",
|
||||||
self.absolute.1 + self.written.1 + 2,
|
self.pos.1 + self.written.1 + 2,
|
||||||
self.absolute.0 + 1,
|
self.pos.0 + 1,
|
||||||
self.style.write_outline(&format!(
|
self.style.write_outline(&format!(
|
||||||
"╰{}╯",
|
"╰{}╯",
|
||||||
"─".repeat(self.get_size_root().0 as usize)
|
"─".repeat(self.get_size_root().0 as usize)
|
||||||
@@ -410,8 +417,8 @@ impl Writer {
|
|||||||
for i in 0..self.written.1 {
|
for i in 0..self.written.1 {
|
||||||
print!(
|
print!(
|
||||||
"\x1B[{};{}H{outline_ch}",
|
"\x1B[{};{}H{outline_ch}",
|
||||||
self.absolute.1 + i + 2,
|
self.pos.1 + i + 2,
|
||||||
self.absolute.0 + self.get_size_root().0 + 2,
|
self.pos.0 + self.get_size_root().0 + 2,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -448,7 +455,7 @@ impl Writer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_frame(&mut self) -> crate::utils::Frame {
|
pub fn new_frame(&mut self) -> crate::utils::Frame {
|
||||||
crate::utils::Frame::new(self.absolute, self.get_size(), unsafe { &*self.css })
|
crate::utils::Frame::new(self, unsafe { &*self.css })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn caret(&self) -> String {
|
pub fn caret(&self) -> String {
|
||||||
|
|||||||
+5
-8
@@ -6,13 +6,10 @@ fn main() {
|
|||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn App() {
|
pub fn App() {
|
||||||
rsx! {
|
ersx! {
|
||||||
async {
|
text { style: style! {
|
||||||
sleep(3000);
|
x: 30 px,
|
||||||
ersx!(text {
|
y: 4 px
|
||||||
"OK"
|
}, "hello, world" }
|
||||||
})
|
|
||||||
}
|
|
||||||
text { "Hello world!" }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-1
@@ -329,7 +329,7 @@ impl Number {
|
|||||||
self.as_size_raw(frame_size)
|
self.as_size_raw(frame_size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn as_position(&self, used: &u16, frame_size: u16) -> u16 {
|
pub fn as_position_raw(&self, used: &u16, frame_size: u16) -> u16 {
|
||||||
match self {
|
match self {
|
||||||
crate::ui::Number::Px(px) => *px,
|
crate::ui::Number::Px(px) => *px,
|
||||||
crate::ui::Number::Pe(pe) => (frame_size * pe) / 100,
|
crate::ui::Number::Pe(pe) => (frame_size * pe) / 100,
|
||||||
@@ -337,4 +337,11 @@ impl Number {
|
|||||||
crate::ui::Number::Auto => *used,
|
crate::ui::Number::Auto => *used,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn as_position(&self, outline: bool, used: &u16, frame_size: u16) -> u16 {
|
||||||
|
if outline {
|
||||||
|
self.as_position_raw(used, frame_size) + 1
|
||||||
|
} else {
|
||||||
|
self.as_position_raw(used, frame_size)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-19
@@ -1,25 +1,17 @@
|
|||||||
use std::io::{stdout, Write};
|
use std::io::{stdout, Write};
|
||||||
|
|
||||||
use crate::ui;
|
|
||||||
|
|
||||||
pub struct Frame<'a> {
|
pub struct Frame<'a> {
|
||||||
used: Vec<u16>,
|
used: Vec<u16>,
|
||||||
width: u16,
|
css: &'a crate::ui::Css,
|
||||||
height: u16,
|
writer: &'a mut crate::Writer,
|
||||||
x: u16,
|
|
||||||
y: u16,
|
|
||||||
css: &'a ui::Css,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Frame<'a> {
|
impl<'a> Frame<'a> {
|
||||||
pub fn new((x, y): (u16, u16), (width, height): (u16, u16), css: &'a crate::ui::Css) -> Self {
|
pub fn new(writer: &'a mut crate::Writer, css: &'a crate::ui::Css) -> Self {
|
||||||
Frame {
|
Frame {
|
||||||
used: vec![0; height as usize],
|
used: vec![0; writer.size.1 as usize],
|
||||||
width,
|
|
||||||
height,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
css,
|
css,
|
||||||
|
writer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn render(&mut self, focused: bool, element: &crate::Element) {
|
pub fn render(&mut self, focused: bool, element: &crate::Element) {
|
||||||
@@ -27,11 +19,14 @@ impl<'a> Frame<'a> {
|
|||||||
let mut style_element = style.clone().get(focused);
|
let mut style_element = style.clone().get(focused);
|
||||||
|
|
||||||
for class in element.get_class().split(" ") {
|
for class in element.get_class().split(" ") {
|
||||||
if let Some(upper) = self.css.get(&ui::StyleName::Class(class.to_string())) {
|
if let Some(upper) = self
|
||||||
|
.css
|
||||||
|
.get(&crate::ui::StyleName::Class(class.to_string()))
|
||||||
|
{
|
||||||
style_element.merge(upper);
|
style_element.merge(upper);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(upper) = self.css.get(&ui::StyleName::ClassState(
|
if let Some(upper) = self.css.get(&crate::ui::StyleName::ClassState(
|
||||||
class.to_string(),
|
class.to_string(),
|
||||||
if style.2 == "" && focused {
|
if style.2 == "" && focused {
|
||||||
"hover".to_string()
|
"hover".to_string()
|
||||||
@@ -45,6 +40,7 @@ impl<'a> Frame<'a> {
|
|||||||
|
|
||||||
if style_element.visible.1 {
|
if style_element.visible.1 {
|
||||||
let y = style_element.y.1.as_position(
|
let y = style_element.y.1.as_position(
|
||||||
|
style_element.outline.1,
|
||||||
&{
|
&{
|
||||||
let mut y = 0;
|
let mut y = 0;
|
||||||
while y < self.used.len() && self.used[y] != 0 {
|
while y < self.used.len() && self.used[y] != 0 {
|
||||||
@@ -52,15 +48,19 @@ impl<'a> Frame<'a> {
|
|||||||
}
|
}
|
||||||
y as u16
|
y as u16
|
||||||
},
|
},
|
||||||
self.height,
|
self.writer.size.1,
|
||||||
);
|
);
|
||||||
if let Some(y_) = self.used.get(y as usize) {
|
if let Some(y_) = self.used.get(y as usize) {
|
||||||
let x = style_element.x.1.as_position(y_, self.width);
|
let x =
|
||||||
|
style_element
|
||||||
|
.x
|
||||||
|
.1
|
||||||
|
.as_position(style_element.outline.1, y_, self.writer.size.0);
|
||||||
let mut writer = crate::Writer::new(
|
let mut writer = crate::Writer::new(
|
||||||
focused,
|
focused,
|
||||||
style_element.clone(),
|
style_element.clone(),
|
||||||
(x + self.x, y + self.y),
|
(x, y),
|
||||||
(self.width, self.height),
|
self.writer.size,
|
||||||
self.css,
|
self.css,
|
||||||
);
|
);
|
||||||
element.render(&mut writer);
|
element.render(&mut writer);
|
||||||
|
|||||||
Reference in New Issue
Block a user