Commit Graph
2215 Commits
Author SHA1 Message Date
Dylan M. Taylor 68e929b1d9 Refactor formula for strict Clippy checks 2026-10-28 10:52:53 +00:00
Dylan M. Taylor fb98f5952b Refactor core for strict Clippy checks 2026-10-28 10:52:53 +00:00
Dylan M. Taylor ad272ca071 Enforce workspace Clippy standards and document lint policy 2026-10-28 10:52:53 +00:00
AnhNgoo f9b869b3a4 fix(grid): prevent partial wrapped text lines in fixed-height rows 2026-10-28 17:03:09 +07:00
AnhNgoo dd48d09605 test(ui): cover runtime tooltips and current region shortcut 2026-10-28 10:31:19 +07:00
AnhNgoo a81cb0f21e test(engine): cover default workbook author and preservation 2026-10-28 10:22:31 +07:00
AnhNgoo 712f45965b fix(ui): share verified shortcuts between palette and ribbon 2026-10-28 10:07:56 +07:00
Harrison Booth f6015a7e6e Pin COPILOT as written without an _xlfn. prefix 2026-10-27 21:21:04 -05:00
Harrison Booth 87342cb308 HYPERLINK tests: use the Arg helpers 2026-10-27 21:08:35 -05:00
Harrison Booth 0f78a6b126 HYPERLINK without a friendly name returns the link as text
Excel: HYPERLINK(1) is the text "1" (ISTEXT is TRUE); with a friendly
name the result keeps that value's type.
2026-10-27 21:08:23 -05:00
Harrison Booth 28a8e67e7a functions: add ECMA.CEILING (CEILING under a second name) 2026-10-27 20:57:33 -05:00
Harrison Booth 25816f0009 xlsx: write _xlfn. for STOCKHISTORY, TRANSLATE, DETECTLANGUAGE; none for NETWORKDAYS.INTL, WORKDAY.INTL 2026-10-27 20:57:17 -05:00
AnhNgoo bf4a3969e8 fix(ui): show verified selection shortcuts in command palette 2026-10-28 08:56:28 +07:00
AnhNgoo f77d70502a fix(ui): verify command shortcuts for runtime OS 2026-10-28 08:39:37 +07:00
AnhNgoo 6e7fb6ce0b fix(ui): correct Paste Special shortcut in command palette 2026-10-28 08:13:33 +07:00
Dmussi 8b35f2ac12 Format status bar label and translate its tooltip 2026-10-27 19:20:18 -04:00
RomanLis91andClaude Opus 5.5 a8e03ef40f fix(keyboard): Ctrl with the numpad's + inserts rows, columns or cells, as in Excel
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QJaF5jevKidVoJcnTyBFub
2026-10-27 23:40:35 +02:00
Harrison Booth 66f8b05fc2 Merge upstream main into gc-fix-functions
# Conflicts:
#	crates/functions/src/math.rs
#	crates/functions/src/stat.rs
2026-10-27 16:17:07 -05:00
Harrison Booth 0e643e9026 Merge remote-tracking branch 'upstream/main' into gc-xls-cell-styles 2026-10-27 15:59:33 -05:00
aiongg 89ac453efa Merge pull request #2605 from dotCooCoo/feat/format-chart-pane-stacked-types
Format Chart Area: Chart Type offers the stacked and 100% stacked types and marks the current one
2026-10-27 13:46:40 -04:00
aiongg c596bad63b Merge pull request #2749 from Silvertree2010/perf/export-speed
Speed up XLSX save by writing worksheet XML without per-cell allocations
2026-10-27 13:41:32 -04:00
NetterSilverandClaude Opus 5.5 393a524aa3 Speed up XLSX worksheet writing
Saving a large workbook spent about half its time building worksheet XML,
mostly in small per-cell allocations. The writer now appends to the part
directly:

- Cell references, row numbers, style ids, shared string indexes and
  numbers are appended without temporary strings (push_a1, push_u64,
  push_num), and text is escaped in place (push_esc, with a fast path for
  plain ASCII).
- sheetData walks the cell store in its own row-major order instead of
  copying every address into a BTreeSet and a per-row BTreeMap and looking
  each cell up again. Cells outside the store (pictures, spill values,
  table headers) still go through the sorted set.
- Formulas with nothing the file spells differently (no LET/LAMBDA, no
  _xlfn function, no spill, @, trim operator or structured reference) are
  printed from the shared expression instead of being cloned and rebuilt
  twice by the file rewrite.
- The A1 printer in gridcraft-formula appends references to the output
  instead of formatting each anchor into its own string.

The output is byte-for-byte unchanged.

write_perf, 200,000 rows (2.0M cells, 14.2 MB package), release, Ryzen
16 threads / Linux, 36 interleaved runs each:
  before: median 2083.9 ms, min 1615.7 ms
  after:  median 1501.3 ms, min 1192.3 ms  (-28.0 % median, -26.2 % min)

What remains is mostly deflate (zlib-rs, level 6), about 70 % of the save.

Tests pin the exact sheetData of a workbook covering row settings between
cell rows, spill values, every value kind, number spellings, escaping and
formulas with and without a file spelling (generated with the previous
writer), and check each appending helper and the formula fast path against
the code they replace.

