Buffered screen drawing
This commit is contained in:
parent
5fc444519d
commit
1528866d65
1 changed files with 55 additions and 8 deletions
63
src/main.rs
63
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(())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue