FIX: Minor fixes and refactor

This commit is contained in:
Nicolás Hatcher
2025-02-15 10:35:39 +01:00
committed by Nicolás Hatcher Andrés
parent edd00096b6
commit 74be62823d
2 changed files with 58 additions and 84 deletions

View File

@@ -1,7 +1,6 @@
use crate::{ use crate::{
constants::{LAST_COLUMN, LAST_ROW}, constants::{LAST_COLUMN, LAST_ROW},
expressions::types::Area, expressions::types::Area,
types::Style,
}; };
use super::{ use super::{
@@ -9,20 +8,21 @@ use super::{
}; };
impl UserModel { impl UserModel {
fn get_new_border_value( fn update_single_cell_border(
&self, &mut self,
border_area: &BorderArea, border_area: &BorderArea,
old_value: &Option<Style>, cell: (u32, i32, i32),
row: i32,
column: i32,
range: (i32, i32, i32, i32), range: (i32, i32, i32, i32),
) -> Result<Style, String> { diff_list: &mut Vec<Diff>,
let mut new_value = match old_value { ) -> Result<(), String> {
let (sheet, row, column) = cell;
let (first_row, first_column, last_row, last_column) = range;
let old_value = self.model.get_cell_style_or_none(sheet, row, column)?;
let mut new_value = match &old_value {
Some(value) => value.clone(), Some(value) => value.clone(),
None => Default::default(), None => Default::default(),
}; };
let (first_row, first_column, last_row, last_column) = range;
match border_area.r#type { match border_area.r#type {
BorderType::All => { BorderType::All => {
new_value.border.top = Some(border_area.item.clone()); new_value.border.top = Some(border_area.item.clone());
@@ -101,7 +101,15 @@ impl UserModel {
new_value.border.left = None; new_value.border.left = None;
} }
} }
Ok(new_value) self.model.set_cell_style(sheet, row, column, &new_value)?;
diff_list.push(Diff::SetCellStyle {
sheet,
row,
column,
old_value: Box::new(old_value),
new_value: Box::new(new_value),
});
Ok(())
} }
fn set_rows_with_border( fn set_rows_with_border(
@@ -188,23 +196,12 @@ impl UserModel {
.map(|row_data| row_data.keys().copied().collect()) .map(|row_data| row_data.keys().copied().collect())
.unwrap_or_default(); .unwrap_or_default();
for column in columns { for column in columns {
let old_value = self.model.get_cell_style_or_none(sheet, row, column)?; self.update_single_cell_border(
let new_value = self.get_new_border_value(
border_area, border_area,
&old_value, (sheet, row, column),
row,
column,
(first_row, 1, last_row, LAST_COLUMN), (first_row, 1, last_row, LAST_COLUMN),
&mut diff_list,
)?; )?;
self.model.set_cell_style(sheet, row, column, &new_value)?;
diff_list.push(Diff::SetCellStyle {
sheet,
row,
column,
old_value: Box::new(old_value),
new_value: Box::new(new_value),
});
} }
self.model.set_row_style(sheet, row, &new_value)?; self.model.set_row_style(sheet, row, &new_value)?;
@@ -215,6 +212,7 @@ impl UserModel {
new_value: Box::new(new_value), new_value: Box::new(new_value),
}); });
} }
// TODO: We need to check the rows above and below. also any non empty cell in the rows above and below.
self.push_diff_list(diff_list); self.push_diff_list(diff_list);
Ok(()) Ok(())
} }
@@ -307,23 +305,12 @@ impl UserModel {
for &row in &data_rows { for &row in &data_rows {
if let Some(data_row) = self.model.workbook.worksheet(sheet)?.sheet_data.get(&row) { if let Some(data_row) = self.model.workbook.worksheet(sheet)?.sheet_data.get(&row) {
if data_row.get(&column).is_some() { if data_row.get(&column).is_some() {
let old_value = self.model.get_cell_style_or_none(sheet, row, column)?; self.update_single_cell_border(
let new_value = self.get_new_border_value(
border_area, border_area,
&old_value, (sheet, row, column),
row,
column,
(1, first_column, LAST_ROW, last_column), (1, first_column, LAST_ROW, last_column),
&mut diff_list,
)?; )?;
self.model.set_cell_style(sheet, row, column, &new_value)?;
diff_list.push(Diff::SetCellStyle {
sheet,
row,
column,
old_value: Box::new(old_value),
new_value: Box::new(new_value),
});
} }
} }
} }
@@ -331,23 +318,12 @@ impl UserModel {
// We also need to overwrite those that have a row style // We also need to overwrite those that have a row style
for row_s in styled_rows.iter() { for row_s in styled_rows.iter() {
let row = row_s.r; let row = row_s.r;
let old_value = self.model.get_cell_style_or_none(sheet, row, column)?; self.update_single_cell_border(
let new_value = self.get_new_border_value(
border_area, border_area,
&old_value, (sheet, row, column),
row,
column,
(1, first_column, LAST_ROW, last_column), (1, first_column, LAST_ROW, last_column),
&mut diff_list,
)?; )?;
self.model.set_cell_style(sheet, row, column, &new_value)?;
diff_list.push(Diff::SetCellStyle {
sheet,
row,
column,
old_value: Box::new(old_value),
new_value: Box::new(new_value),
});
} }
self.model.set_column_style(sheet, column, &new_value)?; self.model.set_column_style(sheet, column, &new_value)?;
@@ -358,6 +334,8 @@ impl UserModel {
new_value: Box::new(new_value), new_value: Box::new(new_value),
}); });
} }
// We need to check the borders of the column to the left and the column to the right
// We also need to check every non-empty cell in the columns to the left and right
self.push_diff_list(diff_list); self.push_diff_list(diff_list);
Ok(()) Ok(())
} }
@@ -388,23 +366,12 @@ impl UserModel {
let mut diff_list = Vec::new(); let mut diff_list = Vec::new();
for row in first_row..=last_row { for row in first_row..=last_row {
for column in first_column..=last_column { for column in first_column..=last_column {
let old_value = self.model.get_cell_style_or_none(sheet, row, column)?; self.update_single_cell_border(
let new_value = self.get_new_border_value(
border_area, border_area,
&old_value, (sheet, row, column),
row,
column,
(first_row, first_column, last_row, last_column), (first_row, first_column, last_row, last_column),
&mut diff_list,
)?; )?;
self.model.set_cell_style(sheet, row, column, &new_value)?;
diff_list.push(Diff::SetCellStyle {
sheet,
row,
column,
old_value: Box::new(old_value),
new_value: Box::new(new_value),
});
} }
} }

View File

@@ -1081,7 +1081,7 @@ impl UserModel {
Ok(()) Ok(())
} }
// Updates the style of a cell // Updates the style of a cell, adding the new style to the diff list
fn update_single_cell_style( fn update_single_cell_style(
&mut self, &mut self,
sheet: u32, sheet: u32,
@@ -1093,9 +1093,10 @@ impl UserModel {
) -> Result<(), String> { ) -> Result<(), String> {
// This is the value in the cell itself // This is the value in the cell itself
let old_value = self.model.get_cell_style_or_none(sheet, row, column)?; let old_value = self.model.get_cell_style_or_none(sheet, row, column)?;
// This takes into account row or column styles
let style = self.get_cell_style(sheet, row, column)?; // This takes into account row or column styles. If none of those are present, it will return the default style
let new_style = update_style(&style, style_path, value)?; let old_style = self.get_cell_style(sheet, row, column)?;
let new_style = update_style(&old_style, style_path, value)?;
self.model.set_cell_style(sheet, row, column, &new_style)?; self.model.set_cell_style(sheet, row, column, &new_style)?;
diff_list.push(Diff::SetCellStyle { diff_list.push(Diff::SetCellStyle {
sheet, sheet,
@@ -1118,6 +1119,9 @@ impl UserModel {
) -> Result<(), String> { ) -> Result<(), String> {
let sheet = range.sheet; let sheet = range.sheet;
let mut diff_list = Vec::new(); let mut diff_list = Vec::new();
if range.row == 1 && range.height == LAST_ROW {
// Full columns
let styled_rows = &self.model.workbook.worksheet(sheet)?.rows.clone();
// We need all the rows in the column to update the style // We need all the rows in the column to update the style
// NB: This is too much, this is all the rows that have values // NB: This is too much, this is all the rows that have values
let data_rows: Vec<i32> = self let data_rows: Vec<i32> = self
@@ -1128,9 +1132,6 @@ impl UserModel {
.keys() .keys()
.copied() .copied()
.collect(); .collect();
let styled_rows = &self.model.workbook.worksheet(sheet)?.rows.clone();
if range.row == 1 && range.height == LAST_ROW {
// Full columns
for column in range.column..range.column + range.width { for column in range.column..range.column + range.width {
// we set the style of the full column // we set the style of the full column
let old_style = self.model.get_column_style(sheet, column)?; let old_style = self.model.get_column_style(sheet, column)?;
@@ -1154,6 +1155,7 @@ impl UserModel {
self.model.workbook.worksheet(sheet)?.sheet_data.get(&row) self.model.workbook.worksheet(sheet)?.sheet_data.get(&row)
{ {
if data_row.get(&column).is_some() { if data_row.get(&column).is_some() {
// If the cell has non empty content it will always have some style
self.update_single_cell_style( self.update_single_cell_style(
sheet, sheet,
row, row,
@@ -1167,9 +1169,14 @@ impl UserModel {
} }
// We need to update the styles in all cells that have a row style // We need to update the styles in all cells that have a row style
for row_s in styled_rows.iter() { for row_s in styled_rows.iter() {
let row = row_s.r;
if data_rows.contains(&row) {
// Skip if the row has data
continue;
}
self.update_single_cell_style( self.update_single_cell_style(
sheet, sheet,
row_s.r, row,
column, column,
style_path, style_path,
value, value,
@@ -1201,7 +1208,7 @@ impl UserModel {
)?; )?;
} }
// We need to go through all the cells that have a column style and merge them // We need to go through all the cells that have a column style and merge the styles
for col in styled_columns.iter() { for col in styled_columns.iter() {
for column in col.min..col.max + 1 { for column in col.min..col.max + 1 {
self.update_single_cell_style( self.update_single_cell_style(