summaryrefslogtreecommitdiff
path: root/src/buffer.rs
diff options
context:
space:
mode:
authorMica White <botahamec@outlook.com>2026-06-28 11:09:28 -0400
committerMica White <botahamec@outlook.com>2026-06-28 11:09:28 -0400
commit3eb02cbe5b106cd332f25d658430f7e0ae320745 (patch)
tree20153b185b2e7d5c41b2b2d29c6c28bba8bd31b9 /src/buffer.rs
parentb9570962cfc214bbac0f3fef1e6c1f9848f52658 (diff)
initial commit
Diffstat (limited to 'src/buffer.rs')
-rw-r--r--src/buffer.rs46
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()?;
}
})?;