UPDATE: Adds ability to show/hide grid lines (#71)

This commit is contained in:
Nicolás Hatcher Andrés
2024-05-26 21:28:00 +02:00
committed by GitHub
parent 49c3b14bf0
commit b37397acb8
11 changed files with 133 additions and 1 deletions

View File

@@ -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 {

View File

@@ -65,6 +65,7 @@ impl Model {
color: Default::default(),
frozen_columns: 0,
frozen_rows: 0,
show_grid_lines: true,
views,
}
}

View File

@@ -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;

View File

@@ -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));
}

View File

@@ -111,6 +111,8 @@ pub struct Worksheet {
pub frozen_rows: i32,
pub frozen_columns: i32,
pub views: HashMap<u32, WorksheetView>,
/// Whether or not to show the grid lines in the worksheet
pub show_grid_lines: bool,
}
/// Internal representation of Excel's sheet_data

View File

@@ -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<Diff>;
@@ -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<bool, String> {
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)?;
}
}
}

View File

@@ -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<bool, JsError> {
self.model.get_show_grid_lines(sheet).map_err(to_js_error)
}
}

View File

@@ -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<R: Read + std::io::Seek>(
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,

BIN
xlsx/tests/NoGrid.xlsx Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -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();