From 85dd5a6f66a6ba509352553ddb7ccb8f9aaead0f Mon Sep 17 00:00:00 2001 From: Leo dev Date: Fri, 17 Jan 2025 01:01:27 +0100 Subject: [PATCH] few changes --- src/console.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/console.rs diff --git a/src/console.rs b/src/console.rs new file mode 100644 index 0000000..eae8a4e --- /dev/null +++ b/src/console.rs @@ -0,0 +1,56 @@ +use crate::Frame; + +pub struct Console(Frame); + +pub enum Event { + Key(crossterm::event::KeyEvent), + Resize(u16, u16), + Mouse(crossterm::event::MouseEvent), + Paste(String), + FocusGained, + FocusLost, +} + +pub fn init() -> crate::Result { + crossterm::terminal::enable_raw_mode()?; + crate::utils::clear()?; + crate::utils::hide_cursor()?; + Ok(Console(Frame::new(crossterm::terminal::size()?))) +} + +pub fn end() -> crate::Result<()> { + crossterm::terminal::disable_raw_mode()?; + crate::utils::clear()?; + crate::utils::show_cursor() +} + +impl Console { + pub fn draw(&self, mut f: F) -> crate::Result<()> + where + F: FnMut(&Frame) -> crate::Result<()>, + { + crate::utils::clear()?; + f(&self.0) + } +} + +pub fn read() -> crate::Result { + let event = crossterm::event::read()?; + + Ok(match event { + crossterm::event::Event::Key(k) => Event::Key(k), + crossterm::event::Event::Resize(w, h) => Event::Resize(w, h), + crossterm::event::Event::FocusGained => Event::FocusGained, + crossterm::event::Event::FocusLost => Event::FocusLost, + crossterm::event::Event::Mouse(m) => Event::Mouse(m), + crossterm::event::Event::Paste(p) => Event::Paste(p), + }) +} + +pub fn try_read() -> Option { + if crossterm::event::poll(std::time::Duration::ZERO).unwrap_or(false) { + read().ok() + } else { + None + } +}