The formula fast path is guarded by a test that runs both paths over every
function in the gridcraft-functions registry (a new dev-dependency, allowed
by the layer rules), in 15 surrounding shapes covering every operator and
rewrite, so a function or rewrite added later without updating the trigger
list fails it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:46:25 +01:00
aiongg 6303865054 fix(ui): dropdown menus grow back after a search with no matches (#2743)
* fix(ui-egui): dropdown menus regrow while open

Use craft_ui's ComboBox and combo::Menu so a menu that shrank (a filter with
no matches) grows back when the filter is cleared (egui#5225). Repin
craft-libs to one revision.

* chore(deps): craft-libs 60d60d48 (dropdown fixes)

* chore(deps): craft-libs 6af63481 (dropdown fixes)

* chore(deps): craft-libs 4d7b82f7 (dropdown fixes)

* chore(deps): craft-libs 92d392cf (#387 merged)
2026-10-27 10:26:30 -04:00
NetterSilverandClaude Opus 5.5 4425fed53f Add an XLSX write benchmark example
`cargo run --release -p gridcraft-xlsx --example write_perf -- [rows] [runs] [out.xlsx]`
builds a sales-style workbook (order ids, dates, categories, numbers, two
formula columns with cached values, booleans, sparse notes, a summary sheet)
and times write_xlsx, printing each run and the median / minimum. An optional
output path keeps the last package for byte comparisons between builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:12:20 +01:00
AnhNgoo d3832e98e6 fix(ui): show shortcuts in command palette (#2725) 2026-10-27 16:56:49 +07:00
AnhNgoo fa6ccc6ae5 fix(engine): set default workbook author (#2448) 2026-10-27 16:10:46 +07:00
Higgs32584andClaude Opus 5.5 7d828c01f7 Security: cap the work of lifted lookups, needles x lookup vector, with #NUM! (#2716)
A lookup lifted over an array of needles searched its whole lookup vector once per needle
with no total cap, so =ROWS(XMATCH(SEQUENCE(1048576),-SEQUENCE(1048576))) in a 1.6 KB file
ran for hours and hung file.open. VLOOKUP, HLOOKUP, LOOKUP, MATCH, XLOOKUP and XMATCH now
return #NUM! past 5e8 needle x entry steps, the pattern MMULT uses. Other lifted functions
are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 00:40:18 -04:00
Higgs32584andClaude Opus 5.5 ea5292c94a fix(engine): gate the temp-name symlink test to unix
`save_fails_upfront_when_the_temp_name_is_taken` calls
`std::os::unix::fs::symlink` but was only gated on non-wasm, so the
engine crate's lib tests did not compile on Windows. Gate it `cfg(unix)`
like the neighbouring permissions test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 23:09:30 -04:00
Harrison Booth 0edf2b850a Fix the spill test: clone the workbook out of its Arc (#2053) 2026-10-26 17:34:04 -05:00
Harrison Booth 2b6e088a6d Engine test: copying a sheet that holds a spill matches a full recalc (#2053) 2026-10-26 17:29:12 -05:00
aiongg 5f041665b5 refactor(ui-egui): move SheetApp methods to app/ 2026-10-26 21:16:41 +00:00
aiongg e0211fbb4f refactor(ui-egui): move SheetApp methods and UI types out of lib.rs 2026-10-26 21:16:41 +00:00
aiongg 6b743e4622 refactor(ui-egui): move backstage.rs items to backstage/ 2026-10-26 21:16:41 +00:00
aiongg 41ab30678c refactor(ui-egui): move control.rs items to control/ 2026-10-26 21:16:41 +00:00
aiongg d840d55c4b refactor(ui-egui): move theme.rs items to theme/ 2026-10-26 21:16:41 +00:00
aiongg b36ec74f13 refactor(ui-egui): move ribbon.rs items to ribbon/ 2026-10-26 21:16:41 +00:00
aiongg bbb570dc32 refactor(model): move features.rs items to features/ 2026-10-26 20:43:39 +00:00
aiongg 7f1ccf2e81 refactor(xlsx): move sheet_read.rs items to sheet_read/ 2026-10-26 20:43:39 +00:00
aiongg af54396e64 refactor(xlsx): move sheet_write.rs items to sheet_write/ 2026-10-26 20:43:39 +00:00
aiongg d1c8de48e7 refactor(xlsx): move passthrough.rs items to passthrough/ 2026-10-26 20:43:39 +00:00
aiongg e8f3b6f0cf refactor(xlsx): move pivot.rs items to pivot/ 2026-10-26 20:43:39 +00:00
aiongg 1db55e4e5f refactor(functions): move math.rs items to math/ 2026-10-26 20:43:39 +00:00
aiongg be18ee0519 refactor(functions): move engineering.rs items to engineering/ 2026-10-26 20:43:39 +00:00
aiongg 17b29b891d refactor(functions): move financial.rs items to financial/ 2026-10-26 20:43:39 +00:00
aiongg 1ff44e5ba2 refactor(functions): move stat.rs items to stat/ 2026-10-26 20:43:39 +00:00
aiongg 8b3a6e0362 refactor(engine): move pivot.rs items to pivot/ 2026-10-26 20:43:39 +00:00
aiongg 4b3fd23458 refactor(engine): move cmd/whatif.rs items to cmd/whatif/ 2026-10-26 20:43:39 +00:00
aiongg 506bc8a0f2 refactor(engine): move cmd/sheet.rs items to cmd/sheet/ 2026-10-26 20:43:39 +00:00
aiongg 1a1726bb9d refactor(engine): move cmd/format.rs items to cmd/format/ 2026-10-26 20:43:39 +00:00
aiongg bbff147bf1 refactor(engine): move cmd/extra.rs items to cmd/extra/ 2026-10-26 20:43:39 +00:00