UPDATE: Text spills now to adjacent cells if needed
This commit is contained in:
committed by
Nicolás Hatcher Andrés
parent
107fc99409
commit
9852ce2504
@@ -11,6 +11,7 @@ mod test_evaluation;
|
||||
mod test_general;
|
||||
mod test_grid_lines;
|
||||
mod test_keyboard_navigation;
|
||||
mod test_last_empty_cell;
|
||||
mod test_on_area_selection;
|
||||
mod test_on_expand_selected_range;
|
||||
mod test_on_paste_styles;
|
||||
|
||||
55
base/src/test/user_model/test_last_empty_cell.rs
Normal file
55
base/src/test/user_model/test_last_empty_cell.rs
Normal file
@@ -0,0 +1,55 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
|
||||
use crate::constants::LAST_ROW;
|
||||
use crate::expressions::types::Area;
|
||||
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);
|
||||
// This is the first row, column 5
|
||||
model.set_user_input(0, 3, 5, "todo").unwrap();
|
||||
|
||||
// Row 3 before column 5 should be empty
|
||||
assert_eq!(
|
||||
model
|
||||
.get_last_non_empty_in_row_before_column(0, 3, 4)
|
||||
.unwrap(),
|
||||
None
|
||||
);
|
||||
// Row 3 before column 5 should be 5
|
||||
assert_eq!(
|
||||
model
|
||||
.get_last_non_empty_in_row_before_column(0, 3, 7)
|
||||
.unwrap(),
|
||||
Some(5)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_last_empty_cell() {
|
||||
let model = new_empty_model();
|
||||
let mut model = UserModel::from_model(model);
|
||||
|
||||
let column_g_range = Area {
|
||||
sheet: 0,
|
||||
row: 1,
|
||||
column: 7,
|
||||
width: 1,
|
||||
height: LAST_ROW,
|
||||
};
|
||||
|
||||
model
|
||||
.update_range_style(&column_g_range, "fill.bg_color", "#333444")
|
||||
.unwrap();
|
||||
|
||||
// Column 7 has a style but it is empty
|
||||
assert_eq!(
|
||||
model
|
||||
.get_last_non_empty_in_row_before_column(0, 3, 14)
|
||||
.unwrap(),
|
||||
None
|
||||
);
|
||||
}
|
||||
@@ -13,8 +13,8 @@ use crate::{
|
||||
},
|
||||
model::Model,
|
||||
types::{
|
||||
Alignment, BorderItem, CellType, Col, HorizontalAlignment, SheetProperties, SheetState,
|
||||
Style, VerticalAlignment,
|
||||
Alignment, BorderItem, Cell, CellType, Col, HorizontalAlignment, SheetProperties,
|
||||
SheetState, Style, VerticalAlignment,
|
||||
},
|
||||
utils::is_valid_hex_color,
|
||||
};
|
||||
@@ -1602,6 +1602,64 @@ impl UserModel {
|
||||
Ok(self.model.workbook.worksheet(sheet)?.show_grid_lines)
|
||||
}
|
||||
|
||||
/// Returns the largest column in the row less than a column whose cell has a non empty value.
|
||||
/// If the row is empty, it returns `None`.
|
||||
/// This is useful when rendering a part of a worksheet to know which cells spill over
|
||||
pub fn get_last_non_empty_in_row_before_column(
|
||||
&self,
|
||||
sheet: u32,
|
||||
row: i32,
|
||||
column: i32,
|
||||
) -> Result<Option<i32>, String> {
|
||||
let worksheet = self.model.workbook.worksheet(sheet)?;
|
||||
let data = worksheet.sheet_data.get(&row);
|
||||
if let Some(row_data) = data {
|
||||
let mut last_column = None;
|
||||
let mut columns: Vec<i32> = row_data.keys().copied().collect();
|
||||
columns.sort_unstable();
|
||||
for col in columns {
|
||||
if col < column {
|
||||
if let Some(cell) = worksheet.cell(row, col) {
|
||||
if matches!(cell, Cell::EmptyCell { .. }) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
last_column = Some(col);
|
||||
}
|
||||
}
|
||||
Ok(last_column)
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the largest column in the row greater than a column whose cell has a non empty value.
|
||||
pub fn get_first_non_empty_in_row_after_column(
|
||||
&self,
|
||||
sheet: u32,
|
||||
row: i32,
|
||||
column: i32,
|
||||
) -> Result<Option<i32>, String> {
|
||||
let worksheet = self.model.workbook.worksheet(sheet)?;
|
||||
let data = worksheet.sheet_data.get(&row);
|
||||
if let Some(row_data) = data {
|
||||
let mut columns: Vec<i32> = row_data.keys().copied().collect();
|
||||
// We sort the keys to ensure we are going from left to right
|
||||
columns.sort_unstable();
|
||||
for col in columns {
|
||||
if col > column {
|
||||
if let Some(cell) = worksheet.cell(row, col) {
|
||||
if matches!(cell, Cell::EmptyCell { .. }) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return Ok(Some(col));
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
/// Returns a copy of the selected area
|
||||
pub fn copy_to_clipboard(&self) -> Result<Clipboard, String> {
|
||||
let selected_area = self.get_selected_view();
|
||||
|
||||
Reference in New Issue
Block a user