From 8f3e99b03e46fc1207bf800bc5fc27374d405388 Mon Sep 17 00:00:00 2001 From: ramox81 <184937705+ramox81@users.noreply.github.com> Date: Tue, 6 Oct 2026 16:34:00 +0300 Subject: [PATCH] Recompute table formulas after an edit Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/entities/field.rs | 10 ++++++++++ src/scene/mod.rs | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 157c7c2e5..8ea53e8cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4206,7 +4206,7 @@ dependencies = [ [[package]] name = "opencadcodec" version = "0.5.5" -source = "git+https://github.com/ramox81/cadcodec.git?rev=87de138#87de1388d5884cb712c24ad407159e45b08df84a" +source = "git+https://github.com/ramox81/cadcodec.git?rev=53847a7#53847a77e8d50413998cbca152436da50dcfde6f" dependencies = [ "ahash 0.8.12", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index a36c7242f..24413fb71 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -95,7 +95,7 @@ iced_core = { git = "https://github.com/iced-rs/iced.git", rev = "23604ff22ab0aa iced_widget = { git = "https://github.com/iced-rs/iced.git", rev = "23604ff22ab0aad9e00b9327cb7b8546ed84db39" } [patch."https://github.com/HakanSeven12/opencadcodec.git"] -opencadcodec = { git = "https://github.com/ramox81/cadcodec.git", rev = "87de138" } +opencadcodec = { git = "https://github.com/ramox81/cadcodec.git", rev = "53847a7" } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] getrandom = "0.3" diff --git a/src/entities/field.rs b/src/entities/field.rs index d8d6d5bf1..6c5deb299 100644 --- a/src/entities/field.rs +++ b/src/entities/field.rs @@ -110,6 +110,16 @@ pub fn update_fields( document.update_fields(&OcsFieldContext(Some(&snapshot)), event, hosts) } +/// Recompute a table's cell formulas into its block after the table changed; +/// returns the cell texts that changed. +pub fn refresh_table_formulas(document: &mut CadDocument, table: Handle) -> Vec { + if document.fields.is_empty() { + return Vec::new(); + } + let snapshot = document.clone(); + document.refresh_table_formulas(&OcsFieldContext(Some(&snapshot)), table) +} + /// The text a table cell shows for its field: a formula is evaluated live /// (it reads other cells), any other field shows its stored value. pub fn cell_text(document: &CadDocument, field: Handle, table: Handle) -> Option { diff --git a/src/scene/mod.rs b/src/scene/mod.rs index ee686acc3..faa9d962a 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -3632,6 +3632,7 @@ impl Scene { && matches!(self.document.get_entity(*handle), Some(EntityType::Table(t)) if t.block_record_handle.is_none()) { rebuilt_table_block |= self.document.refresh_table_block(*handle); + rebuilt_table_block |= !crate::entities::field::refresh_table_formulas(&mut self.document, *handle).is_empty(); } } if rebuilt_table_block {