Commit Graph
8453 Commits
Author SHA1 Message Date
jo-quast bddb834231 Part of #394: each run hyphenates in its own language; Default Language sets new type's
Squashed from #2818 onto main.
2026-11-05 12:17:33 +07:00
BFlat 1943c7272c Merge pull request #5749 from ruchirguitar/feat/5663-document-tab-reorder
Document tabs: drag a tab along the strip to reorder the open documents (#5663)
2026-11-05 12:14:27 +07:00
ruchirguitarandClaude Opus 5.5 e0645341a4 Document tabs: drag a tab along the strip to reorder the open documents (#5663)
A document tab dragged sideways along the tab strip moves its document to the
place an insertion line marks; the current document stays current. Dragged
above or below the strip, the tab still tears off into a floating window. The
views Window > New Window opened move with their document, and each document
keeps its own zoom, centre and artboard.

The move is the engine command `document.move {from?, to}`, so the control
channel, MCP and recordings reach it, and a replay moves the document before
the steps recorded after it. `sync_views` keeps the views with their documents
by uid when the documents change order.

Behaviour: https://helpx.adobe.com/illustrator/using/customizing-workspace.html

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 12:02:46 +07:00
BFlat f73701a0e7 Merge pull request #5748 from Silvertree2010/fix/5729-bug-pencil-tool-options-wrong-fi
Keep Pencil and Paintbrush Fidelity in screen pixels at any zoom
2026-11-05 12:02:27 +07:00
BFlat b087cc5625 Merge pull request #5747 from mockydevs/fix/rasterize-color-mode-dropdown-5660
Rasterize: Color Model is a dropdown of the document's model, Grayscale and Bitmap (#5660)
2026-11-05 12:02:12 +07:00
bflatastic f3a00b1383 Tests: the Pencil's Fidelity slider reads in px 2026-11-05 11:52:34 +07:00
NetterSilverandClaude Opus 5.5 1db874610f Keep Pencil and Paintbrush Fidelity in screen pixels at any zoom
Fixes #5729

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:52:34 +07:00
Don Omondi 44b828629d Rasterize: Color Model is a dropdown of the document's model, Grayscale and Bitmap (#5660) 2026-11-05 11:52:25 +07:00
BFlat ba1757d603 Merge pull request #5743 from dotCooCoo/fix/stroke-move-large-coordinates
Render: at very large coordinates an edited path is not taken for a moved one
2026-11-05 11:41:47 +07:00
dotCooCoo 815671b3a2 Render: at very large coordinates an edited path is not taken for a moved one
The check that reuses a moved path's stroke outline allowed each
coordinate to differ from the moved one by 4 x f64::EPSILON times the
sum of the compared coordinates and the largest coordinate of the first
point, about 2.7 pt near 1e15, so a 0.5 pt anchor or handle edit there
drew the outline made before the edit.

offset_between and anchors_moved now measure the offset on each axis at
the pair of points with the smallest coordinates on that axis, then
check every pair against that offset within 3 units in the last place
of the pair's own coordinates. A first anchor far from the origin no
longer sets the tolerance for points near it.

Tests: 0.5 pt anchor and handle edits at 1e9 and 1e15 (and 0.0005 pt
at 1e9); an edit near the origin of a path that starts at 1e16; a path
whose coordinates shrink with each point, moved by growing amounts.
2026-11-05 11:29:39 +07:00
BFlat 77559d5506 Merge pull request #5741 from dotCooCoo/feat/prefs-folders-choose
Preferences: Additional Plug-ins Folder gets Choose…, and OK checks typed folders
2026-11-05 11:29:21 +07:00
BFlat aa518ad796 Merge pull request #5738 from ruchirguitar/feat/5532-release-type-on-a-path
Fix #5532: Release Type on a Path splits type on a path into point type and its path
2026-11-05 11:29:04 +07:00
dotCooCoo 21680cb53a Docs: Additional Plug-ins Folder's Choose… cites the preferences help
The progress line for the folder preferences now cites the preferences
help for Plug-ins & Scratch Disks as the place where additional plug-ins
folders are set, and names the plug-ins Choose… button and the check of
a typed folder on OK as VectorCraft's own rules.
2026-11-05 11:17:09 +07:00
ruchirguitarandClaude Opus 5.5 528faa8e0a Fix #5532: Release Type on a Path splits type on a path into point type and its path
A Type Tools add-on command (Object › Plug-ins › Type Tools › Release Type on a
Path…, `addon.type.releasePath`): each selected type on a path becomes point
type with the same runs, character and paragraph attributes, on one straight
line whose baseline starts where its first character sat, and the plain path
it was set on, with its exact shape and transform, in its layer and stacking
place, with no fill or stroke. `mode` keeps both, the path only or the text
only; `keepOriginal` leaves the type on a path and adds the released objects
above it. Other objects are left alone, nothing to release makes no undo step,
the run is one undo step and the released objects are selected. The command
dialog previews it as Type on a Path Options does (#5360): Cancel leaves no
history, OK is one step. Tests, command_sweep cases, catalog rows in all 26
languages, docs/mcp.md and the parity docs (beyond Illustrator: scores
unchanged).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:17:09 +07:00
dotCooCoo 045030f444 Preferences: Additional Plug-ins Folder gets Choose…, and OK checks typed folders
Additional Plug-ins Folder (Plug-ins & Scratch Disks) gets the Choose…
button that Data Recovery's Folder has, on hosts with a folder picker.
A picked plug-ins folder must be a folder whose contents can be listed;
otherwise the status bar says why and the field keeps its value.

OK now gives a folder typed into either field the same check as a
picked one. When it fails, the dialog stays open, the status bar says
why and no preference is set. An empty field and the folder already
saved are not checked. Under automation roots, a folder outside them is
refused before it is looked at.

Additional Fonts Folder and Templates Folder stay typed only.
2026-11-05 11:17:09 +07:00
BFlat a2af871579 Merge pull request #5737 from mockydevs/feat/set-corners-angle-range-5545
Set Corners: round only the corners in an angle range (#5545)
2026-11-05 11:16:49 +07:00
BFlat 04afb8e81e Merge pull request #5736 from mockydevs/fix/gradient-delete-stop-5403
Gradient panel: Delete Stop sits beside the ramp, so a short panel no longer hides it (#5403)
2026-11-05 11:16:38 +07:00
Don Omondi 62c6d42dff Set Corners: round only the corners in an angle range (#5545)
Squashed from #5737 onto main.
2026-11-05 11:04:52 +07:00
Don Omondi 077ef54d70 Gradient panel: Delete Stop sits beside the ramp, so a short panel no longer hides it (#5403)
The Delete Stop button sat at the end of the Opacity/Location row, below
the selected stop's Color row. In the default docked panel height that
row is cut off as soon as a stop is selected, so the button looked
missing. It now sits at the right end of the ramp, level with it, and
shows whenever the ramp does (with options hidden too). It deletes the
selected stop, never below two, as before.

Adds a headless panel test for deleting a stop by dragging it off the
ramp and with the button beside it, one undo step each, and for a
two-stop gradient keeping both.
2026-11-05 11:04:41 +07:00
BFlat f79b648ac7 Merge pull request #5735 from dotCooCoo/fix/chrome-idle-frame-cost
Control bar and task bar: idle frames borrow the selected object instead of copying it
2026-11-05 11:04:09 +07:00
BFlat 8260dc158e Merge pull request #5734 from makzumi/fix/wayland-double-cursor
fix(ui): avoid duplicate cursor without Wayland theme
2026-11-05 11:03:52 +07:00
dotCooCoo 8a5ec6a25f Tests: the task bar follows an edit and Undo
The task bar drops Join once the selected open path is closed and offers it
again after Undo, and Shape Properties shows a rectangle's corner radius as
it is after object.setLiveShape and after Undo. The progress line names the
new test.
2026-11-05 10:54:45 +07:00
bflatastic ba3e4a9da2 Cursors: drop the system-pointer branch that no cursor theme can reach any more 2026-11-05 10:54:45 +07:00
dotCooCoo c236129702 Docs: name the task bar test in the Control bar and task bar line 2026-11-05 10:54:45 +07:00
Ammar Almakzumi 822e4669ce fix(ui): avoid duplicate cursor without Wayland theme 2026-11-05 10:54:45 +07:00
dotCooCoo dba2193234 Tests: the task bar follows the active document after a switch
A test selects an open path in one document and a rectangle in a new
one, then switches back and forth with set_active: the task bar offers
Join only for the open path and Shape Properties only for the rectangle.
2026-11-05 10:54:45 +07:00
dotCooCoo 3f12cfdbbf Control bar: idle frames read the selected object without copying it
The Control bar and the contextual task bar copied the first selected
object every frame (the task bar twice), which on a path of 200,000
anchors costs about 1.4 ms per copy. Both bars now borrow it; the task
bar copies it only when it is a basic shape, for Shape Properties.

With one selected open path of 200,000 anchors, an idle frame with both
bars shown takes 3.8 ms instead of 8.0 ms in a release build.
2026-11-05 10:54:45 +07:00
BFlat dfc0f28004 Merge pull request #5733 from mockydevs/feat/set-corners-odd-even-5546
Set Corners: round all, odd-numbered or even-numbered anchors (#5546)
2026-11-05 10:54:27 +07:00
bflatastic 95d5c738dc i18n: Set Corners dialog strings in every catalog 2026-11-05 10:42:37 +07:00
Don Omondi 7aa759d4de Set Corners: round all, odd-numbered or even-numbered anchors (#5546)
addon.pathtools.cornerSet takes `every` ("all", "odd" or "even"; default
"all"), which keeps, of the anchors already chosen (named, direct-selected
or all), only the odd- or even-numbered ones, counted along each path from
its first anchor as number 1. Anchors that take no corner still count, so
the pattern follows the path's anchor order on open and closed paths; when
nothing is left the command says so. Unknown values are refused.

Object › Plug-ins › Path Precision Tools › Set Corners… (also a button in
the Anchor Inspector's Corners section) opens a dialog with Radius, Corner
kind and Anchors (All / Odd-Numbered / Even-Numbered) that previews on the
canvas and commits as one undo step.
2026-11-05 10:42:37 +07:00
BFlat 76ef53045e Merge pull request #5732 from dotCooCoo/fix/render-stroke-outline-reused-on-move
Render: a moved path reuses its stroke outline
2026-11-05 10:40:33 +07:00
BFlat fd7606bacc Merge pull request #5731 from mockydevs/fix/artboards-multi-apply-5698
Artboards: Shift- and Ctrl/Cmd-click in the Artboards panel select several artboards with any tool, and Fill applies to all of them (#5698)
2026-11-05 10:40:17 +07:00
BFlat f30d7a6696 Merge pull request #5730 from dotCooCoo/fix/layers-thumbs-weigh-heavy-objects
Layers: heavy type, symbols, meshes and images get their first thumbnail off the UI thread on the desktop
2026-11-05 10:40:00 +07:00
BFlat cd01c2ce95 Merge pull request #5728 from mockydevs/fix/expand-transform-groups-5612
Effects: Expand Appearance makes each copy of a path's Transform effect an object of its own (#5612)
2026-11-05 10:39:44 +07:00
dotCooCoo 2bb6db5e8f Tests: movedstroke imports wrapped to the rustfmt width 2026-11-05 10:26:08 +07:00
dotCooCoo 1c0fcd707b Docs: stroke outline reuse timings measured against current main 2026-11-05 10:26:08 +07:00
dotCooCoo 413fe034f0 Render: a moved path's stroke is matched by its anchors, without a copy of its line
The outline cache kept a copy of each stroke's line to recognize a moved
path, and made that copy on every miss, so an anchor edit of a long path
paid for copying its whole line. The entry now records whether its outline
was made along a line of the object's own path. On a miss, the anchors of
the earlier object are compared with the new one's, stopping at the first
that differs, and the earlier line is made again from the object and its
stroke only when they match.

Strokes with arrowheads keep the reuse: the check uses the untrimmed path.
2026-11-05 10:26:08 +07:00
dotCooCoo e71daf48cc Tests: a sheared path or another stroke style outlines the stroke again
A shear, a wider stroke, another cap, another dash pattern and another
width profile each make one new outline and draw the pixels a new
renderer draws, for open and closed, short and long, plain, dashed,
profiled and gradient-filled paths.
2026-11-05 10:26:08 +07:00
dotCooCoo a4e74ed0f0 Render: stroke outline reuse leaves the shared imports and the dashed-outline branch as they were
The moved-outline key is imported where it is used, and the outline is
stored through one helper, so the change touches fewer lines that other
work on the renderer also changes.
2026-11-05 10:26:08 +07:00
dotCooCoo e6331e559a Render: a moved path reuses its stroke outline
A path object that moves without changing shape drew its stroke by
outlining the whole line again, because the stroke outline cache is
keyed by the node. The renderer now keeps, per object, stroke and
outline width, the latest outline with the line it was made from. When
the new line is that line moved, it draws the kept outline moved by the
same offset, and moves the region a long path was outlined in with it.

Scaling, rotating or editing the path, changing the stroke's width,
join, cap, dashes or profile, a zoom that changes the outline's
tolerance, and a move that takes the view past the outlined region
still outline the stroke again. Only the latest outline of each stroke
keeps its line.
2026-11-05 10:26:08 +07:00
Don Omondi 26c27b8b85 Artboards: Shift- and Ctrl/Cmd-click in the Artboards panel select several artboards with any tool, and Fill applies to all of them (#5698) 2026-11-05 10:26:07 +07:00
dotCooCoo 5baf83f1de Layers: counting a row's art for its first thumbnail stops after 20,000 steps
A row drawn before was counted with no limit on its objects, so symbols
that each hold many instances of the next made the count grow with the
product of the instances, and the Layers panel could stall on such a file.

- Counting stops after 20,000 steps: each object, subpath, text run and
  symbol looked at is one step, and every 64 bytes of a symbol or placed
  file name looked up is one more. A row that needs more gets its
  thumbnail on the thumbnail thread, and the painted thumbnail draws
  nothing for it.
- A row drawn before counts at most 20,000 objects.
2026-11-05 10:26:07 +07:00
dotCooCoo 0f9839f7f6 Layers: heavy type, symbols, meshes and images get their first thumbnail off the UI thread
The Layers panel decided whether to make a row's first thumbnail on the
UI thread by counting path anchors and type frames only, so point type,
symbol instances, gradient meshes, images and placed documents counted
as one object with no anchors, and a heavy one was rendered on the UI
thread.

- small_node takes the row's document. Each glyph of type counts as 4
  anchors, each mesh point as 1 and every 100 image pixels as 1, against
  the same 2,000-anchor limit; glyphs are counted only up to the limit.
- A symbol instance and an inline graphic count their symbol's art, and
  a placed document counts its file's art once the file has been read;
  one not read yet goes to the thumbnail thread.
- Symbols and placed documents nested more than 8 deep go to the
  thumbnail thread, so a symbol holding an instance of itself is counted
  to an end.
- The painted fallback thumbnail counts as before.
2026-11-05 10:26:07 +07:00
bflatastic d62c90f41e Tests: Expand Appearance of a Transform's copies makes a group of them 2026-11-05 10:25:44 +07:00
Don Omondi 231e43a490 Effects: Expand Appearance makes each copy of a path's Transform effect an object of its own (#5612)
A path or compound path whose Transform effect made copies expanded to
one compound path of every copy. It now expands to a group of one object
per copy, each painted as the path, as gradient copies already did; a
second Transform effect's copies nest in a group per copy of the first.
Drawing is unchanged.

# Conflicts:
#	docs/effects-parity.md
2026-11-05 10:25:44 +07:00
FredApps ed78763866 Merge pull request #4784 from datatimp/fix/3260-halftone-radius-pixels
Color Halftone: Max Radius in pixels of the raster effects resolution
2026-11-05 04:09:48 +01:00
BFlat 40bfb22304 Merge pull request #5727 from mockydevs/fix/numeric-math-decimal-comma-5684
Numeric fields: a decimal comma works in arithmetic next to a number with a point (#5684)
2026-11-05 09:54:35 +07:00
Don Omondi e82fd3d5ca Numeric fields: a decimal comma works in arithmetic next to a number with a point (#5684)
A numeric field read a comma as a decimal point only when the text had no
point at all. A field shows its value with a point (100.5 pt), so typing
-20,5 after it gave 100.5 pt-20,5, which kept its comma and was refused.

Each number now reads its own separator: commas become points unless the
text reads as thousands (1,000, as before). A number written with both
separators (1.234,5, 1,000.5) ends up with two points and is still refused
rather than guessed at.
2026-11-05 09:46:13 +07:00
BFlat 7ef4829e5e Merge pull request #5726 from mockydevs/fix/compound-shape-insertion-5309
Isolation mode: a locked or hidden layer keeps the isolated art from clicks and marquees (#5309)
2026-11-05 09:45:56 +07:00
Don Omondi 23bcef97c7 Isolation mode: a locked or hidden layer keeps the isolated art from clicks and marquees (#5309)
Locking or hiding the layer (or a group) around the isolated object left
its art selectable with the Selection tool: the isolation branch of the
hit test only checked for a locked artboard, and the marquee's checked
nothing. Both now pass over isolated art that isn't editable.
2026-11-05 09:32:28 +07:00