diff --git a/src/main.rs b/src/main.rs index 41ee3a7..d51a40d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,8 +12,9 @@ use std::{ #[derive(Default)] struct Nuudel { quitting: bool, - cursorx: i32, - cursory: i32, + cursorx: u16, + cursory: u16, + buffer: String, } fn main() -> Result<()> { @@ -36,10 +37,9 @@ fn main() -> Result<()> { impl Nuudel { pub fn run(&mut self, stdout: &mut Stdout) -> Result<()> { - print!("Press Q to quit"); while !self.quitting { self.handle_events()?; - stdout.flush()?; + self.draw_terminal(stdout)?; } Ok(()) } @@ -51,6 +51,7 @@ impl Nuudel { } fn restore_terminal() -> Result<()> { + stdout().execute(cursor::Show)?; stdout().execute(terminal::LeaveAlternateScreen)?; terminal::disable_raw_mode()?; Ok(()) @@ -70,16 +71,24 @@ impl Nuudel { print!("█"); }, KeyCode::Left => { - stdout().execute(cursor::MoveLeft(1))?; + if self.cursorx > 0 { + self.cursorx -= 1; + self.cursorx = self.cursorx.clamp(0, terminal::size()?.0-1); + } }, KeyCode::Right => { - stdout().execute(cursor::MoveRight(1))?; + self.cursorx += 1; + self.cursorx = self.cursorx.clamp(0, terminal::size()?.0-1); }, KeyCode::Up => { - stdout().execute(cursor::MoveUp(1))?; + if self.cursory > 0 { + self.cursory -= 1; + } + self.cursory = self.cursory.clamp(0, terminal::size()?.1-1); }, KeyCode::Down => { - stdout().execute(cursor::MoveDown(1))?; + self.cursory += 1; + self.cursory = self.cursory.clamp(0, terminal::size()?.1-1); }, _ => {} }, @@ -88,4 +97,42 @@ impl Nuudel { } Ok(()) } + + fn draw_terminal(&mut self, stdout: &mut Stdout) -> Result<()> { + //stdout.execute(terminal::BeginSynchronizedUpdate)?; + stdout.execute(cursor::Hide)?; + stdout.execute(cursor::MoveTo(0, 0))?; + + let mut y = 0; + self.buffer = "\n".to_string(); + let buffer_lines = self.buffer.lines().count() as u16; + + while y < terminal::size()?.1 - buffer_lines { + self.buffer.push_str("~\n"); + y += 1; + } + + // Draw buffer one by one + y = 0; + let mut lines = self.buffer.lines(); + while y < terminal::size()?.1-1 { + stdout.execute(terminal::Clear(terminal::ClearType::CurrentLine))?; + let line = lines.next(); + if line.is_none() { + break; + } + write!(stdout, "{}", line.unwrap())?; + stdout.execute(cursor::MoveToNextLine(1))?; + y += 1; + } + print!("Press Q to quit"); + + //stdout.execute(terminal::EndSynchronizedUpdate)?; + stdout.execute(cursor::MoveTo(self.cursorx, self.cursory))?; + stdout.execute(cursor::Show)?; + + std::thread::sleep(Duration::from_millis(16)); + + Ok(()) + } }