diff --git a/src/tui/component.rs b/src/tui/component.rs index ca3f659..545ee5d 100644 --- a/src/tui/component.rs +++ b/src/tui/component.rs @@ -1,3 +1,4 @@ +use crossterm::event::Event; use ratatui::{layout::Rect, Frame}; pub trait Component { @@ -7,6 +8,8 @@ pub trait Component { /// Update the state based on a message fn update(&mut self, msg: Self::Msg); + fn handle_event(&mut self, event: Event); + /// Render the component to the screen fn view(&self, frame: &mut Frame); } diff --git a/src/tui/dashboard.rs b/src/tui/dashboard.rs index af6288f..030caab 100644 --- a/src/tui/dashboard.rs +++ b/src/tui/dashboard.rs @@ -10,12 +10,31 @@ pub enum MenuMsg { } #[derive(Default, Debug)] -pub struct Menu; +pub struct Menu { + counter: i32, +} impl Component for Menu { type Msg = MenuMsg; - fn update(&mut self, msg: MenuMsg) {} + fn update(&mut self, msg: MenuMsg) { + match msg { + MenuMsg::MoveUp => self.counter += 1, + MenuMsg::MoveDown => self.counter -= 1, + _ => {} + } + } fn view(&self, f: &mut Frame) { - let text = Text::raw("meow"); + let text_raw = format!("meow - {}", self.counter); + let text = Text::raw(text_raw); f.render_widget(text, f.area()); } + fn handle_event(&mut self, event: Event) { + match event { + Event::Key(x) => match x.code { + crossterm::event::KeyCode::Up => self.update(MenuMsg::MoveUp), + crossterm::event::KeyCode::Down => self.update(MenuMsg::MoveDown), + _ => {} + }, + _ => {} + } + } } diff --git a/src/tui/main.rs b/src/tui/main.rs index ab06112..8285384 100644 --- a/src/tui/main.rs +++ b/src/tui/main.rs @@ -26,9 +26,16 @@ enum AppMsg { GlobalQuit, } +#[derive(Default, Debug)] +enum Screen { + #[default] + Menu, +} + #[derive(Default, Debug)] struct App { menu: Menu, + screen: Screen, should_quit: bool, } @@ -46,11 +53,25 @@ impl App { // Centering logic we discussed earlier! self.menu.view(f); } + + fn handle_event(&mut self, event: Event) { + match self.screen { + Screen::Menu => self.menu.handle_event(event), + } + } + fn propagate_events(&mut self) { + if crossterm::event::poll(Duration::from_millis(100)).unwrap() { + if let Ok(event) = crossterm::event::read() { + self.handle_event(event); + } + } + } } fn main() { - let app: App = App::default(); + let mut app: App = App::default(); ratatui::run(|terminal| loop { terminal.draw(|f| app.view(f)); + app.propagate_events(); }); }