summaryrefslogtreecommitdiff
path: root/src/widgets/sheetview
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-08-03 00:08:47 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-08-03 00:08:47 +0200
commiteafde55afcdf9dc4c17c6c97c1db472fc9ff9957 (patch)
tree838cab985495ead6dc005bd934f9e87c896e4ddd /src/widgets/sheetview
parentbb9944d086332ed0b8d6064316225e901c456bd7 (diff)
add keymap for view and global
Diffstat (limited to 'src/widgets/sheetview')
-rw-r--r--src/widgets/sheetview/mod.rs116
1 files changed, 13 insertions, 103 deletions
diff --git a/src/widgets/sheetview/mod.rs b/src/widgets/sheetview/mod.rs
index 6bd8408..fe2aa5a 100644
--- a/src/widgets/sheetview/mod.rs
+++ b/src/widgets/sheetview/mod.rs
@@ -6,11 +6,12 @@ use ratatui::{
};
use crate::{
- config::{theme::view::bar::SheetViewBarTheme, GlobalConfig},
- cursor::CursorMove,
+ config::{keymap::ViewKeyMap, theme::view::bar::SheetViewBarTheme, GlobalConfig},
lua,
- sheet::cell::Cell,
- state::{view::{bar::SheetViewBarState, mode::Mode}, window::Window, GlobalState},
+ state::{
+ view::{bar::SheetViewBarState, mode::Mode},
+ GlobalState,
+ },
};
use super::statusbar::StatusBar;
@@ -31,108 +32,9 @@ impl SheetView {
}
}
- fn set_mode(&self, mode: Mode) {
- GlobalState::instance_mut().view.mode = mode;
- }
-
- fn move_cursor(&self, cm: CursorMove) {
- GlobalState::instance_mut()
- .view
- .cursor
- .move_checked(cm)
- }
-
- fn start_selection(&self) {
- let mut state = GlobalState::instance_mut();
- state.view.selection_anchor = Some((state.view.cursor.y(), state.view.cursor.x()));
- state.view.mode = Mode::Visual;
- }
-
- fn stop_selection(&self) {
- let mut state = GlobalState::instance_mut();
- state.view.selection_anchor = None;
- state.view.mode = Mode::Normal;
- }
-
- fn open_editor(&self) {
- let mut state = GlobalState::instance_mut();
- state.editor.buffer.set_lines_from_string(
- r#"require('neosheet')
- .state
- .view
- .active:map(function(cell)
- return ""
-end)"#,
- );
- state.set_focus(Window::Editor)
- }
-
pub fn handle_key_event(&mut self, event: KeyEvent) {
let mode = { GlobalState::instance().view.mode };
match mode {
- Mode::Normal => match event.code {
- KeyCode::Char('j') => self.move_cursor(CursorMove::Down(1)),
- KeyCode::Char('k') => self.move_cursor(CursorMove::Up(1)),
- KeyCode::Char('h') => self.move_cursor(CursorMove::Left(1)),
- KeyCode::Char('l') => self.move_cursor(CursorMove::Right(1)),
- KeyCode::Char('v') => self.start_selection(),
- KeyCode::Char('s') => self.open_editor(),
- KeyCode::Char(':') => {
- self.set_mode(Mode::Command);
- self.bar.set_input_mode(true);
- }
- KeyCode::Enter => {
- self.set_mode(Mode::Insert);
- self.bar.set_input_mode(true);
- }
- _ => {}
- },
- Mode::Insert => match event.code {
- KeyCode::Enter => {
- let mut state = GlobalState::instance_mut();
- let lock = state.view.active_sheet().unwrap();
- let mut sheet = lock.write().unwrap();
-
- state
- .view
- .selection_or_cursor()
- .into_iter()
- .for_each(|(r, c)| {
- sheet.set_cell(r, c, {
- let s = self.bar.input().unwrap();
- match s.parse() {
- Ok(n) => Cell::Number(n),
- Err(_) => Cell::String(s.to_string()),
- }
- })
- });
-
- state.view.cancel_mode();
- self.bar.set_input_mode(false);
- }
- KeyCode::Esc => {
- GlobalState::instance_mut().view.cancel_mode();
- self.bar.set_input_mode(false);
- }
- _ => self.bar.handle_keyevent(event),
- },
- Mode::Visual => match event.code {
- KeyCode::Char('j') => self.move_cursor(CursorMove::Down(1)),
- KeyCode::Char('k') => self.move_cursor(CursorMove::Up(1)),
- KeyCode::Char('h') => self.move_cursor(CursorMove::Left(1)),
- KeyCode::Char('l') => self.move_cursor(CursorMove::Right(1)),
- KeyCode::Char('v') | KeyCode::Esc => self.stop_selection(),
- KeyCode::Char('s') => self.open_editor(),
- KeyCode::Char(':') => {
- self.set_mode(Mode::Command);
- self.bar.set_input_mode(true);
- }
- KeyCode::Enter => {
- self.set_mode(Mode::Insert);
- self.bar.set_input_mode(true);
- }
- _ => {}
- },
Mode::Command => match event.code {
KeyCode::Enter => {
if let Err(_error) = lua::get().load(self.bar.input().unwrap_or("")).exec() {
@@ -148,6 +50,14 @@ end)"#,
}
_ => self.bar.handle_keyevent(event),
},
+ _ => {
+ ViewKeyMap::handle(event);
+
+ let mode = { GlobalState::instance().view.mode };
+ if let Mode::Command = mode {
+ self.bar.set_input_mode(true)
+ }
+ }
}
}
}