summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app.rs14
-rw-r--r--src/sheet/cell.rs4
-rw-r--r--src/widgets/sheetview/mod.rs48
3 files changed, 50 insertions, 16 deletions
diff --git a/src/app.rs b/src/app.rs
index f60c2ca..a215859 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -20,19 +20,7 @@ pub struct App {
impl App {
pub fn new() -> Self {
- let sheet_id = Register::create(200, 1000);
- let sheet = Register::get(sheet_id).unwrap();
-
- {
- let mut sheet = sheet.write().unwrap();
-
- for row in 0..sheet.height() {
- for column in 0..sheet.width() {
- sheet.set_cell(row, column, format!("{}/{}", row, column).into());
- }
- }
- }
-
+ let sheet_id = Register::create(10, 50);
let view = SheetView::new(sheet_id);
Self {
diff --git a/src/sheet/cell.rs b/src/sheet/cell.rs
index 9bee8ca..9608b93 100644
--- a/src/sheet/cell.rs
+++ b/src/sheet/cell.rs
@@ -30,8 +30,8 @@ impl<'lua> FromLua<'lua> for Cell {
match value {
Value::Nil => Ok(Cell::new_empty()),
Value::Boolean(b) => Ok(Cell::String(b.to_string())),
- Value::Integer(n) => Ok(Cell::String(n.to_string())),
- Value::Number(n) => Ok(Cell::String(n.to_string())),
+ Value::Integer(n) => Ok(Cell::Number(n as f64)),
+ Value::Number(n) => Ok(Cell::Number(n)),
Value::String(s) => Ok(Cell::String(s.to_str()?.to_string())),
_ => Err(mlua::Error::runtime(
"cell content must be number or string",
diff --git a/src/widgets/sheetview/mod.rs b/src/widgets/sheetview/mod.rs
index 7b539ea..fa11d1d 100644
--- a/src/widgets/sheetview/mod.rs
+++ b/src/widgets/sheetview/mod.rs
@@ -12,6 +12,7 @@ use crate::{
config::{theme::style, GlobalConfig},
lua,
sheet::{
+ cell::Cell,
eval::EvalFunction,
register::{Register, SheetId},
Sheet,
@@ -163,9 +164,50 @@ impl SheetView {
self.mode = SheetViewMode::Command;
self.bar.set_input_mode(true)
}
+ KeyCode::Enter => {
+ self.mode = SheetViewMode::Insert;
+ self.bar.set_input_mode(true);
+ }
_ => {}
},
- SheetViewMode::Insert => {}
+ SheetViewMode::Insert => match event.code {
+ KeyCode::Enter => {
+ let lock = Register::get(self.sheet).unwrap();
+ let mut sheet = lock.write().unwrap();
+
+ if let Some(_) = self.selection_anchor {
+ self.selection().iter().map(|(r, c)| (*r, *c)).collect()
+ } else {
+ vec![self.cursor]
+ }
+ .into_iter()
+ .for_each(|(r, c)| {
+ sheet.set_cell(r as usize, c as usize, {
+ let s = self.bar.input().unwrap();
+ match s.parse() {
+ Ok(n) => Cell::Number(n),
+ Err(_) => Cell::String(s.to_string()),
+ }
+ })
+ });
+
+ self.bar.set_input_mode(false);
+ if self.selection_anchor.is_some() {
+ self.mode = SheetViewMode::Visual;
+ } else {
+ self.mode = SheetViewMode::Normal;
+ }
+ }
+ KeyCode::Esc => {
+ if self.selection_anchor.is_some() {
+ self.mode = SheetViewMode::Visual;
+ } else {
+ self.mode = SheetViewMode::Normal;
+ }
+ self.bar.set_input_mode(false);
+ }
+ _ => self.bar.handle_keyevent(event),
+ },
SheetViewMode::Visual => match event.code {
KeyCode::Char('j') => self.move_cursor_by((1, 0)),
KeyCode::Char('k') => self.move_cursor_by((-1, 0)),
@@ -183,6 +225,10 @@ impl SheetView {
self.mode = SheetViewMode::Command;
self.bar.set_input_mode(true)
}
+ KeyCode::Enter => {
+ self.mode = SheetViewMode::Insert;
+ self.bar.set_input_mode(true);
+ }
_ => {}
},
SheetViewMode::Command => match event.code {