diff options
| author | Mica White <botahamec@outlook.com> | 2026-06-28 11:09:28 -0400 |
|---|---|---|
| committer | Mica White <botahamec@outlook.com> | 2026-06-28 11:09:28 -0400 |
| commit | 3eb02cbe5b106cd332f25d658430f7e0ae320745 (patch) | |
| tree | 20153b185b2e7d5c41b2b2d29c6c28bba8bd31b9 /src/buffer.rs | |
| parent | b9570962cfc214bbac0f3fef1e6c1f9848f52658 (diff) | |
initial commit
Diffstat (limited to 'src/buffer.rs')
| -rw-r--r-- | src/buffer.rs | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/src/buffer.rs b/src/buffer.rs index fa0feaa..9e91ae7 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -2,8 +2,8 @@ use std::io::Write; use crossterm::{ cursor::{Hide, MoveTo, Show}, - event::{self, Event}, - execute, + event::{self, KeyEvent}, + execute, queue, style::{ContentStyle, PrintStyledContent, StyledContent}, terminal::{ BeginSynchronizedUpdate, Clear, ClearType, EndSynchronizedUpdate, EnterAlternateScreen, @@ -20,15 +20,31 @@ pub struct Cell { pub z: u8, } -#[derive(Debug)] -pub struct Buffer<'a, W: Write> { - stdout: &'a mut W, +pub struct Buffer { + stdout: Box<dyn Write>, pub cells: Vec<Cell>, pub window_size: WindowSize, } -impl<'a, W: Write> Buffer<'a, W> { - pub fn new(stdout: &'a mut W) -> std::io::Result<Self> { +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum Event { + Key(KeyEvent), + Render, +} + +impl TryFrom<crossterm::event::Event> for Event { + type Error = (); + + fn try_from(value: crossterm::event::Event) -> Result<Self, Self::Error> { + match value { + crossterm::event::Event::Key(event) => Ok(Event::Key(event)), + _ => Err(()), + } + } +} + +impl Buffer { + pub fn new(stdout: Box<dyn Write>) -> std::io::Result<Self> { Ok(Self { stdout, cells: Vec::new(), @@ -44,15 +60,16 @@ impl<'a, W: Write> Buffer<'a, W> { fn render(&mut self) -> std::io::Result<()> { self.cells.sort_unstable_by_key(|cell| cell.z); - execute!(self.stdout, BeginSynchronizedUpdate, Clear(ClearType::All))?; + queue!(self.stdout, BeginSynchronizedUpdate, Clear(ClearType::All))?; for cell in &self.cells { - execute!( + queue!( self.stdout, MoveTo(cell.x, cell.y), PrintStyledContent(StyledContent::new(cell.style, cell.character)) )?; } - execute!(self.stdout, EndSynchronizedUpdate)?; + queue!(self.stdout, EndSynchronizedUpdate)?; + self.stdout.flush()?; Ok(()) } @@ -65,9 +82,8 @@ impl<'a, W: Write> Buffer<'a, W> { pub fn render_loop( &mut self, mut event_handler: impl FnMut(&mut Self, Event), - mut update: impl FnMut(&mut Self), ) -> std::io::Result<()> { - Self::initialize(self.stdout)?; + Self::initialize(&mut self.stdout)?; let (sender, receiver) = std::sync::mpsc::channel(); std::thread::scope(|scope| -> std::io::Result<()> { scope.spawn(|| { @@ -80,9 +96,11 @@ impl<'a, W: Write> Buffer<'a, W> { }); loop { while let Ok(event) = receiver.try_recv() { - event_handler(self, event); + if let Ok(event) = event.try_into() { + event_handler(self, event); + } } - update(self); + event_handler(self, Event::Render); self.render()?; } })?; |
