summaryrefslogtreecommitdiff
path: root/src/sheet/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sheet/mod.rs')
-rw-r--r--src/sheet/mod.rs60
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)
- })
- }
-}