diff --git a/README.md b/README.md index c1ab75f..3bb9393 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,7 @@ use osui::{self, render_frame, ui}; fn main() { let txt = ui::text("Hello World!"); - render_frame(vec![txt.clone()]); + render_frame!(txt); } - ``` diff --git a/src/lib.rs b/src/lib.rs index 627fb10..80d07b5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -35,6 +35,11 @@ impl ComponentWrapper { pub fn run(&mut self) -> String { self.component.run(self.x, self.y) } + pub fn render(&self, frame: &mut Vec) { + for (i, line) in self.component.render().split("\n").enumerate() { + frame[self.y + i] = _render_line(frame[self.y + i].clone(), line.to_string(), self.x); + } + } } pub fn clear() { @@ -46,20 +51,13 @@ pub fn flush() { io::stdout().flush().unwrap(); } -pub fn render_frame(components: Vec>) { +pub fn create_frame() -> Vec { clear(); let (w, h) = terminal::size().unwrap(); - let mut frame: Vec = vec![" ".repeat(w as usize); h as usize - 1]; - for c in components { - for (i, line) in c.component.render().split("\n").enumerate() { - frame[c.y + i] = render_line(frame[c.y + i].clone(), line.to_string(), c.x); - } - } - print!("{}", frame.join("\n")); - flush(); + vec![" ".repeat(w as usize); h as usize - 1] } -fn render_line(frame_line: String, line: String, x: usize) -> String { +fn _render_line(frame_line: String, line: String, x: usize) -> String { let mut result = String::new(); if x >= frame_line.len() { return result; @@ -91,3 +89,35 @@ pub fn read_key() -> String { disable_raw_mode().unwrap(); return res; } + +#[macro_export] +macro_rules! render_frame { + ($first:expr) => {{ + let mut frame = osui::create_frame(); + $first.render(&mut frame); + print!("{}", frame.join("\n")); + frame + }}; + ($first:expr, $($rest:expr),+) => {{ + let mut frame = osui::create_frame(); + $first.render(&mut frame); + $( $rest.render(&mut frame); )+ + print!("{}", frame.join("\n")); + frame + }}; +} + +#[macro_export] +macro_rules! srender_frame { + ($first:expr) => {{ + let mut frame = create_frame(); + $first.render(&mut frame); + frame + }}; + ($first:expr, $($rest:expr),+) => {{ + let mut frame = create_frame(); + $first.render(&mut frame); + $( $rest.render(&mut frame); )+ + frame + }}; +} diff --git a/src/main.rs b/src/main.rs index 77c6a62..07cf600 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,5 +2,5 @@ use osui::{self, render_frame, ui}; fn main() { let txt = ui::text("Hello World!"); - render_frame(vec![txt.clone()]); + render_frame!(txt); }