From 6ee450709a8800d8d7b615c20732987bd029cd85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Hatcher?= Date: Wed, 12 Feb 2025 16:12:11 +0100 Subject: [PATCH] FIX: Numerous fixes This also fix old issues: * Top border is only the top border of the selected area (and not he top border of each cell in the area) * Same for bottom, left and right borders Factored out all the border related issues to a new file --- base/src/test/user_model/test_border.rs | 53 +- base/src/user_model/border.rs | 540 +++++++++++++++++++ base/src/user_model/common.rs | 356 +----------- base/src/user_model/mod.rs | 1 + webapp/IronCalc/src/components/usePointer.ts | 1 - 5 files changed, 590 insertions(+), 361 deletions(-) create mode 100644 base/src/user_model/border.rs diff --git a/base/src/test/user_model/test_border.rs b/base/src/test/user_model/test_border.rs index c3f3375..a37ff0a 100644 --- a/base/src/test/user_model/test_border.rs +++ b/base/src/test/user_model/test_border.rs @@ -520,14 +520,19 @@ fn borders_top() { .unwrap(); model.set_area_with_border(range, &border_area).unwrap(); check_borders(&model); - for row in 5..9 { + for row in 4..9 { for column in 6..9 { let style = model.get_cell_style(0, row, column).unwrap(); let border_item = BorderItem { style: BorderStyle::Thin, color: Some("#FF5566".to_string()), }; - let bottom = if row == 8 { + let bottom = if row != 4 { + None + } else { + Some(border_item.clone()) + }; + let top = if row != 5 { None } else { Some(border_item.clone()) @@ -537,7 +542,7 @@ fn borders_top() { diagonal_down: false, left: None, right: None, - top: Some(border_item.clone()), + top, bottom, diagonal: None, }; @@ -647,12 +652,12 @@ fn borders_right() { style: BorderStyle::Thin, color: Some("#FF5566".to_string()), }; - let left = if column == 6 { + let left = if column != 9 { None } else { Some(border_item.clone()) }; - let right = if column == 9 { + let right = if column != 8 { None } else { Some(border_item.clone()) @@ -705,7 +710,7 @@ fn borders_bottom() { color: Some("#FF5566".to_string()), }; // The top will also have a value for all but the first one - let top = if row == 5 { + let bottom = if row != 8 { None } else { Some(border_item.clone()) @@ -715,8 +720,8 @@ fn borders_bottom() { diagonal_down: false, left: None, right: None, - top, - bottom: Some(border_item.clone()), + top: None, + bottom, diagonal: None, }; assert_eq!(style.border, expected_border); @@ -751,18 +756,13 @@ fn borders_left() { model.set_area_with_border(range, &border_area).unwrap(); for row in 5..9 { - for column in 5..9 { + for column in 6..9 { let style = model.get_cell_style(0, row, column).unwrap(); let border_item = BorderItem { style: BorderStyle::Thin, color: Some("#FF5566".to_string()), }; - let left = if column == 5 { - None - } else { - Some(border_item.clone()) - }; - let right = if column == 8 { + let left = if column != 6 { None } else { Some(border_item.clone()) @@ -771,13 +771,29 @@ fn borders_left() { diagonal_up: false, diagonal_down: false, left, - right, + right: None, top: None, bottom: None, diagonal: None, }; assert_eq!(style.border, expected_border); } + // Column 5 has a border to the right, of course: + let style = model.get_cell_style(0, row, 5).unwrap(); + let border_item = BorderItem { + style: BorderStyle::Thin, + color: Some("#FF5566".to_string()), + }; + let expected_border = Border { + diagonal_up: false, + diagonal_down: false, + left: None, + right: Some(border_item.clone()), + top: None, + bottom: None, + diagonal: None, + }; + assert_eq!(style.border, expected_border); } } @@ -1018,10 +1034,7 @@ fn border_top() { style: BorderStyle::Thin, color: Some("#F2F2F2".to_string()), }; - assert_eq!( - model._get_cell_actual_border("C4").bottom, - Some(border_item) - ); + assert_eq!(model._get_cell_actual_border("C4").top, Some(border_item)); model.undo().unwrap(); diff --git a/base/src/user_model/border.rs b/base/src/user_model/border.rs new file mode 100644 index 0000000..f81ade1 --- /dev/null +++ b/base/src/user_model/border.rs @@ -0,0 +1,540 @@ +use crate::{ + constants::{LAST_COLUMN, LAST_ROW}, + expressions::types::Area, + types::Style, +}; + +use super::{ + border_utils::is_max_border, common::BorderType, history::Diff, BorderArea, UserModel, +}; + +impl UserModel { + fn get_new_border_value( + &self, + border_area: &BorderArea, + old_value: &Option