From d9ffe5c43ee3ee4497ee88af6212fe868761e1dc Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 1 Aug 2024 20:56:33 +0200 Subject: fix cell typing --- src/app.rs | 14 +------------ src/sheet/cell.rs | 4 ++-- src/widgets/sheetview/mod.rs | 48 +++++++++++++++++++++++++++++++++++++++++++- 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 { -- cgit v1.2.3-70-g09d2