Commit Graph
8629 Commits
Author SHA1 Message Date
BFlat efae291664 Merge pull request #5837 from mockydevs/fix/move-cursor-5246
Dialogs: the header that moves a dialog keeps the arrow cursor until dragged (#5246)
2026-11-06 01:44:53 +07:00
BFlat a58fdad3d5 Merge pull request #5836 from dotCooCoo/docs/links-hash-limit-gib
Links: the hashing limit reads 1 GiB in the docs
2026-11-06 01:44:38 +07:00
Don Omondi a57328be2f Dialogs: the header that moves a dialog keeps the arrow cursor until dragged (#5246)
Hovering the band that moves a modal dialog (New Document's top edge and
tab row, other dialogs' headings) set the grab cursor, which Windows
shows as the four-way move arrows. It now keeps the arrow, as a title
bar does, and shows the grabbing cursor only while the dialog is being
dragged. Dragging still moves the dialog.
2026-11-06 01:32:42 +07:00
dotCooCoo c4d40de212 Links: the hashing limit is 1 GiB in params text and MCP docs
links.findFiles hashes files up to MAX_HASHED (1 << 30 bytes) and compares larger ones by size only. The params text, the module doc comment and docs/mcp.md said 1 GB; they now say 1 GiB.
2026-11-06 01:32:42 +07:00
BFlat 9a46fba8f6 Merge pull request #5834 from mockydevs/fix/snap-to-glyph-options-5273
Type: Show Snap to Glyph Options scrolls the Character panel to the options (#5273)
2026-11-06 01:32:16 +07:00
BFlat 440e15959c Merge pull request #5833 from dotCooCoo/fix/ai-distort-paths
.ai import: objects other than type keep some Distort & Transform effects live
2026-11-06 01:32:00 +07:00
Don Omondi 496237242d Type: Show Snap to Glyph Options scrolls the Character panel to the options (#5273)
The Snap to Glyph section is drawn after every character attribute, so
in a short panel it appeared out of sight and the menu item seemed to do
nothing; its checkboxes were also dimmed with no way to turn Snap to
Glyph on from there. Choosing Show Snap to Glyph Options now scrolls the
panel to the section, which starts with a Snap to Glyph checkbox
(View > Snap to Glyph) that undims the guide options.
2026-11-06 01:20:04 +07:00
dotCooCoo ddb64fceb6 .ai import: objects other than type keep some Distort & Transform effects live
An art style with a Distort & Transform effect opened every object but
type as its drawn look. Objects other than type now open as themselves
with these effects live:

- Any object takes a Tweak that moves nothing and Pucker & Bloat at 0,
  beside the effects it already took.
- A path, compound path or group takes Transform without copies, or a
  Free Distort whose corners make a parallelogram, when it is the only
  effect. Neither the style nor anything in the object may paint with a
  gradient or pattern. Everything in the object must be a path, compound
  path or group without a clip, an opacity mask or effects of its own.
  When Transform scales, rotates or reflects, nothing in the object may
  be stroked.
- An unstroked path or compound path whose segments are all straight
  takes Twist when it is the only effect.

Other objects keep the drawn look, as do Zig Zag, Pucker & Bloat of
another amount, a Free Distort with other corners and Transform copies.

Docs: docs/file-format-parity.md, docs/target-app-parity.md.
2026-11-06 01:20:04 +07:00
BFlat c07f0087ce Merge pull request #5832 from storytold/perf/1280-hover-memo-check
Selection: a hover checks the bounds memo once, not once per object
2026-11-06 01:19:39 +07:00
FredAppsandClaude Opus 5.5 64f7b49dea Selection: a hover checks the bounds memo once, not once per object
Hovering looks up the bounds of every selected object, and each lookup
went through the memo key check, which compares the whole selection. That
made a hover quadratic in the selection: 1.5 s at 50,000 selected paths.

The walk now checks the key once and shares it across its lookups.

Part of #1280.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 01:07:34 +07:00
BFlat a15d213eb6 Merge pull request #5831 from dotCooCoo/feat/ai-style-libraries
.ai import: graphic style libraries open with their styles
2026-11-06 01:07:19 +07:00
BFlat 652e6a446b Merge pull request #5830 from dotCooCoo/docs/links-parent-folder-steps
Links: params text and MCP docs say parent folders are resolved
2026-11-06 01:07:01 +07:00
dotCooCoo 7d004de195 .ai import: graphic style libraries open with their styles
A .ai or EPS graphic style library holds graphic styles and their list
in its editing data but no layers, so it came in as its PDF part or
page with the default styles, and Other Library listed those. A file
read as its PDF part or page, because it has no layers or its layers
can't be used, now gets the styles of its list, in list order, as a
file read from its layers does: File > Open shows them in the Graphic
Styles panel and Other Library lists them in a library panel.

Style stroke weights and effects are scaled by the Large Canvas factor
of an EPS, and for a .ai whose editing data is in the units of its
pages by the pages' UserUnit or the declared Large Canvas scale.

Part of #3349
2026-11-06 00:55:18 +07:00
dotCooCoo c63ce28e84 Links: params text and MCP docs say parent folders are resolved
links.findFiles' params text and docs/mcp.md now say that the saved path's
parent-folder steps (.., or the empty components of a classic Mac :: run)
are resolved and that . components in a slash path are skipped before
folder names are compared.
2026-11-06 00:55:18 +07:00
BFlat c18a6d1e6e Merge pull request #5829 from mockydevs/fix/spot-color-library-5812
Libraries: spot colours stay spot colours in every document (#5812)
2026-11-06 00:55:05 +07:00
BFlat f141ebe186 Merge pull request #5827 from mockydevs/fix/appearance-opacity-default-5742
Appearance: Delete Selected Item on an Opacity row sets it back to Default (#5742)
2026-11-06 00:54:49 +07:00
Don Omondi 22a4dd6285 Libraries: spot colours stay spot colours in every document (#5812)
A library colour kept only its values, so a spot colour came back as a
process colour once its document was closed or in a new one. The library
now keeps a spot colour's ink name and tint (in the .vclibrary file too);
library.use links the paint to the document's spot swatch of that name,
adding it when the document has none of that colour, in one undo step.
A spot swatch dropped on the Libraries panel brings its name and tint.
2026-11-06 00:42:10 +07:00
Don Omondi 8e9625158f Appearance: Delete Selected Item on an Opacity row sets it back to Default (#5742)
Selecting the object's Opacity row, or a fill's or stroke's, and clicking
Delete Selected Item (or pressing Delete/Backspace, or Remove Item in the
panel menu) now sets that opacity back to Default (100%, Normal) in one
undo step. The button used to be dimmed for these rows.
2026-11-06 00:42:05 +07:00
BFlat 5aad15a0f7 Merge pull request #5826 from dotCooCoo/fix/classic-mac-parent-folders
Links: Find Linked Files resolves parent folders in a saved path
2026-11-06 00:36:46 +07:00
dotCooCoo bed4154597 Links: Find Linked Files resolves parent folders in a saved path
A saved link path such as `Disk:Projects:Art::photo.png` (classic Mac OS)
or `/old/Projects/Art/../photo.png` names a file in `Projects`. Ranking
the files found compared `Art` first, so a file under a folder named
`Art` came before one under `Projects`. The `::` runs and `..` components
are now resolved before the folder names are compared.
2026-11-06 00:24:44 +07:00
BFlat feee0865de Merge pull request #5825 from dotCooCoo/perf/eyedropper-single-stroke
Skip path rebuild for single-stroke Eyedropper samples
2026-11-06 00:08:09 +07:00
dotCooCoo 02f495e647 perf: skip stroke path rebuild for single-stroke samples 2026-11-05 23:55:53 +07:00
BFlat 34627134fa Merge pull request #5824 from dotCooCoo/fix/ai-brush-art-v7-patterns
.ai import: version 7 pattern fills in brush art use their operands
2026-11-05 23:54:52 +07:00
BFlat e442cee522 Merge pull request #5823 from dotCooCoo/perf/library-gradient-once
Avoid measuring selected art twice for library paint
2026-11-05 23:54:35 +07:00
BFlat 59e5fc48ba Merge pull request #5822 from sadkotheguest/fix/5752-pencil-keep-selected
Pencil: a new stroke with Keep selected off leaves nothing selected (#5752)
2026-11-05 23:54:18 +07:00
dotCooCoo 95df6982ee .ai import: version 7 pattern fills in brush art use their operands
A brush's art is read by a reader of its own, which was given the
patterns defined before it but not the record of which of them use the
version 7 form. A fill in that art with such a pattern then ignored its
offset, scale, rotation, reflection and shear operands, and placed the
tiles by the matrix alone. The brush-art reader now receives that record
as well, so those operands place the tiles. A brush whose art has such a
fill without all nine operands is now not read, as other art the reader
can't read whole isn't; before, the brush was kept.
2026-11-05 23:42:07 +07:00
dotCooCoo 934e6cba53 perf: reuse selected paint bounds for library gradients 2026-11-05 23:42:01 +07:00
Alex 9e2e0e0f69 Pencil: a new stroke with Keep selected off leaves nothing selected (#5752)
Drawing a new Pencil or Paintbrush stroke kept the earlier selection: the engine's
`insert_look` selects the new path only when `keepSelected` is on, and with it off left the
selection as it was. Illustrator starts such a stroke by dropping the selection, and the new
stroke is not selected with Keep selected off, so the command now clears the selection after
inserting a new path.

What stays as before: with Keep selected on a stroke selects only the path it draws (the
earlier selection is replaced); a stroke that continues or redraws a selected path with Keep
selected off deselects that path and keeps the rest of the selection. The Blob Brush keeps its
own Keep selected and Merge only with selection options.

`path.freehand`'s documentation, the engine test
`pencil_with_keep_selected_off_leaves_nothing_selected` and the Tool Options test
`the_new_path_is_selected_only_with_keep_selected_on` cover the three cases. Docs: roadmap,
target-app-parity and ui-parity carry the change.
2026-11-05 23:42:01 +07:00
BFlat 5e5b5af8ae Merge pull request #5821 from dotCooCoo/chore/ai-clip-checklist
Docs: the .ai editing-data checklist lists how several clipping paths clip
2026-11-05 23:40:55 +07:00
BFlat 87b5ef7235 Merge pull request #5765 from odysseexp/feat_shape_tools
Add-on: 3D Box tool and context-sensitive customizable shape controls
2026-11-05 23:40:36 +07:00
BFlat 58c882ba60 Merge pull request #5819 from dotCooCoo/fix/app-test-temp-cleanup
Clean up temporary files in desktop tests
2026-11-05 23:40:15 +07:00
BFlat ceee46e4d4 Merge pull request #5818 from dotCooCoo/perf/svg-path-bounds
Skip unused path bounds during SVG export
2026-11-05 23:39:58 +07:00
BFlat e19c1c92a6 Merge pull request #5817 from dotCooCoo/fix/ai-mask-placeholder-uncolored
Images: a colorized image's missing-link placeholder shows in its own colors
2026-11-05 23:39:41 +07:00
BFlat a0103d272b Merge pull request #5815 from Locme/ai-6d-calligraphic-brushes
.ai import: 6D Art Pen brushes open live, and Windows reads pen tilt and rotation (#372)
2026-11-05 23:39:24 +07:00
dotCooCoo d1def50140 Docs: the .ai editing-data checklist lists how several clipping paths clip
The private editing data list in docs/file-format-parity.md now says
that several clipping paths in a clipping group, a layer or an opacity
mask's art clip to their intersection, that a compound path of clipping
paths stays one clip, and that clipping paths that would nest the art
past the document's 32 levels stop the editing data from being read, as
#5789 made the reader do.
2026-11-05 23:25:05 +07:00
Harley Hawk a77b9e37d3 Add customizable shape tools and 3D Box add-on
- Extend vectorcraft-geom::shapes with clean-room open/pie/chord/arc ellipse and rectangle builders, per-corner radii, polygon/star corner rounding and deterministic vertex randomization, logarithmic/Archimedean spiral divergence and inner radius, and perspective/isometric 3D box face builders.
- Isolate 3D Box and customizable shape parameters as a VectorCraft add-on under crates/*/src/**/addons/:
  - crates/tools/src/addons/box3d.rs (Box3dTool and CustomShape extras stored under Node::extras["vc-shape-tools"])
  - crates/engine/src/cmd/addons/shapes.rs (addon.shapes.rectangle, addon.shapes.ellipse, addon.shapes.polygon, addon.shapes.star, addon.shapes.spiral, addon.shapes.box3d, and addon.shapes.configure)
  - crates/ui-egui/src/addons/shapes.rs (Object > Plug-ins > 3D Box > 3D Box Tool and context-sensitive Control bar options)
- Keep crates/engine/src/cmd/create.rs, crates/tools/src/shape.rs, and crates/tools/src/draw2/family.rs byte-for-byte identical to main.
- Add translations for "3D Box" and "3D Box Tool" across all 26 .tsv catalogs in crates/ui-egui/src/i18n/.
2026-11-05 23:25:05 +07:00
dotCooCoo b8155698b5 Remove temporary test files after failures 2026-11-05 23:25:05 +07:00
dotCooCoo edf2b78bc0 docs: record SVG export bounds optimization 2026-11-05 23:25:05 +07:00
dotCooCoo 84904020e8 Images: a colorized image's missing-link placeholder shows in its own colors
A linked 1-bit image mask from a .ai file keeps its fill color as a
colorize paint, so the image takes the color once its file is relinked.
Until then the image shows the missing-link placeholder, and the canvas
and PDF export colorized that placeholder too: its light tile turned
nearly transparent and its red cross took the fill color.

ImageBlob::takes_colorize is false for a preview whose pixels are not
grayscale. While it is false, the canvas draws the image and PDF export
writes it as it is, printed separations separate it as an uncolorized
image, and transparency flattening (EPS, PDF 1.3 and PDF/X-1a export,
Flatten Transparency) does not count its paint as transparency. The
paint stays on the image, and a grayscale preview is still colorized.
SVG and EPS export already write only grayscale images colorized.
2026-11-05 23:25:05 +07:00
Locme a3ec061995 .ai import: 6D Art Pen brushes open live, and Windows reads pen tilt and rotation (#372)
Squashed from #5815 onto main.
2026-11-05 23:25:05 +07:00
dotCooCoo 57bf6de206 perf: skip unused SVG path bounds 2026-11-05 23:25:05 +07:00
BFlat f6e3a44e42 Merge pull request #5811 from dotCooCoo/fix/ai-legacy-tab-stops
.ai import: legacy type keeps its tab stops
2026-11-05 22:38:33 +07:00
dotCooCoo f092b0b7a7 .ai import: legacy type keeps its tab stops
A tab definition in type of the legacy format (`numDots numTabs Xb`, a
`leader decimal tabType tabPosition Xe` for each stop, then `XB`) was
skipped, so every paragraph opened with only the default stops every
36 pt. The stops it describes now become the paragraph's tab stops
(left, center, right or decimal, at their positions), and they last
into the next paragraphs and text objects like the other paragraph
attributes. A definition with no stops, or whose descriptions were all
skipped, leaves the default ones. A description with an unknown type or
a position outside 0 to 100000 pt is skipped, and so is one past the
first 1024 of a definition. A text object's `To` ends a definition that
an earlier object left open.

Docs: docs/file-format-parity.md.
2026-11-05 22:26:49 +07:00
BFlat 7fa35a9bff Merge pull request #5810 from dotCooCoo/fix/mcp-gesture-key-order
Preserve queued key order before MCP tool selection
2026-11-05 22:26:37 +07:00
BFlat 01761ca36f Merge pull request #5809 from dotCooCoo/fix/thumb-flyout-active
Fix thumbnail work for active collapsed flyout tab
2026-11-05 22:26:20 +07:00
dotCooCoo 804d7cee57 fix: preserve queued key order before tool selection 2026-11-05 22:17:33 +07:00
dotCooCoo 869d558d66 fix: follow active flyout tab for thumbnail work 2026-11-05 22:17:33 +07:00
BFlat 550186c582 Merge pull request #5808 from dotCooCoo/feat/ai-active-artboard-reader
.ai import: the file opens on its active artboard
2026-11-05 22:17:23 +07:00
dotCooCoo 456487b873 .ai import: the file opens on its active artboard
VectorCraft now reads `CropAreaActive`, an `/Int` in the dictionary of
the editing data that holds the `ArtboardArray`, as the index of the
active artboard in that array. The reader ignored it before, and every
file opened on its first artboard.

The opened document starts with that artboard active, so the view the
document opens at and the Artboards panel use it. The index counts
every entry of the array, so an artboard that is left out (one with no
area) does not shift it. When the entry is missing, is not an `/Int`,
or names an artboard that does not open, the first artboard is active,
as before. A file that comes in as its PDF part, with its pages placed
where its artboards are, opens on the page of the active artboard, also
when the reading stops before the artboards. The same reader serves the
editing data of EPS and PDF files.

The active artboard is kept on the opened document only; native files
do not save it.
2026-11-05 22:03:55 +07:00
BFlat d6ef516bff Merge pull request #5807 from dotCooCoo/fix/link-classic-mac-path
Links: a classic Mac OS path is named by its file name
2026-11-05 22:00:48 +07:00