diff options
Diffstat (limited to 'src/sheet/mod.rs')
| -rw-r--r-- | src/sheet/mod.rs | 60 |
1 files changed, 8 insertions, 52 deletions
diff --git a/src/sheet/mod.rs b/src/sheet/mod.rs index 18ccee0..11f95c9 100644 --- a/src/sheet/mod.rs +++ b/src/sheet/mod.rs @@ -1,13 +1,11 @@ -use std::{ - sync::{Arc, Mutex, RwLock}, - thread::JoinHandle, -}; +use std::sync::Mutex; use cell::{Cell, CellRef}; use mlua::prelude::*; use register::{Register, SheetId}; pub mod cell; +pub mod eval; pub mod register; #[derive(Debug, Default)] @@ -43,7 +41,9 @@ impl Sheet { } pub fn get_ref(&self, row: usize, column: usize) -> Option<CellRef> { - CellRef::new(self.id, row, column) + self.get_cell(row, column).map(|cell| { + unsafe { CellRef::new(self.id, row, column, cell.clone()) } + }) } pub fn height(&self) -> usize { @@ -113,56 +113,12 @@ impl LuaUserData for SheetLuaRef { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_method_mut("cell", |lua, luaref, (row, column): (usize, usize)| { - if let Some(_) = Register::get(luaref.id) { - Ok(CellRef::new(luaref.id, row, column).into_lua(lua).unwrap()) + if let Some(rw) = Register::get(luaref.id) { + let sheet = rw.read().unwrap(); + Ok(sheet.get_ref(row, column).into_lua(lua).unwrap()) } else { Ok(LuaValue::Nil) } }) } } - -pub trait EvalFunction { - fn eval_function( - &self, - func: String, - range: Vec<(usize, usize)>, - ) -> JoinHandle<Result<Sheet, String>>; -} - -impl EvalFunction for Arc<RwLock<Sheet>> { - fn eval_function( - &self, - func_text: String, - range: Vec<(usize, usize)>, - ) -> JoinHandle<Result<Sheet, String>> { - let this = Arc::clone(self); - std::thread::spawn(move || { - let read_sheet = this.read().unwrap(); - *read_sheet.progress.lock().unwrap() = 0; - let mut sheet = read_sheet.clone(); - - let lua = crate::lua::new_instance().unwrap(); - let result = lua - .load(func_text.clone()) - .set_name("Temp Script") - .eval::<LuaFunction>(); - - match result { - Ok(func) => { - for (i, (row, column)) in range.iter().enumerate() { - *read_sheet.progress.lock().unwrap() = (i * 100 / range.len()) as u8; - let cellref = read_sheet.get_ref(*row, *column); - match func.call::<_, Cell>(cellref) { - Ok(cell) => sheet.set_cell(*row, *column, cell), - Err(error) => return Err(error.to_string()), - } - } - } - Err(error) => return Err(error.to_string()), - } - - Ok(sheet) - }) - } -} |