diff options
Diffstat (limited to 'src/app.rs')
| -rw-r--r-- | src/app.rs | 76 |
1 files changed, 55 insertions, 21 deletions
@@ -1,7 +1,11 @@ use std::{io, time::Duration}; use crate::{ - config, lua, sheet::register::Register, state::GlobalState, tui, widgets::{logview::LogView, sheetview::SheetView} + config, lua, + sheet::register::Register, + state::{window::Window, GlobalState}, + tui, + widgets::{logview::LogView, luaeditor::LuaEditor, sheetview::SheetView}, }; use ratatui::{ @@ -13,19 +17,22 @@ use ratatui::{ pub struct App { exit: bool, view: SheetView, - logview: Option<LogView>, + editor: LuaEditor, + logview: LogView, } impl App { pub fn new() -> Self { let sheet_id = Register::create(10, 50); - GlobalState::instance_mut().sheetview.set_active_sheet(Some(sheet_id)); - let view = SheetView::new(); + GlobalState::instance_mut() + .sheetview + .set_active_sheet(Some(sheet_id)); Self { exit: false, - view, - logview: None, + view: SheetView::new(), + editor: LuaEditor::new(), + logview: LogView::new(), } } @@ -61,23 +68,48 @@ impl App { } fn handle_key_event(&mut self, key_event: KeyEvent) { + let focus = { GlobalState::instance().active_window }; 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()) - } - } + let mut state = GlobalState::instance_mut(); + state.log.visible = !state.log.visible; } - _ => self.view.handle_key_event(key_event), + _ => { + match focus { + Window::View => self.view.handle_key_event(key_event), + Window::Editor => self.editor.handle_key_event(key_event), + Window::Log => self.logview.handle_key_event(key_event), + Window::Error => {}, + } + }, } } fn exit(&mut self) { self.exit = true; } + + fn area(&self, area: Rect) -> (Rect, Option<Rect>, Option<Rect>) { + let state = GlobalState::instance(); + let mut view = area; + let mut editor = None; + let mut log = None; + + if state.log.visible { + let layout = Layout::vertical([Constraint::Min(1), Constraint::Length(15)]).split(view); + view = layout[0]; + log = Some(layout[1]); + } + + if state.editor.visible { + let layout = Layout::horizontal([Constraint::Min(1), Constraint::Length(80)]).split(view); + view = layout[0]; + editor = Some(layout[1]); + } + + (view, editor, log) + } } impl Widget for &mut App { @@ -85,14 +117,16 @@ impl Widget for &mut App { 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), + let (view, editor, log) = self.area(area); + + self.view.render(view, buf); + + if let Some(editor) = editor { + self.editor.render(editor, buf); + } + + if let Some(log) = log { + self.logview.render(log, buf); } } } |