47 lines
1019 B
Rust
47 lines
1019 B
Rust
use std::io;
|
|
|
|
use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind};
|
|
use ratatui::{DefaultTerminal, Frame};
|
|
|
|
use crate::view::{home::Home, View};
|
|
|
|
pub struct App {
|
|
running: bool,
|
|
view: Home,
|
|
}
|
|
|
|
impl Default for App {
|
|
fn default() -> Self {
|
|
App {
|
|
running: true,
|
|
view: Home::default(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl App {
|
|
pub fn run(&mut self, terminal: &mut DefaultTerminal) -> io::Result<()> {
|
|
while self.running {
|
|
terminal.draw(|frame| self.draw(frame))?;
|
|
self.handle_event()?;
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
fn draw(&self, frame: &mut Frame) {
|
|
self.view.draw(frame);
|
|
}
|
|
|
|
fn handle_event(&mut self) -> io::Result<()> {
|
|
match event::read()? {
|
|
Event::Key(KeyEvent {
|
|
kind: KeyEventKind::Press,
|
|
code: KeyCode::Esc,
|
|
..
|
|
}) => self.running = false,
|
|
event => self.view.handle_event(&event)?,
|
|
}
|
|
Ok(())
|
|
}
|
|
}
|