aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShav Kinderlehrer <[email protected]>2024-03-05 23:34:55 -0500
committerShav Kinderlehrer <[email protected]>2024-03-05 23:34:55 -0500
commit022574877dbabc1fbb386dc3b59765de528107c9 (patch)
treee662b3808cd9903ecb76d6a61029ac69de701aa8 /src
downloadmolehole-022574877dbabc1fbb386dc3b59765de528107c9.tar.gz
molehole-022574877dbabc1fbb386dc3b59765de528107c9.zip
Initial commit
Diffstat (limited to 'src')
-rw-r--r--src/action.rs2
-rw-r--r--src/app.rs32
-rw-r--r--src/app_event.rs6
-rw-r--r--src/component.rs43
-rw-r--r--src/main.rs13
-rw-r--r--src/tui.rs20
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(())
+}