elm model is in an ok state now
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
_ => {}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user