UPDATE: Adds ability to show/hide grid lines (#71)
This commit is contained in:
committed by
GitHub
parent
49c3b14bf0
commit
b37397acb8
@@ -683,6 +683,13 @@ impl Model {
|
|||||||
Err(format!("Invalid color: {}", color))
|
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 {
|
fn get_cell_value(&self, cell: &Cell, cell_reference: CellReferenceIndex) -> CalcResult {
|
||||||
use Cell::*;
|
use Cell::*;
|
||||||
match cell {
|
match cell {
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ impl Model {
|
|||||||
color: Default::default(),
|
color: Default::default(),
|
||||||
frozen_columns: 0,
|
frozen_columns: 0,
|
||||||
frozen_rows: 0,
|
frozen_rows: 0,
|
||||||
|
show_grid_lines: true,
|
||||||
views,
|
views,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ mod test_clear_cells;
|
|||||||
mod test_diff_queue;
|
mod test_diff_queue;
|
||||||
mod test_evaluation;
|
mod test_evaluation;
|
||||||
mod test_general;
|
mod test_general;
|
||||||
|
mod test_grid_lines;
|
||||||
mod test_rename_sheet;
|
mod test_rename_sheet;
|
||||||
mod test_row_column;
|
mod test_row_column;
|
||||||
mod test_styles;
|
mod test_styles;
|
||||||
|
|||||||
42
base/src/test/user_model/test_grid_lines.rs
Normal file
42
base/src/test/user_model/test_grid_lines.rs
Normal 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));
|
||||||
|
}
|
||||||
@@ -111,6 +111,8 @@ pub struct Worksheet {
|
|||||||
pub frozen_rows: i32,
|
pub frozen_rows: i32,
|
||||||
pub frozen_columns: i32,
|
pub frozen_columns: i32,
|
||||||
pub views: HashMap<u32, WorksheetView>,
|
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
|
/// Internal representation of Excel's sheet_data
|
||||||
|
|||||||
@@ -130,7 +130,11 @@ enum Diff {
|
|||||||
old_value: String,
|
old_value: String,
|
||||||
new_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>;
|
type DiffList = Vec<Diff>;
|
||||||
@@ -1107,6 +1111,25 @@ impl UserModel {
|
|||||||
}
|
}
|
||||||
Ok(())
|
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 ****** //
|
// **** Private methods ****** //
|
||||||
|
|
||||||
fn push_diff_list(&mut self, diff_list: DiffList) {
|
fn push_diff_list(&mut self, diff_list: DiffList) {
|
||||||
@@ -1270,6 +1293,13 @@ impl UserModel {
|
|||||||
} => {
|
} => {
|
||||||
self.model.set_sheet_color(*index, old_value)?;
|
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 {
|
if needs_evaluation {
|
||||||
@@ -1390,6 +1420,13 @@ impl UserModel {
|
|||||||
} => {
|
} => {
|
||||||
self.model.set_sheet_color(*index, new_value)?;
|
self.model.set_sheet_color(*index, new_value)?;
|
||||||
}
|
}
|
||||||
|
Diff::SetShowGridLines {
|
||||||
|
sheet,
|
||||||
|
old_value: _,
|
||||||
|
new_value,
|
||||||
|
} => {
|
||||||
|
self.model.set_show_grid_lines(*sheet, *new_value)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -338,4 +338,20 @@ impl Model {
|
|||||||
.set_top_left_visible_cell(top_row, top_column)
|
.set_top_left_visible_cell(top_row, top_column)
|
||||||
.map_err(to_js_error)
|
.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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -544,6 +544,7 @@ struct SheetView {
|
|||||||
frozen_columns: i32,
|
frozen_columns: i32,
|
||||||
frozen_rows: i32,
|
frozen_rows: i32,
|
||||||
range: [i32; 4],
|
range: [i32; 4],
|
||||||
|
show_grid_lines: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for SheetView {
|
impl Default for SheetView {
|
||||||
@@ -555,6 +556,7 @@ impl Default for SheetView {
|
|||||||
frozen_rows: 0,
|
frozen_rows: 0,
|
||||||
frozen_columns: 0,
|
frozen_columns: 0,
|
||||||
range: [1, 1, 1, 1],
|
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 sheet_view = sheet_view[0];
|
||||||
let is_selected = sheet_view.attribute("tabSelected").unwrap_or("0") == "1";
|
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
|
let pane = sheet_view
|
||||||
.children()
|
.children()
|
||||||
@@ -654,6 +657,7 @@ fn get_sheet_view(ws: Node) -> SheetView {
|
|||||||
selected_row,
|
selected_row,
|
||||||
selected_column,
|
selected_column,
|
||||||
is_selected,
|
is_selected,
|
||||||
|
show_grid_lines,
|
||||||
range: [row1, column1, row2, column2],
|
range: [row1, column1, row2, column2],
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -980,6 +984,7 @@ pub(super) fn load_sheet<R: Read + std::io::Seek>(
|
|||||||
comments: settings.comments,
|
comments: settings.comments,
|
||||||
frozen_rows: sheet_view.frozen_rows,
|
frozen_rows: sheet_view.frozen_rows,
|
||||||
frozen_columns: sheet_view.frozen_columns,
|
frozen_columns: sheet_view.frozen_columns,
|
||||||
|
show_grid_lines: sheet_view.show_grid_lines,
|
||||||
views,
|
views,
|
||||||
},
|
},
|
||||||
sheet_view.is_selected,
|
sheet_view.is_selected,
|
||||||
|
|||||||
BIN
xlsx/tests/NoGrid.xlsx
Normal file
BIN
xlsx/tests/NoGrid.xlsx
Normal file
Binary file not shown.
Binary file not shown.
@@ -48,6 +48,27 @@ fn test_example() {
|
|||||||
assert_eq!(workbook, model2.workbook, "{:?}", s);
|
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]
|
#[test]
|
||||||
fn test_save_to_xlsx() {
|
fn test_save_to_xlsx() {
|
||||||
let mut model = load_from_xlsx("tests/example.xlsx", "en", "UTC").unwrap();
|
let mut model = load_from_xlsx("tests/example.xlsx", "en", "UTC").unwrap();
|
||||||
|
|||||||
Reference in New Issue
Block a user