diff options
author | Shav Kinderlehrer <[email protected]> | 2024-03-05 23:34:55 -0500 |
---|---|---|
committer | Shav Kinderlehrer <[email protected]> | 2024-03-05 23:34:55 -0500 |
commit | 022574877dbabc1fbb386dc3b59765de528107c9 (patch) | |
tree | e662b3808cd9903ecb76d6a61029ac69de701aa8 /src | |
download | molehole-022574877dbabc1fbb386dc3b59765de528107c9.tar.gz molehole-022574877dbabc1fbb386dc3b59765de528107c9.zip |
Initial commit
Diffstat (limited to 'src')
-rw-r--r-- | src/action.rs | 2 | ||||
-rw-r--r-- | src/app.rs | 32 | ||||
-rw-r--r-- | src/app_event.rs | 6 | ||||
-rw-r--r-- | src/component.rs | 43 | ||||
-rw-r--r-- | src/main.rs | 13 | ||||
-rw-r--r-- | src/tui.rs | 20 |
6 files changed, 116 insertions, 0 deletions
diff --git a/src/action.rs b/src/action.rs new file mode 100644 index 0000000..4272dea --- /dev/null +++ b/src/action.rs @@ -0,0 +1,2 @@ +pub enum Action { +} diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..aaad2f2 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,32 @@ +use eyre::Result; +use ratatui::prelude::*; +use std::io::Stdout; +use std::time::Duration; + +use crate::tui; + +pub struct App { + pub terminal: Terminal<CrosstermBackend<Stdout>>, + pub tick_rate: Duration, +} + +impl App { + pub fn start(tick_rate: Duration) -> Result<Self> { + let terminal = tui::init()?; + + Ok(Self { + terminal, + tick_rate, + }) + } + + pub fn run(&mut self) -> Result<()> { + Ok(()) + } + + pub fn quit(&mut self) -> Result<()> { + tui::restore()?; + + Ok(()) + } +} diff --git a/src/app_event.rs b/src/app_event.rs new file mode 100644 index 0000000..1cac719 --- /dev/null +++ b/src/app_event.rs @@ -0,0 +1,6 @@ +use crossterm::event::{KeyEvent, MouseEvent}; + +pub enum AppEvent { + Key(KeyEvent), + Mouse(MouseEvent), +} diff --git a/src/component.rs b/src/component.rs new file mode 100644 index 0000000..1896bc2 --- /dev/null +++ b/src/component.rs @@ -0,0 +1,43 @@ +use crossterm::event::{KeyEvent, MouseEvent}; +use eyre::Result; +use ratatui::prelude::{Frame, Rect}; + +use crate::action::Action; +use crate::app_event::AppEvent; + +pub trait Component { + fn init(&mut self) -> Result<()> { + Ok(()) + } + + #[allow(unused)] + fn handle_event(&mut self, event: AppEvent) -> Result<Option<Action>> { + match event { + AppEvent::Key(key_event) => Ok(self.handle_key_event(key_event)?), + AppEvent::Mouse(mouse_event) => { + Ok(self.handle_mouse_event(mouse_event)?) + } + _ => Ok(None), + } + } + + #[allow(unused)] + fn handle_key_event(&mut self, key: KeyEvent) -> Result<Option<Action>> { + Ok(None) + } + + #[allow(unused)] + fn handle_mouse_event( + &mut self, + mouse: MouseEvent, + ) -> Result<Option<Action>> { + Ok(None) + } + + #[allow(unused)] + fn update(&mut self, action: Action) -> Result<Option<Action>> { + Ok(None) + } + + fn render(&mut self, frame: &mut Frame, rect: Rect); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..32845d3 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,13 @@ +mod action; +mod app; +mod app_event; +mod component; +mod tui; + +use eyre::Result; + +fn main() -> Result<()> { + let mut app = app::App::start(std::time::Duration::from_millis(10))?; + + app.quit() +} diff --git a/src/tui.rs b/src/tui.rs new file mode 100644 index 0000000..7f27ca3 --- /dev/null +++ b/src/tui.rs @@ -0,0 +1,20 @@ +use std::io::{self, stdout, Stdout}; + +use crossterm::{execute, terminal::*}; +use ratatui::prelude::*; + +pub type Tui = Terminal<CrosstermBackend<Stdout>>; + +pub fn init() -> io::Result<Tui> { + execute!(stdout(), EnterAlternateScreen)?; + enable_raw_mode()?; + + Terminal::new(CrosstermBackend::new(stdout())) +} + +pub fn restore() -> io::Result<()> { + execute!(stdout(), LeaveAlternateScreen)?; + disable_raw_mode()?; + + Ok(()) +} |