UPDATE: Hide/Unhide sheets
This commit is contained in:
@@ -682,6 +682,13 @@ impl Model {
|
||||
Err(format!("Invalid color: {}", color))
|
||||
}
|
||||
|
||||
/// Changes the visibility of a sheet
|
||||
pub fn set_sheet_state(&mut self, sheet: u32, state: SheetState) -> Result<(), String> {
|
||||
let worksheet = self.workbook.worksheet_mut(sheet)?;
|
||||
worksheet.state = state;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// 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)?;
|
||||
|
||||
@@ -14,6 +14,7 @@ mod test_on_paste_styles;
|
||||
mod test_paste_csv;
|
||||
mod test_rename_sheet;
|
||||
mod test_row_column;
|
||||
mod test_sheet_state;
|
||||
mod test_styles;
|
||||
mod test_to_from_bytes;
|
||||
mod test_undo_redo;
|
||||
|
||||
57
base/src/test/user_model/test_sheet_state.rs
Normal file
57
base/src/test/user_model/test_sheet_state.rs
Normal file
@@ -0,0 +1,57 @@
|
||||
#![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);
|
||||
|
||||
// add three more sheets
|
||||
model.new_sheet().unwrap();
|
||||
model.new_sheet().unwrap();
|
||||
model.new_sheet().unwrap();
|
||||
|
||||
let info = model.get_worksheets_properties();
|
||||
assert_eq!(info.len(), 4);
|
||||
for sheet in &info {
|
||||
assert_eq!(sheet.state, "visible".to_string());
|
||||
}
|
||||
|
||||
model.set_selected_sheet(2).unwrap();
|
||||
assert_eq!(info.get(2).unwrap().name, "Sheet3".to_string());
|
||||
|
||||
model.hide_sheet(2).unwrap();
|
||||
|
||||
let info = model.get_worksheets_properties();
|
||||
assert_eq!(model.get_selected_sheet(), 3);
|
||||
assert_eq!(info.get(2).unwrap().state, "hidden".to_string());
|
||||
|
||||
model.undo().unwrap();
|
||||
let info = model.get_worksheets_properties();
|
||||
assert_eq!(info.get(2).unwrap().state, "visible".to_string());
|
||||
model.redo().unwrap();
|
||||
let info = model.get_worksheets_properties();
|
||||
assert_eq!(info.get(2).unwrap().state, "hidden".to_string());
|
||||
|
||||
model.set_selected_sheet(3).unwrap();
|
||||
model.hide_sheet(3).unwrap();
|
||||
assert_eq!(model.get_selected_sheet(), 0);
|
||||
|
||||
model.unhide_sheet(2).unwrap();
|
||||
model.unhide_sheet(3).unwrap();
|
||||
|
||||
let info = model.get_worksheets_properties();
|
||||
assert_eq!(info.len(), 4);
|
||||
for sheet in &info {
|
||||
assert_eq!(sheet.state, "visible".to_string());
|
||||
}
|
||||
|
||||
model.undo().unwrap();
|
||||
let info = model.get_worksheets_properties();
|
||||
assert_eq!(info.get(3).unwrap().state, "hidden".to_string());
|
||||
model.redo().unwrap();
|
||||
let info = model.get_worksheets_properties();
|
||||
assert_eq!(info.get(3).unwrap().state, "visible".to_string());
|
||||
}
|
||||
@@ -13,8 +13,8 @@ use crate::{
|
||||
},
|
||||
model::Model,
|
||||
types::{
|
||||
Alignment, BorderItem, CellType, Col, HorizontalAlignment, SheetProperties, Style,
|
||||
VerticalAlignment,
|
||||
Alignment, BorderItem, CellType, Col, HorizontalAlignment, SheetProperties, SheetState,
|
||||
Style, VerticalAlignment,
|
||||
},
|
||||
utils::is_valid_hex_color,
|
||||
};
|
||||
@@ -440,6 +440,48 @@ impl UserModel {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Hides sheet by index
|
||||
///
|
||||
/// See also:
|
||||
/// * [Model::set_sheet_state]
|
||||
/// * [UserModel::unhide_sheet]
|
||||
pub fn hide_sheet(&mut self, sheet: u32) -> Result<(), String> {
|
||||
let sheet_count = self.model.workbook.worksheets.len() as u32;
|
||||
for index in 1..sheet_count {
|
||||
let sheet_index = (sheet + index) % sheet_count;
|
||||
if self.model.workbook.worksheet(sheet_index)?.state == SheetState::Visible {
|
||||
if let Some(view) = self.model.workbook.views.get_mut(&self.model.view_id) {
|
||||
view.sheet = sheet_index;
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
let old_value = self.model.workbook.worksheet(sheet)?.state.clone();
|
||||
self.push_diff_list(vec![Diff::SetSheetState {
|
||||
index: sheet,
|
||||
new_value: SheetState::Hidden,
|
||||
old_value,
|
||||
}]);
|
||||
self.model.set_sheet_state(sheet, SheetState::Hidden)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Un hides sheet by index
|
||||
///
|
||||
/// See also:
|
||||
/// * [Model::set_sheet_state]
|
||||
/// * [UserModel::hide_sheet]
|
||||
pub fn unhide_sheet(&mut self, sheet: u32) -> Result<(), String> {
|
||||
let old_value = self.model.workbook.worksheet(sheet)?.state.clone();
|
||||
self.push_diff_list(vec![Diff::SetSheetState {
|
||||
index: sheet,
|
||||
new_value: SheetState::Visible,
|
||||
old_value,
|
||||
}]);
|
||||
self.model.set_sheet_state(sheet, SheetState::Visible)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Sets sheet color
|
||||
///
|
||||
/// Note: an empty string will remove the color
|
||||
@@ -1862,6 +1904,11 @@ impl UserModel {
|
||||
} => {
|
||||
self.model.set_show_grid_lines(*sheet, *old_value)?;
|
||||
}
|
||||
Diff::SetSheetState {
|
||||
index,
|
||||
old_value,
|
||||
new_value: _,
|
||||
} => self.model.set_sheet_state(*index, old_value.clone())?,
|
||||
}
|
||||
}
|
||||
if needs_evaluation {
|
||||
@@ -1989,6 +2036,11 @@ impl UserModel {
|
||||
} => {
|
||||
self.model.set_show_grid_lines(*sheet, *new_value)?;
|
||||
}
|
||||
Diff::SetSheetState {
|
||||
index,
|
||||
old_value: _,
|
||||
new_value,
|
||||
} => self.model.set_sheet_state(*index, new_value.clone())?,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ use std::collections::HashMap;
|
||||
|
||||
use bitcode::{Decode, Encode};
|
||||
|
||||
use crate::types::{Cell, Col, Row, Style};
|
||||
use crate::types::{Cell, Col, Row, SheetState, Style};
|
||||
|
||||
#[derive(Clone, Encode, Decode)]
|
||||
pub(crate) struct RowData {
|
||||
@@ -104,6 +104,11 @@ pub(crate) enum Diff {
|
||||
old_value: String,
|
||||
new_value: String,
|
||||
},
|
||||
SetSheetState {
|
||||
index: u32,
|
||||
old_value: SheetState,
|
||||
new_value: SheetState,
|
||||
},
|
||||
SetShowGridLines {
|
||||
sheet: u32,
|
||||
old_value: bool,
|
||||
|
||||
Reference in New Issue
Block a user