From 945897a455d6f64e1c5c22b35c6bfaa40bf57401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Hatcher?= Date: Wed, 23 Apr 2025 11:43:36 +0200 Subject: [PATCH] WIP --- base/src/model.rs | 10 ++++++++++ .../src/test/user_model/test_dynamic_array.rs | 2 +- base/src/types.rs | 3 +++ .../src/components/Workbook/Workbook.tsx | 10 +++++++++- xlsx/tests/example.ic | Bin 4786 -> 4914 bytes 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/base/src/model.rs b/base/src/model.rs index 5f5c280..bfb8a38 100644 --- a/base/src/model.rs +++ b/base/src/model.rs @@ -2102,6 +2102,14 @@ impl Model { /// Returns a list of all cells pub fn get_all_cells(&self) -> Vec { let mut cells = Vec::new(); + for (sheet, row, column) in &self.workbook.calc_chain { + let cell = CellIndex { + row: *row, + column: *column, + index: *sheet, + }; + cells.push(cell); + } for (index, sheet) in self.workbook.worksheets.iter().enumerate() { let mut sorted_rows: Vec<_> = sheet.sheet_data.keys().collect(); sorted_rows.sort_unstable(); @@ -2128,6 +2136,8 @@ impl Model { let cells = self.get_all_cells(); + // First evaluate all dynamic arrays + for cell in cells { self.evaluate_cell(CellReferenceIndex { sheet: cell.index, diff --git a/base/src/test/user_model/test_dynamic_array.rs b/base/src/test/user_model/test_dynamic_array.rs index 351d177..1947d34 100644 --- a/base/src/test/user_model/test_dynamic_array.rs +++ b/base/src/test/user_model/test_dynamic_array.rs @@ -65,7 +65,7 @@ fn basic_undo_redo() { #[test] fn mixed_spills() { let mut model = UserModel::new_empty("model", "en", "UTC").unwrap(); - // D9 => ={1,2,3} + // D9 => ={34,35,3} model.set_user_input(0, 9, 4, "={34,35,3}").unwrap(); // F6 => ={1;2;3;4} model.set_user_input(0, 6, 6, "={1;2;3;4}").unwrap(); diff --git a/base/src/types.rs b/base/src/types.rs index abea099..4caae9a 100644 --- a/base/src/types.rs +++ b/base/src/types.rs @@ -51,6 +51,9 @@ pub struct Workbook { pub metadata: Metadata, pub tables: HashMap, pub views: HashMap, + /// Calculation chain of the dynamic arrays. + /// List of tuples (sheet_id, row, column) + pub calc_chain: Vec<(u32, i32, i32)>, } /// A defined name. The `sheet_id` is the sheet index in case the name is local diff --git a/webapp/IronCalc/src/components/Workbook/Workbook.tsx b/webapp/IronCalc/src/components/Workbook/Workbook.tsx index e1f93c0..796ec02 100644 --- a/webapp/IronCalc/src/components/Workbook/Workbook.tsx +++ b/webapp/IronCalc/src/components/Workbook/Workbook.tsx @@ -348,7 +348,15 @@ const Workbook = (props: { model: Model; workbookState: WorkbookState }) => { return workbookState.getEditingText(); } const { sheet, row, column } = model.getSelectedView(); - return model.getCellContent(sheet, row, column); + const r = model.getCellArrayStructure(sheet, row, column); + if (r === "SingleCell") { + return model.getCellContent(sheet, row, column); + } + if ("DynamicMother" in r) { + return model.getCellContent(sheet, row, column); + } + const [mother_row, mother_column, _] = r.DynamicChild; + return model.getCellContent(sheet, mother_row, mother_column); }; // returns true if it is either single cell or the root cell of an array diff --git a/xlsx/tests/example.ic b/xlsx/tests/example.ic index 740cd6bebc42f78ced0640739450fb46812ab4c5..4007d3abdec6f9b653435a8e483e1ff8f8539d85 100644 GIT binary patch delta 1578 zcmZuxOKTiQ5bpP5-m|;f_pT*blC8H^kt5q6cJ0K0T$B8QfRVu`gMIb*>=0}i@WFu) zauPWSIbiU?C#={;IJS~`41i$pXB zO2@OUygk#ck$TXdqqx^dGs!rWDkFKVt_7Af7D32W#5AUaGlCh#gbIdb*q9-0E<=@d zJ27ho361hWy)SC1#=T(^6Ga&!7*obECIn&1IVBV`0VN7zB*HiWg=t#3cH*21&Ol70 zk{nrW%6O~N2CtGBVpJ<=E{(z@OcNeaMySFH+SL>XN<=`c0~LjsKxt8!Jx~sD*iE2x zsBjoDVulK`G>mkd*Pu6?C%DGKfW%5iX+|(KKwy!~ctlKA5(hPwr=~MMjA53+;Dj>6 zzzM?~T9WV*z@)sO28LeXfzGH)hZIaQUE`5V>v1k93zG~Q@}e^eCh@M(hR3EW#*o$m zRRT7=XoLu&LLo^IY?}~S#b8k(B$LEE@G`WffWu+I<6fsN0yAv33Ykh^8Ndlc5-1ae@h&cLa z=i}W=qtVsNSHjWa>dMlEg^O$J%k$^X_j|+cV0Nxm&uTM`ywh$rw*DvJHp<&#sc27Z z`M%SqV@GHGJv1 z^PN8Zeo}=upIhzyKOOG1$IC;h%E$0Kkl7c=7dyKF-?%6BP0m{qbi-+%=Qop;Pvvk6 zdDxdfTgI1H6Lap{@EvTH50ox{P@>T1RRot!a=14r6c_VkIlT~f=g!RznypT6&>pr1 z&6#?m-yQbagU-Tywz#yqva!BqO2HS-&Fumcjm!if+zSPFU&H@GV4$fa2&Dxpk-Ge{16zxC_O z@#oJDfByF0*Y1N;6YKvn{Qzy=ALFgBKYjAu{=4VX0+y*Uu?t=}g5O+XHYtDCJD09+ hU-|OZ&6{^ebJyOpE<5b{wzsZr?@qDZXM4dt^&ft?mOcOg delta 1414 zcmZWo&5ImG6o2*AUDe&wU(-7?J73#7nVm^C$?nb?%|?*vG-DuF%^wgFLISyjA+k3o z0r3!#Kw5<0Ek{ow5dwm;9^%21UcGx!)D`~$Ur$$!iT;YI_fhZt-h0(G&qmL-p8m)d zF-xf3i%4L#{90IVH#?4MbW^#u$*3)&x(qE6b0w7J)m&S0=1?ve;fzp9n9YghGCy34 z+O%f5{hsZ3L8Dubn=LK{QR|(AGf5~2&ID!DA_OR*j8RSnL7D|2)b}WI5f3O z5FCLHq7g0gjkT0`2Bor0;~*Wvl!g3`RE!hPay?EckrG=LmWw_{q@!>U!f=2Er>++W z&-Epzgu8)PDwyYoQS1hsN~fl%8wH^kE7W~#9O-azn?{ZsW4Ko%A`BF!mjhG_yLv@q z0^(Z) z(=l(J&25|&#peU07f|gq&cJj3&7P0o1>@R!zt>Bf?M`cRqtWj4d#&|kt={c5np=Z# zINCma=Ijm!e25bOAov3TtQ7b#l;hz45*OIAbgd8o`2KDg&Ta98?s5mXwXj#`sO)5~ zS^(x!O!xZQ?_J9N@YKUAzyGWs4P=*}KmF>{zrWLVsLy|xR&ifXKY7RYzI^a