diff --git a/base/src/model.rs b/base/src/model.rs index a029acd..695ec57 100644 --- a/base/src/model.rs +++ b/base/src/model.rs @@ -683,6 +683,13 @@ impl Model { Err(format!("Invalid color: {}", color)) } + /// Makes the grid lines in the sheet visible (`true`) or hidden (`false`) + pub fn set_show_grid_lines(&mut self, sheet: u32, show_grid_lines: bool) -> Result<(), String> { + let worksheet = self.workbook.worksheet_mut(sheet)?; + worksheet.show_grid_lines = show_grid_lines; + Ok(()) + } + fn get_cell_value(&self, cell: &Cell, cell_reference: CellReferenceIndex) -> CalcResult { use Cell::*; match cell { diff --git a/base/src/new_empty.rs b/base/src/new_empty.rs index 8d61ce0..3b01cc4 100644 --- a/base/src/new_empty.rs +++ b/base/src/new_empty.rs @@ -65,6 +65,7 @@ impl Model { color: Default::default(), frozen_columns: 0, frozen_rows: 0, + show_grid_lines: true, views, } } diff --git a/base/src/test/user_model/mod.rs b/base/src/test/user_model/mod.rs index a190c0e..646abfc 100644 --- a/base/src/test/user_model/mod.rs +++ b/base/src/test/user_model/mod.rs @@ -3,6 +3,7 @@ mod test_clear_cells; mod test_diff_queue; mod test_evaluation; mod test_general; +mod test_grid_lines; mod test_rename_sheet; mod test_row_column; mod test_styles; diff --git a/base/src/test/user_model/test_grid_lines.rs b/base/src/test/user_model/test_grid_lines.rs new file mode 100644 index 0000000..6abc7d9 --- /dev/null +++ b/base/src/test/user_model/test_grid_lines.rs @@ -0,0 +1,42 @@ +#![allow(clippy::unwrap_used)] + +use crate::test::util::new_empty_model; +use crate::UserModel; + +#[test] +fn basic_tests() { + let model = new_empty_model(); + let mut model = UserModel::from_model(model); + model.new_sheet(); + + // default sheet has show_grid_lines = true + assert_eq!(model.get_show_grid_lines(0), Ok(true)); + + // default new sheet has show_grid_lines = true + assert_eq!(model.get_show_grid_lines(1), Ok(true)); + + // wrong sheet number + assert_eq!( + model.get_show_grid_lines(2), + Err("Invalid sheet index".to_string()) + ); + + // we can set it + model.set_show_grid_lines(1, false).unwrap(); + assert_eq!(model.get_show_grid_lines(1), Ok(false)); + assert_eq!(model.get_show_grid_lines(0), Ok(true)); + + model.undo().unwrap(); + + assert_eq!(model.get_show_grid_lines(1), Ok(true)); + assert_eq!(model.get_show_grid_lines(0), Ok(true)); + + model.redo().unwrap(); + + let send_queue = model.flush_send_queue(); + let mut model2 = UserModel::from_model(new_empty_model()); + model2.apply_external_diffs(&send_queue).unwrap(); + + assert_eq!(model2.get_show_grid_lines(1), Ok(false)); + assert_eq!(model2.get_show_grid_lines(0), Ok(true)); +} diff --git a/base/src/types.rs b/base/src/types.rs index 042896f..ebda7c2 100644 --- a/base/src/types.rs +++ b/base/src/types.rs @@ -111,6 +111,8 @@ pub struct Worksheet { pub frozen_rows: i32, pub frozen_columns: i32, pub views: HashMap, + /// Whether or not to show the grid lines in the worksheet + pub show_grid_lines: bool, } /// Internal representation of Excel's sheet_data diff --git a/base/src/user_model.rs b/base/src/user_model.rs index cc10259..7fb7bbb 100644 --- a/base/src/user_model.rs +++ b/base/src/user_model.rs @@ -130,7 +130,11 @@ enum Diff { old_value: String, new_value: String, }, - // FIXME: we are missing SetViewDiffs + SetShowGridLines { + sheet: u32, + old_value: bool, + new_value: bool, + }, // FIXME: we are missing SetViewDiffs } type DiffList = Vec; @@ -1107,6 +1111,25 @@ impl UserModel { } Ok(()) } + + /// Set the gid lines in the worksheet to visible (`true`) or hidden (`false`) + pub fn set_show_grid_lines(&mut self, sheet: u32, show_grid_lines: bool) -> Result<(), String> { + let old_value = self.model.workbook.worksheet(sheet)?.show_grid_lines; + self.model.set_show_grid_lines(sheet, show_grid_lines)?; + + self.push_diff_list(vec![Diff::SetShowGridLines { + sheet, + new_value: show_grid_lines, + old_value, + }]); + Ok(()) + } + + /// Returns true in the grid lines for + pub fn get_show_grid_lines(&self, sheet: u32) -> Result { + Ok(self.model.workbook.worksheet(sheet)?.show_grid_lines) + } + // **** Private methods ****** // fn push_diff_list(&mut self, diff_list: DiffList) { @@ -1270,6 +1293,13 @@ impl UserModel { } => { self.model.set_sheet_color(*index, old_value)?; } + Diff::SetShowGridLines { + sheet, + old_value, + new_value: _, + } => { + self.model.set_show_grid_lines(*sheet, *old_value)?; + } } } if needs_evaluation { @@ -1390,6 +1420,13 @@ impl UserModel { } => { self.model.set_sheet_color(*index, new_value)?; } + Diff::SetShowGridLines { + sheet, + old_value: _, + new_value, + } => { + self.model.set_show_grid_lines(*sheet, *new_value)?; + } } } diff --git a/bindings/wasm/src/lib.rs b/bindings/wasm/src/lib.rs index f7ce52f..0af5018 100644 --- a/bindings/wasm/src/lib.rs +++ b/bindings/wasm/src/lib.rs @@ -338,4 +338,20 @@ impl Model { .set_top_left_visible_cell(top_row, top_column) .map_err(to_js_error) } + + #[wasm_bindgen(js_name = "setShowGridLines")] + pub fn set_show_grid_lines( + &mut self, + sheet: u32, + show_grid_lines: bool, + ) -> Result<(), JsError> { + self.model + .set_show_grid_lines(sheet, show_grid_lines) + .map_err(to_js_error) + } + + #[wasm_bindgen(js_name = "getShowGridLines")] + pub fn get_show_grid_lines(&mut self, sheet: u32) -> Result { + self.model.get_show_grid_lines(sheet).map_err(to_js_error) + } } diff --git a/xlsx/src/import/worksheets.rs b/xlsx/src/import/worksheets.rs index 3b291bb..e529842 100644 --- a/xlsx/src/import/worksheets.rs +++ b/xlsx/src/import/worksheets.rs @@ -544,6 +544,7 @@ struct SheetView { frozen_columns: i32, frozen_rows: i32, range: [i32; 4], + show_grid_lines: bool, } impl Default for SheetView { @@ -555,6 +556,7 @@ impl Default for SheetView { frozen_rows: 0, frozen_columns: 0, range: [1, 1, 1, 1], + show_grid_lines: true, } } } @@ -608,6 +610,7 @@ fn get_sheet_view(ws: Node) -> SheetView { let sheet_view = sheet_view[0]; let is_selected = sheet_view.attribute("tabSelected").unwrap_or("0") == "1"; + let show_grid_lines = sheet_view.attribute("showGridLines").unwrap_or("1") == "1"; let pane = sheet_view .children() @@ -654,6 +657,7 @@ fn get_sheet_view(ws: Node) -> SheetView { selected_row, selected_column, is_selected, + show_grid_lines, range: [row1, column1, row2, column2], } } else { @@ -980,6 +984,7 @@ pub(super) fn load_sheet( comments: settings.comments, frozen_rows: sheet_view.frozen_rows, frozen_columns: sheet_view.frozen_columns, + show_grid_lines: sheet_view.show_grid_lines, views, }, sheet_view.is_selected, diff --git a/xlsx/tests/NoGrid.xlsx b/xlsx/tests/NoGrid.xlsx new file mode 100644 index 0000000..24c3114 Binary files /dev/null and b/xlsx/tests/NoGrid.xlsx differ diff --git a/xlsx/tests/example.ic b/xlsx/tests/example.ic index 7e99ea3..1d31219 100644 Binary files a/xlsx/tests/example.ic and b/xlsx/tests/example.ic differ diff --git a/xlsx/tests/test.rs b/xlsx/tests/test.rs index 7e69c3c..822d32c 100644 --- a/xlsx/tests/test.rs +++ b/xlsx/tests/test.rs @@ -48,6 +48,27 @@ fn test_example() { assert_eq!(workbook, model2.workbook, "{:?}", s); } +#[test] +fn no_grid() { + let model = load_from_xlsx("tests/NoGrid.xlsx", "en", "UTC").unwrap(); + let workbook = model.workbook; + let ws = &workbook.worksheets; + + // NoGrid does not show grid lines + let no_grid_sheet = &ws[0]; + assert_eq!(no_grid_sheet.name, "NoGrid".to_string()); + assert!(!no_grid_sheet.show_grid_lines); + + let sheet2 = &ws[1]; + assert_eq!(no_grid_sheet.name, "NoGrid".to_string()); + assert!(sheet2.show_grid_lines); + + let no_grid_no_headers_sheet = &ws[2]; + assert_eq!(no_grid_sheet.name, "NoGrid".to_string()); + // There is also no headers + assert!(!no_grid_no_headers_sheet.show_grid_lines); +} + #[test] fn test_save_to_xlsx() { let mut model = load_from_xlsx("tests/example.xlsx", "en", "UTC").unwrap();