Commit Graph
4827 Commits
Author SHA1 Message Date
moppeeer 0943f30239 Merge remote-tracking branch 'origin/main' into package-dialog
# Conflicts:
#	crates/ui-egui/src/menus.rs
2026-10-24 11:30:10 +02:00
moppeeer 527c0d350b Merge remote-tracking branch 'origin/main' into character-style-from-selection
# Conflicts:
#	ROADMAP.md
#	crates/engine/src/tests.rs
#	crates/ui-egui/src/dialogs.rs
2026-10-24 11:29:16 +02:00
moppeeer a627bfe47c Merge remote-tracking branch 'origin/main' into find-change-format
# Conflicts:
#	crates/engine/src/cmd/find.rs
2026-10-24 11:22:22 +02:00
moppeeer 21ddc03da0 Merge remote-tracking branch 'origin/main' into paragraph-style-general
# Conflicts:
#	ROADMAP.md
#	crates/engine/src/tests.rs
2026-10-24 11:21:33 +02:00
moppeeer 80b449d81f Merge remote-tracking branch 'origin/main' into snap-page-centre
# Conflicts:
#	crates/tools/src/snap.rs
2026-10-24 11:21:24 +02:00
moppeeer 4b3b6d0cf0 Merge remote-tracking branch 'origin/main' into centimeters-four-decimals
# Conflicts:
#	crates/geom/src/units.rs
2026-10-24 11:21:21 +02:00
moppeeer 3cf44071fc Merge remote-tracking branch 'origin/main' into swatch-row-icons
# Conflicts:
#	docs/target-app-parity.md
2026-10-24 11:20:03 +02:00
moppeeer f677f1cd69 Merge remote-tracking branch 'origin/main' into text-frame-options-layout
# Conflicts:
#	docs/target-app-parity.md
2026-10-24 11:19:59 +02:00
moppeeer 589d3d7c1a Merge remote-tracking branch 'origin/main' into codex/direct-select-unselected-anchor
# Conflicts:
#	crates/engine/src/tests.rs
2026-10-24 11:18:56 +02:00
moppeeerandClaude Opus 5.5 ed63b8f4ab Convert dialogs stay open when the conversion fails
An emptied separator field reached table.convertFromText / convertToText,
which refuse it; the dialog closed and lost what was typed. On an error the
message goes to the status bar and the dialog comes back, as the other
dialogs do (Insert Table included, from #1676). Found by CodeRabbit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 11:17:28 +02:00
moppeeer d712386a32 Merge branch 'table-menu-insert' into table-convert-dialogs 2026-10-24 11:13:15 +02:00
moppeeer d2f6f7c338 Merge remote-tracking branch 'origin/main' into table-convert-dialogs 2026-10-24 11:13:15 +02:00
moppeeerandClaude Opus 5.5 394f4152fa Insert Table: the dialog stays open when the table can't be made
As the other dialogs do (Cell Options, Text Frame Options): on an error the
message goes to the status bar and the dialog comes back with what was typed.
Found by CodeRabbit on #1679.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 11:13:04 +02:00
NetterSilverandClaude Haiku 5.5 f0ce96138c Saturate footnote and endnote numbering at u32::MAX
Found while testing crates/compose/src/notes.rs:133 (also crates/doc/src/notes.rs:265 footnote_start and crates/doc/src/endnotes.rs:150 endnote_start)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 09:07:37 +00:00
moppeeer e4cb6cffc7 Merge remote-tracking branch 'origin/main' into table-menu-insert 2026-10-24 11:06:43 +02:00
moppeeerandClaude Opus 5.5 5c3d25a092 Tables: typing with one cell selected replaces its text
A cell selected with Esc (or a drag inside it) kept the caret at the start of
its text, so typing went in front. With one cell (or one merged cell)
selected, text.insert now selects the cell's whole text first, as InDesign
replaces the contents. Found by CodeRabbit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 11:06:27 +02:00
PiMinusMaxandClaude Opus 5.5 c11006c832 Effects dialog: the Angle with Use Global Light sets the global light
The Angle field was greyed out with Use Global Light on. It now shows
the document's global light angle and changes it for every effect that
uses it, applied with the effects in one undo step.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:55:13 +02:00
dotCooCoo 333cdf116f Package: the Windows redirect test falls back to a directory junction
package_refuses_windows_directory_redirects made its redirect with
symlink_dir. Without Developer Mode or elevation that call fails with
os error 1314 (ERROR_PRIVILEGE_NOT_HELD), which std does not report as
PermissionDenied, so the skip arm did not match and the test panicked.

When symlink_dir fails, the test now makes a directory junction with
mklink /J, which needs no privilege. is_redirect treats a junction as
a redirect, so the test still checks that File > Package refuses the
redirected folder. It skips only when neither can be made. The package
code is unchanged.
2026-10-24 01:53:04 -07:00
Dylan M. TaylorandClaude Sonnet 5.5 04f0c55afb refactor(idml): extract graphics and table cell import helpers (Sonar S3776)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:52:41 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 140681429f refactor: split complex functions in epub table and pdf frame text (Sonar S3776)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:52:37 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 71d9386138 refactor(idml): split graphic part and spread import helpers (Sonar S107, S3776)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:52:11 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 c313c53497 refactor: split complex functions in ruby, warichu, pdf text, render text, epub, pdfx (Sonar S3776) (#1728)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:51:58 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 4c5ea73d98 refactor(tools): fewer parameters and simpler pointer handling (Sonar S107, S3776) (#1725)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:51:35 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 75d5b015d3 refactor(idml): extract helpers to cut cognitive complexity (Sonar S3776) (#1723)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:51:31 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 cb763c2583 refactor: split complex functions in psd, table, parabox, index, trace, pdf export, render (Sonar S3776) (#1724)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:51:26 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 88dd71cc51 refactor(engine): split find change and used fonts (Sonar S3776)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:50:41 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 8271f1a26b refactor(engine): split execute_unguarded, load_styles and resize_border (Sonar S3776) (#1726)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:50:14 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 30fbbb8c04 fix(engine): stop range selection after the last record number
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:50:03 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 c142678bd5 refactor(ui-egui): extract character style General section (Sonar S3776) (#1720)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:49:00 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 e0c244d2ed refactor(ui-egui): extract style option field helpers (Sonar S3776) (#1719)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:48:56 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 9897e6e22e fix: complete explicit imports in test modules
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:48:09 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 e651c637f4 refactor(ui): extract helpers from conditions, book, credits and page control panels (Sonar S3776) (#1721)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:45:48 -04:00
macadminHU 4ed5c7d9e6 Merge branch 'main' into codex/hungarian-localization 2026-10-24 10:44:09 +02:00
Dylan M. TaylorandClaude Sonnet 5.5 6e28627ab5 fix: import MetadataProvider in tests_vertical
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:39:14 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 681493f458 refactor(engine): split data merge fill and record selection (Sonar S3776, S107)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:34:17 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 9770002c5c chore: method paths for remaining trivial closures (Sonar S1612)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:32:21 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 8dc6717ff2 chore: replace glob imports in test modules with explicit names (Sonar S2208)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:32:10 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 8299d26400 chore: replace trivial closures with method paths (Sonar S1612) (#1714)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:30:43 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 bfd95b258b chore: drop redundant 'static lifetimes in statics and consts (Sonar S8863) (#1713)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:30:39 -04:00
Daniel c2b2d260a5 Merge upstream main and preserve Linux GNOME decorations
Integrate updated DesignCraft notices, dependencies and package scripts while keeping Adwaita's MIT notice.
2026-10-24 10:25:28 +02:00
dotCooCoo f5e1bda7cc Preflight: the missing-link test uses a path that is absolute on Windows too
a_missing_link_shown_by_its_preview_is_still_reported stored the link
/definitely/missing dir/photo.jpg in a document without a path. On
Windows that path names no drive, so document_path refuses it as not
absolute and the preflight message ends with "(the path is not
valid)", and the test failed. The test now stores a link under
std::env::temp_dir(), an absolute path with the default
temporary-folder settings on Windows, macOS and Linux, and expects the
message for that path. The preflight code is unchanged.
2026-10-24 01:21:55 -07:00
KnottyDyesandClaude Opus 5.5 4c580086a0 PDF: a null OCProperties is no optional content; an unreadable Prev is damage
A placed file whose catalog has /OCProperties null (literal or through a
reference) exported on main but failed after the layer-choice change; treat it
as absent. Like the trailer guard in #1670, a non-null /Prev that can't be read
as an offset ends nothing and is reported as a damaged cross-reference table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:54:58 -06:00
KnottyDyesandClaude Opus 5.5 ea69836146 PDF: carry an explicit layer choice and read trailers structurally
Export takes the placed PDF's layer choice as file defaults or an explicit
hidden list, where an explicit empty list shows every layer, including one
the file hides by default. Today an empty list still means file defaults;
an explicit all-on state can map straight onto Some(&[]).

The incremental writer now reads each cross-reference section's trailer by
walking the table rather than searching for the keyword, follows the bounded
Prev chain for inherited encryption, and treats a literal null /Encrypt as
absent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:54:58 -06:00
KnottyDyesandClaude Opus 5.5 a84faee829 PDF: a hidden layer missing from the placed file aborts vector export
Main now aborts an export when a stored hidden layer can no longer be
applied (#876). Vector export follows it: a layer hidden in Object Layer
Options that the placed PDF doesn't have, because the file has no layers
or was relinked, fails with an error naming the file instead of exporting
everything visible. The image-path tests for oversized images and
undecodable content export as PDF/A-2b, which still rasterizes placed
PDFs with hidden layers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:54:58 -06:00
KnottyDyes 38d692089f PDF: preserve placed optional-content visibility in vector exports
Keep source defaults and per-frame hidden layers in plain and PDF/X-4 vector exports, including independent repeated placements, booklet output and book merging. Accept usage-application arrays and resource-only groups without a catalog configuration.

Use file-named warnings and all-ON defaults for recoverable default-configuration problems and unsupported base states. Add readable groups omitted from OCGs without discarding their visibility, combine concurrent recovery warnings, and generate missing names only when no frame override needs name matching. Retain errors for contradictory states, unresolved references and ambiguous name overrides.

Cache prepared variants per asset and hidden-name set while replaying recovery warnings through the existing deduplicating channel. Keep original source bytes when every group is visible and named, so reader-repaired cross-reference tables remain usable without an incremental layer update. When hidden groups or generated names require writing, reject an unusable cross-reference table with a file-named damage error and retain the first placement failure.

Cover visibility, recovery, names, independent placements, repaired cross-reference tables and vector output with 46 optional-content integration tests, plus preparation-cache and shared-buffer unit tests.
2026-10-24 01:54:58 -06:00
Dylan M. TaylorandDylan Taylor f90d286721 chore: resolve SonarCloud maintainability issues (#1698)
* chore: resolve SonarCloud maintainability issues

- Replace lambda closures with method references (S1612)
- Replace wildcard imports with explicit imports (S2208)
- Refactor complex functions with extracted helpers (S3776)
- Replace OR pattern with range pattern in math parser (S9047)

* style: apply rustfmt to warichu helper

* fix(compose): revert slice conversion in tests and remove unused var in warichu

* Group warichu row layout scalars to satisfy S107 parameter limit

* style: satisfy rustfmt in warichu.rs

---------

Co-authored-by: Dylan Taylor <dylan@craftmaker.dev>
2026-10-24 03:54:24 -04:00
aiongg 0143633930 Batch: the compose cache keeps both halves of each number's bits on 32-bit targets 2026-10-24 07:26:09 +00:00
dotCooCoo a525894355 File Info: PDF export writes the document's title, author, description and keywords
File › File Info… opens a dialog with Document Title, Author,
Description, Keywords, Copyright Notice and Copyright Info URL, and the
document saves them. The new file.info command reads them with {} and
sets the fields it is given; "" or null clears a field, and keywords
are a list or one line split at semicolons and commas. file.info.get
returns the fields without editing the document, so opening the dialog
does not end a Data Merge preview.

Export PDF, PDF/X-4 and Print Booklet write the title, author,
description and keywords into the PDF's document information and XMP.
EPUB export takes the title and author from File Info, and HTML export
takes the title. A title or author given to the export replaces File
Info's, and an empty Document Title leaves the document's name as the
title. Export PDF's dialog no longer sends the document's name as the
PDF title, so the PDF takes its title from File Info; the file name
still comes from the document's name.
2026-10-24 00:20:21 -07:00
aiongg 5905cd3d9a Batch: the compose cache keys on the page geometry under a frame; one copy of each progress-log line 2026-10-24 07:09:46 +00:00
skylar taylor-barrick 5449bc4757 M6: preserve PDF catalogs and safely apply layer choices (#1670)
Preserve existing PDF catalog entries and full object generations. Accept literal null trailer entries while failing closed on encrypted/hybrid/ambiguous or unreadable history. Validate visibility variants atomically before document edits, suppress stale unsupported canvas overrides, and preserve conservative content cropping without overcropping empty optional-content stubs.

Local full CI: all 9 gates passed, 3063 tests passed and 6 skipped, all 16 WASM-safe crates checked. Independent qpdf/preservation/Poppler checks passed for17 supported inputs;6 refusal cases stayed refused. All11 additional Prev controls passed. GitHub CI and CodeRabbit passed on00d5fa5c; CodeRabbit confirmed the Prev finding addressed. Author history preserved; no native format changes.
2026-10-24 00:51:57 -06:00