diff options
Diffstat (limited to 'src/sheet/cell.rs')
| -rw-r--r-- | src/sheet/cell.rs | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/src/sheet/cell.rs b/src/sheet/cell.rs index 53a4b04..9bee8ca 100644 --- a/src/sheet/cell.rs +++ b/src/sheet/cell.rs @@ -80,66 +80,80 @@ cell_from_integer!( f32, f64 ); -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] pub struct CellRef { row: usize, column: usize, sheet_id: SheetId, + cell: Cell, } impl CellRef { - pub fn new(sheet_id: SheetId, row: usize, column: usize) -> Option<Self> { + pub unsafe fn new(sheet_id: SheetId, row: usize, column: usize, cell: Cell) -> Self { + Self { + sheet_id, + row, + column, + cell + } + } + + pub fn fetch_new(sheet_id: SheetId, row: usize, column: usize) -> Option<Self> { Register::get(sheet_id) .map(|sheet| { - sheet.read().unwrap().get_cell(row, column).map(|_| Self { + sheet.read().unwrap().get_cell(row, column).map(|cell| Self { sheet_id, row, column, + cell: cell.clone(), }) }) .unwrap_or(None) } pub fn value(&self) -> Cell { - return Register::get(self.sheet_id) - .unwrap() - .read() + self.cell.clone() + } + + pub fn set_value(&mut self, cell: Cell) { + self.cell = cell.clone(); + Register::get(self.sheet_id) .unwrap() - .get_cell(self.row, self.column) + .write() .unwrap() - .clone(); + .set_cell(self.row, self.column, cell); } pub fn left(&self) -> Option<Self> { if self.column > 0 { - Self::new(self.sheet_id, self.row, self.column - 1) + Self::fetch_new(self.sheet_id, self.row, self.column - 1) } else { None } } pub fn right(&self) -> Option<Self> { - Self::new(self.sheet_id, self.row, self.column + 1) + Self::fetch_new(self.sheet_id, self.row, self.column + 1) } pub fn up(&self) -> Option<Self> { if self.row > 0 { - Self::new(self.sheet_id, self.row - 1, self.column) + Self::fetch_new(self.sheet_id, self.row - 1, self.column) } else { None } } pub fn down(&self) -> Option<Self> { - Self::new(self.sheet_id, self.row + 1, self.column) + Self::fetch_new(self.sheet_id, self.row + 1, self.column) } pub fn begin(&self) -> Option<Self> { - Self::new(self.sheet_id, self.row, 0) + Self::fetch_new(self.sheet_id, self.row, 0) } pub fn end(&self) -> Option<Self> { - Self::new( + Self::fetch_new( self.sheet_id, self.row, Register::get(self.sheet_id) @@ -152,11 +166,11 @@ impl CellRef { } pub fn top(&self) -> Option<Self> { - Self::new(self.sheet_id, 0, self.column) + Self::fetch_new(self.sheet_id, 0, self.column) } pub fn bottom(&self) -> Option<Self> { - Self::new( + Self::fetch_new( self.sheet_id, Register::get(self.sheet_id) .unwrap() |