1use crate::excel::Cell;
2use crate::utils::cell_reference;
3
4pub const EXCEL_MAX_COLS: usize = 16_384;
5pub const EXCEL_MAX_ROWS: usize = 1_048_576;
6
7#[derive(Clone)]
8pub struct FreezePanes {
9 pub rows: usize,
10 pub cols: usize,
11}
12
13impl FreezePanes {
14 #[must_use]
15 pub fn none() -> Self {
16 Self { rows: 0, cols: 0 }
17 }
18
19 #[must_use]
20 pub fn from_split_cell(row: usize, col: usize) -> Self {
21 Self {
22 rows: row.saturating_sub(1),
23 cols: col.saturating_sub(1),
24 }
25 }
26
27 #[must_use]
28 pub fn is_frozen(&self) -> bool {
29 self.rows > 0 || self.cols > 0
30 }
31
32 #[must_use]
33 pub fn split_cell(&self) -> (usize, usize) {
34 (self.rows + 1, self.cols + 1)
35 }
36
37 #[must_use]
38 pub fn split_cell_ref(&self) -> String {
39 cell_reference(self.split_cell())
40 }
41}
42
43impl Default for FreezePanes {
44 fn default() -> Self {
45 Self::none()
46 }
47}
48
49#[derive(Clone)]
50pub struct Sheet {
51 pub name: String,
52 pub data: Vec<Vec<Cell>>,
53 pub max_rows: usize,
54 pub max_cols: usize,
55 pub is_loaded: bool,
56 pub freeze_panes: FreezePanes,
57}
58
59impl Sheet {
60 #[must_use]
61 pub fn blank(name: String) -> Self {
62 Self {
63 name,
64 data: vec![vec![Cell::empty(); 2]; 2],
65 max_rows: 1,
66 max_cols: 1,
67 is_loaded: true,
68 freeze_panes: FreezePanes::none(),
69 }
70 }
71}