From a807d4e6fb96c4d8b8585b7dbb862e53486562ec Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 1 Aug 2024 20:13:55 +0200 Subject: add evalsto --- src/widgets/sheetview/mod.rs | 110 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 95 insertions(+), 15 deletions(-) (limited to 'src/widgets/sheetview') diff --git a/src/widgets/sheetview/mod.rs b/src/widgets/sheetview/mod.rs index 40adfc7..fd0919d 100644 --- a/src/widgets/sheetview/mod.rs +++ b/src/widgets/sheetview/mod.rs @@ -9,7 +9,8 @@ use ratatui::{ }; use crate::{ - config::GlobalConfig, + config::{theme::style, GlobalConfig}, + lua, sheet::{ eval::EvalFunction, register::{Register, SheetId}, @@ -144,7 +145,7 @@ impl SheetView { } pub fn handle_key_event(&mut self, event: KeyEvent) { - match self.mode { + match &self.mode { SheetViewMode::Normal => match event.code { KeyCode::Char('j') => self.move_cursor_by((1, 0)), KeyCode::Char('k') => self.move_cursor_by((-1, 0)), @@ -153,11 +154,15 @@ impl SheetView { KeyCode::Char('v') => { self.selection_anchor = Some(self.cursor.clone()); self.mode = SheetViewMode::Visual - }, + } KeyCode::Char('s') => { self.editor.set_text("function(cell)\n\treturn \"\"\nend"); self.mode = SheetViewMode::Script; } + KeyCode::Char(':') => { + self.mode = SheetViewMode::Command; + self.bar.set_input_mode(true) + } _ => {} }, SheetViewMode::Insert => {} @@ -169,16 +174,42 @@ impl SheetView { KeyCode::Esc | KeyCode::Char('v') => { self.selection_anchor = None; self.mode = SheetViewMode::Normal; - }, + } KeyCode::Char('s') => { self.editor.set_text("function(cell)\n\treturn \"\"\nend"); self.mode = SheetViewMode::Script; } + KeyCode::Char(':') => { + self.mode = SheetViewMode::Command; + self.bar.set_input_mode(true) + } _ => {} }, - SheetViewMode::Command => {} + SheetViewMode::Command => match event.code { + KeyCode::Enter => { + if let Err(error) = lua::get().load(self.bar.input().unwrap_or("")).exec() { + self.mode = SheetViewMode::CommandError(error.to_string()) + } else { + if self.selection_anchor.is_some() { + self.mode = SheetViewMode::Visual; + } else { + self.mode = SheetViewMode::Normal; + } + } + + self.bar.set_input_mode(false); + } + KeyCode::Esc => { + if self.selection_anchor.is_some() { + self.mode = SheetViewMode::Visual; + } else { + self.mode = SheetViewMode::Normal; + } + } + _ => self.bar.handle_keyevent(event), + }, SheetViewMode::CommandError(_) => match event.code { - KeyCode::Esc => self.mode = SheetViewMode::Normal, + KeyCode::Esc | KeyCode::Enter => self.mode = SheetViewMode::Normal, _ => {} }, SheetViewMode::Script => match event.code { @@ -226,7 +257,7 @@ impl SheetView { self.join_process_handle_on_finished(); } SheetViewMode::EditorError(_) => match event.code { - KeyCode::Esc => self.mode = SheetViewMode::Script, + KeyCode::Esc | KeyCode::Enter => self.mode = SheetViewMode::Script, _ => {} }, } @@ -255,11 +286,22 @@ impl SheetView { } } - fn areas(&self, area: Rect) -> (Rect, Rect, Rect, Rect) { + fn areas(&self, area: Rect) -> (Rect, Rect, Rect, Rect, Rect) { let mut sheet = area; let mut editor = Rect::default(); let mut error = Rect::default(); let mut progress = Rect::default(); + let mut command_error = Rect::default(); + + if let SheetViewMode::CommandError(message) = &self.mode { + let layout = Layout::vertical([ + Constraint::Min(1), + Constraint::Length(message.lines().count().min(15) as u16 + 1), + ]) + .split(sheet); + sheet = layout[0]; + command_error = layout[1]; + } if self.is_editor_visible() { let layout = @@ -282,7 +324,7 @@ impl SheetView { } } - (sheet, editor, error, progress) + (sheet, editor, error, progress, command_error) } } @@ -293,7 +335,7 @@ impl Widget for &mut SheetView { { let theme = GlobalConfig::instance().theme.sheetview.clone(); let progress; - let (sheet_area, editor_area, error_area, progress_area) = self.areas(area); + let (sheet_area, editor_area, error_area, progress_area, cmd_error_area) = self.areas(area); let separator = Block::default().borders(Borders::RIGHT).border_style( Style::default() .bg(Color::Rgb(29, 32, 33)) @@ -331,17 +373,20 @@ impl Widget for &mut SheetView { for column in 0..(viewport_columns + 1) as u16 { let (cell_pos_y, cell_pos_x) = (row + self.scroll.0, column + self.scroll.1); - if let Some(cell) = sheet.get_cell(cell_pos_y as usize, cell_pos_x as usize) { - let cell = cell.to_string() + " "; + if let Some(cell_ref) = sheet.get_ref(cell_pos_y as usize, cell_pos_x as usize) + { + let cell = cell_ref.value().to_string() + " "; let line = if (cell_pos_y, cell_pos_x) == self.cursor { theme.cursor.apply(cell.to_line()) } else if self.is_in_selection(cell_pos_y, cell_pos_x) { theme.selection.apply(cell.to_line()) - } else if (row + column) % 2 == 0 { - theme.cell.0.apply(cell.to_line()) } else { - theme.cell.1.apply(cell.to_line()) + theme + .cell + .get(cell_ref, &lua::get()) + .unwrap_or(style::Style::new()) + .apply(cell.to_line()) }; let rect = Rect::new( @@ -357,6 +402,22 @@ impl Widget for &mut SheetView { } } + match &self.mode { + SheetViewMode::Command => { + self.bar.set_left(" COMMAND "); + } + + _ => { + if self.selection_anchor.is_some() { + self.bar.set_left(" VISUAL "); + } else { + self.bar.set_left(" NORMAL "); + self.bar.set_middle_alignment(Alignment::Center); + self.bar.set_middle("Sheet"); + } + } + } + self.bar.render(sheet_area, buf); if self.is_editor_visible() { @@ -383,6 +444,25 @@ impl Widget for &mut SheetView { .render(error_inner, buf); } + if let SheetViewMode::CommandError(message) = &self.mode { + let lines = message.lines().collect::>(); + + let block = Block::default() + .title_bottom(" Error ") + .title_style(Style::default().on_red()) + .border_style(Style::default().black().on_black()) + .borders(Borders::BOTTOM); + let error_inner = block.inner(cmd_error_area); + block.render(cmd_error_area, buf); + + let text = Text::from_iter(lines.iter().map(|s| s.to_line().white())); + + Paragraph::new(text) + .wrap(Wrap { trim: true }) + .bg(Color::Rgb(70, 25, 25)) + .render(error_inner, buf); + } + progress = sheet.progress(); } -- cgit v1.2.3-70-g09d2