summaryrefslogtreecommitdiff
path: root/src/app.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app.rs')
-rw-r--r--src/app.rs76
1 files changed, 55 insertions, 21 deletions
diff --git a/src/app.rs b/src/app.rs
index b245b5b..89b19dc 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -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);
}
}
}