summaryrefslogtreecommitdiff
path: root/src/widgets/sheetview
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-08-01 20:13:55 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-08-01 20:13:55 +0200
commita807d4e6fb96c4d8b8585b7dbb862e53486562ec (patch)
tree92481d73423fd925f4dd034d68cbfd2e30e216d5 /src/widgets/sheetview
parent417cee4eeeaf7516dfeb59cdbe34fed18f30e0f7 (diff)
add evalsto
Diffstat (limited to 'src/widgets/sheetview')
-rw-r--r--src/widgets/sheetview/mod.rs110
1 files changed, 95 insertions, 15 deletions
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::<Vec<_>>();
+
+ 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();
}