use std::{io, time::Duration}; use crate::{ config, lua, sheet::register::Register, tui, widgets::{logview::LogView, sheetview::SheetView}, }; use ratatui::{ crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers}, prelude::*, }; pub struct App { exit: bool, view: SheetView, logview: Option, } impl App { pub fn new() -> Self { let sheet_id = Register::create(10, 50); let view = SheetView::new(sheet_id); Self { exit: false, view, logview: None, } } pub fn run(&mut self, terminal: &mut tui::Tui) -> io::Result<()> { if let Err(e) = lua::source(&config::constants::USER_RC_PATH) { self.exit = true; tui::restore()?; println!("{}", e.to_string()); } while !self.exit { terminal.draw(|frame| self.render_frame(frame))?; self.handle_events()?; } Ok(()) } fn render_frame(&mut self, frame: &mut Frame) { frame.render_widget(self, frame.size()); } fn handle_events(&mut self) -> io::Result<()> { if event::poll(Duration::from_millis(100))? { match event::read()? { Event::Key(key_event) if key_event.kind == KeyEventKind::Press => { self.handle_key_event(key_event) } _ => {} } } Ok(()) } fn handle_key_event(&mut self, key_event: KeyEvent) { match key_event.code { KeyCode::Char('q') if key_event.modifiers == KeyModifiers::CONTROL => self.exit(), KeyCode::Char('l') if key_event.modifiers == KeyModifiers::CONTROL => { match self.logview { Some(_) => self.logview = None, None => { self.logview = Some(LogView::new()) } } } _ => self.view.handle_key_event(key_event), } } fn exit(&mut self) { self.exit = true; } } impl Widget for &mut App { fn render(self, area: Rect, buf: &mut Buffer) where Self: Sized, { match &mut self.logview { Some(logview) => { let layout = Layout::vertical([Constraint::Min(2), Constraint::Length(15)]).split(area); self.view.render(layout[0], buf); logview.render(layout[1], buf); } None => self.view.render(area, buf), } } }