Commit Graph
469 Commits
Author SHA1 Message Date
dotCooCoo 914a109dc9 Scissors: Alt held switches to the Add Anchor Point tool
A click with the Scissors tool cut the path whether or not Alt was
held, and the cursor stayed the Scissors cursor. The reference app's
shortcut list has "Switch Scissors tool to Add Anchor Point tool" on
Alt (Option).

While Alt is held, a click with the Scissors tool now does what a click
with the Add Anchor Point tool does: on a segment it adds an anchor
point with path.insertAnchor in one undo step, and the path is not cut.
The cursor is the Add Anchor Point tool's while Alt is held. When Alt
is let go, the cursor is the Scissors again and a click cuts.

Docs: docs/target-app-parity.md, crates/tools/src/cursors.toml.
2026-10-29 10:02:43 +07:00
dotCooCoo f0c5de420b Type tools: Shift switches between horizontal and vertical, and Alt switches between area and path type
The reference app's shortcut list switches between its Type tools with
Shift and with Alt (Option). VectorCraft's Type tools had no such switch.

While no type is being edited, a press with Shift held makes new type
with the chosen tool's horizontal or vertical counterpart: Type and
Vertical Type, Area Type and Vertical Area Type, Type on a Path and
Vertical Type on a Path. A press with Alt held makes it with Type on a
Path in place of Area Type, or the reverse, in the same writing
direction. With both keys held, both switch. The keys held when the
press starts are the ones that count. The pointer shows the tool the
press acts as, and the chosen tool stays selected. While type is being
edited, Shift and Alt work as they did.

Docs: docs/target-app-parity.md.
2026-10-29 10:02:34 +07:00
dotCooCoo a4ba07dd1b Width tool: Escape deselects the selected width points
With the Width tool, Escape did not deselect the selected width points:
they stayed selected, Delete still removed them, and in isolation mode
the same Escape left isolation mode. The reference app's shortcut list
gives Esc for deselecting a width point.

Escape now deselects the Width tool's selected width points. The path,
its widths and the undo history do not change, and no command is sent.
While width points are selected the tool takes Escape, so that Escape
does not also leave isolation mode. With no width point selected, and
during a drag, Escape does what it did before.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-29 10:02:18 +07:00
dotCooCoo aa503c2648 Arc tool: C, F and Up/Down change the arc while it is dragged out
The reference app switches an arc between open and closed with C,
flips it with F and changes its angle with Up/Down while it is dragged
out. VectorCraft's Arc tool ignored these keys during a drag.

While an arc is dragged out, C now switches it between an open and a
closed path, F switches its base between the X and Y axes in the same
box, and Up/Down raise and lower its slope by 10 within -100 to 100.
Each press switches once. The arc drawn on release uses the new values,
and they stay as the Arc tool's options. With nothing dragged, C and F
are shortcuts as before.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-29 10:02:03 +07:00
dotCooCoo 46721fe093 Blob Brush: a release away from the press point paints with Alt down
A release that arrives at a new position with no drag before it now counts
as movement, so Alt pressed at that moment no longer switches the stroke
to the Smooth tool.
2026-10-29 10:01:53 +07:00
dotCooCoo 7e25203660 Blob Brush: Alt switches to the Smooth tool only before the pointer moves
Alt switched a Blob Brush stroke to the Smooth tool while the stroke held fewer than two
points, so a drag that had moved less than the sampling tolerance still switched when Alt
went down. The tool now records whether the pointer has moved from the press point at all.
A release with Alt held, after a press without Alt and no movement, also smooths instead of
painting a dot, matching the Smooth cursor shown before it.
2026-10-29 10:01:53 +07:00
dotCooCoo 80bf11dd8b Blob Brush: Alt switches to the Smooth tool while it is held
The reference app switches the Blob Brush to the Smooth tool while Alt
(Option) is held. In VectorCraft an Alt drag with the Blob Brush painted
a blob like any other drag.

With Alt held at the press, or pressed before the drag has moved, the
Blob Brush shows the Smooth tool's cursor and a thin line without the
length label, and the release smooths the selected paths under the
drag with path.smoothRegion, as the Pencil does when Alt key toggles to
Smooth Tool is on. Shift does not constrain a smoothing drag, a stroke
that has moved keeps painting when Alt goes down, and with nothing
selected the release changes no path.

Choosing another tool during a Pencil smoothing drag no longer leaves
the Pencil showing the Smooth tool's cursor when it is chosen again.
deactivate now clears the smoothing state, for the Blob Brush too.

Docs: docs/target-app-parity.md.
2026-10-29 10:01:52 +07:00
dotCooCoo 6bb5398119 Pencil: Alt smooths as far from the drag as the Smooth tool does
With "Alt key toggles to Smooth Tool" on, an Alt drag with the Pencil
smoothed within the Pencil's "Edit selected paths" Within distance. At
0, which turns editing off, it smoothed nothing. It now smooths within
the Smooth tool's 12 px radius at every Within value.
2026-10-29 10:01:33 +07:00
NetterSilverandClaude Opus 5.5 8b4ebf50be Fix Shift-scaling a corner handle along a single axis
Fixes #4262

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 10:00:59 +07:00
dotCooCoo 686cd1f2f5 Curvature: deleting a point re-curves the path through the remaining points
Deleting a point of a finished path with the Curvature tool sent
path.removeAnchor, which refits the two segments that met at the point so
one curve follows them. The path kept the bend of the deleted point
instead of curving through the points that remain.

The tool now sends path.removeAnchor with curvature: true, which uses the
new curvature_remove. Each smooth neighbor takes new handles from its new
neighbors, and an end beside one of them takes its end handle again. A
corner neighbor keeps its handle directions, and its handle on the new
segment scales with the segment's chord. With two points left, the points
that curve lose their handles. Object > Path > Remove Anchor Points and
the Delete Anchor Point tool still refit the curve.
2026-10-29 10:00:30 +07:00
Dylan M. Taylor 484d25582c Merge remote-tracking branch 'origin/main' into pr-4299-ff 2026-10-28 17:20:12 -04:00
Dylan M. Taylor 62588fd080 Separate selection tool pointer phases and clarify imports 2026-10-28 05:03:13 +00:00
el-j 464a0710b7 Merge remote-tracking branch 'upstream/main' into fix/compound-path-pen-join 2026-10-27 14:33:06 +01:00
aiongg e724228e25 docs: update source paths for the moved files 2026-10-26 22:01:25 +00:00
aiongg 714aecc7b4 refactor(tools): move text.rs items to text/{plain,ports,tool}.rs 2026-10-26 21:45:33 +00:00
aiongg 1b9881ce1e refactor(tools): move lib.rs items to {context,cursor,input}.rs 2026-10-26 21:45:33 +00:00
aiongg 9eafb73e3f refactor(tools): move guides.rs items to guides/{snap,targets}.rs 2026-10-26 21:45:33 +00:00
aiongg 443990eb62 refactor(tools): move distort/perspective.rs items to distort/perspective/{tools}.rs 2026-10-26 21:45:33 +00:00
aiongg e987e6dc58 refactor(tools): move builder.rs items to builder/{cache,live_paint,lookup,map}.rs 2026-10-26 21:45:33 +00:00
aiongg f1d427762b style: cargo fmt on files moved without formatting 2026-10-26 19:32:10 +00:00
aiongg e8417d6c69 refactor(tools): move text.rs tests to text/tests.rs 2026-10-26 18:33:16 +00:00
aiongg 391b61f747 refactor(tools): move touchtype.rs tests to touchtype/tests.rs 2026-10-26 18:18:18 +00:00
aiongg 8bafcb0444 refactor(tools): move shape.rs tests to shape/tests.rs 2026-10-26 18:18:18 +00:00
aiongg 4ccf9ddea8 refactor(tools): move xform/gradient.rs tests to xform/gradient/tests.rs 2026-10-26 18:18:18 +00:00
aiongg 6dd257522b refactor(tools): move draw2/curvature.rs tests to draw2/curvature/tests.rs 2026-10-26 18:18:17 +00:00
aiongg dc5888c243 refactor(tools): move corners.rs tests to corners/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 43d205ce8a refactor(tools): move draw2/anchor.rs tests to draw2/anchor/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 683f0cd0de refactor(tools): move xform/artboard.rs tests to xform/artboard/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 1160aa4336 refactor(tools): move rulerguide.rs tests to rulerguide/tests.rs 2026-10-26 18:18:17 +00:00
aiongg f998e19bfd refactor(tools): move guides.rs tests to guides/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 39ad1c0c6e refactor(tools): move pen.rs tests to pen/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 8fd986ae13 refactor(tools): move draw2/gesture.rs tests to draw2/gesture/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 34006a8ede refactor(tools): move builder.rs tests to builder/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 06bb496447 refactor(tools): move direct.rs tests to direct/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 732d4ded79 refactor(tools): move select.rs tests to select/tests.rs 2026-10-26 18:18:16 +00:00
nrq6993-a11y 9f74540d58 G11: Anchor Point tool Space moves anchor mid-drag
Squashed from #4254 onto main.
2026-10-26 18:49:33 +07:00
nrq6993-a11y c38185f79c ci: Rust 1.95 clippy and flaky Arabic PDF test after upstream merge
Co-authored-by: nrq6993-a11y <nrq6993-a11y@users.noreply.github.com>
2026-10-26 18:40:47 +07:00
nrq6993-a11y 789b69ce8e G1: Blob Brush drag shows scrub path length when Measurement Labels on
Co-authored-by: nrq6993-a11y <nrq6993-a11y@users.noreply.github.com>
2026-10-26 18:40:46 +07:00
el-j 22f823f995 Merge remote-tracking branch 'upstream/main' into fix/compound-path-pen-join
# Conflicts:
#	crates/engine/src/cmd/path.rs
#	crates/engine/src/tests_draw2.rs
2026-10-26 10:41:34 +01:00
Taha-Mahmoodi de151f849a Type: the thread-break comments describe the behaviour in our own words
Review follow-up (CodeRabbit, clean-room): two doc comments quoted the
cited help page. Comments only.
2026-10-26 16:00:39 +07:00
Taha-Mahmoodi 54d9fbc162 Type: a double-click on a threaded port breaks the thread there 2026-10-26 16:00:39 +07:00
Taha-Mahmoodi 5b91057dca Repeat: a selected Grid Repeat has on-canvas handles for its rows, columns and spacing
With the Selection tool, a single selected grid repeat shows a handle below the grid (rows), one right of it (columns), one past its bottom-right corner (both) and sliders between its first two columns and rows (horizontal and vertical spacing), as the public Set grid repeat options page describes. Each drag previews object.repeat.options and commits as one Repeat Options undo step; Escape cancels, and a drag that ends where it began leaves no step. Bounding-box handles keep priority where they overlap, and the controls hide with the edges or the bounding box. Before, a drag there scaled the source or started a marquee.

Part of #2691.
2026-10-26 13:44:06 +07:00
ncicandClaude Opus 5.5 21a9e854e1 Tools: only the freehand tools get every move of a frame (#4227 review)
Every pointer move of a frame went to whatever tool was active, so with
a fast mouse (or a pen) a tool whose drag preview is costly (the
Selection tool moving a large selection, Free Distort, the Width tool)
redid it for each, up to 64 times a frame.

Tool::wants_samples (default false) says a tool builds a stroke from
the drag's samples: the Pencil, Paintbrush, Blob Brush, Eraser, Knife,
Smooth and Path Eraser answer true (the Paintbrush through its wrapper),
the Join tool doesn't. The canvas still reads the frame's moves every
frame, so the macOS feed's pressures stay paired, but replays them only
to such a tool; every other tool gets one drag a frame at the latest
position. A frame whose moves end where the last frame's did still
reaches the tool.

Tests: only_the_freehand_tools_get_every_move_of_a_frame (Pencil,
Paintbrush and Blob Brush get the 19 moves before the last, Selection,
Direct Selection and Width none),
a_mouse_stroke_keeps_a_frame_that_ends_where_it_started,
the_freehand_tools_want_every_sample, and
a_mouse_stroke_keeps_every_move_of_a_frame now checks every position in
order, not only the count.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 13:31:52 +07:00
nrq6993-a11y c640f40ce1 G4: draw loaded-text cursor for threaded overflow
Squashed from #4229 onto main.
2026-10-26 13:09:22 +07:00
ncicandClaude Opus 5.5 21e9c8ff31 Pencil: Live preview option, a thin line while drawing when it is off
A Pencil stroke always previewed as the path it draws, with its full
appearance: with a fill set, the fill flipped between the shape and its
inside-out as the stroke crossed itself or curved back, and hid the line
being drawn.

Pencil Tool Options get a Live preview checkbox, above Live curve
fitting, on by default and kept with the tool's other options
(`livePreview`, settings.rs). With it off, the stroke previews nothing
while it is drawn: a thin line follows the pen (the drag overlay the
Knife and Blob Brush already show), and the release, or a switch of
tool mid-stroke, draws the path with its fill and stroke, as one undo
step, as before. Escape still cancels the stroke. With it on nothing
changes. The Paintbrush has no such option and keeps previewing.

Public reference: Draw and edit paths using the Pencil tool,
https://helpx.adobe.com/illustrator/using/tool-techniques/pencil-tool.html
(lists Live preview and Live curve fitting among the Pencil's options).

The checkbox label is translated in all 24 catalogs.

Tests: pencil_with_live_preview_off_shows_a_thin_line_until_the_release
(tools), pencil_with_live_preview_off_draws_the_filled_path_on_release
(engine), and the freehand dialog test shows the checkbox for the Pencil
only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 12:52:32 +07:00
ncicandClaude Opus 5.5 20476760bc Pencil: Edit Selected Paths redraws a selected compound path's member paths
A selected compound path (a shape with a hole, such as one made with
Object › Compound Path › Make) could not be redrawn with the Pencil or
the Paintbrush: at the press, find_redraw looked only for selected
objects that are paths themselves, and a compound path's paths are its
children. The stroke then drew a new path, which Keep selected selected
in place of the compound path, so every later stroke near the shape drew
a new path too: redrawing seemed to stop working.

- find_redraw takes a selected compound path's member paths as well,
  the nearest one within Edit selected paths within of the press.
- path.freehand's redraw keeps the compound path selected (or, with Keep
  selected off, takes it out of the selection) when the redrawn path is
  one of its members, so the next stroke redraws it too.

Test: pencil_redraws_a_selected_compound_path redraws the outer path and
then the hole of a selected compound path; it fails without this change
(the first stroke draws a new path).

cargo xtask ci: every step passes except one test in `test`,
vectorcraft-pdf tests_import_fidelity::text_becomes_point_type, which
fails the same way on unmodified main on this machine; it is unrelated
to this change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 11:49:03 +07:00
skylar taylor-barrick 581c79dcb1 M14: distinguish qualification from publication (#4173) 2026-10-25 23:47:58 -04:00
Angelo Bernardini ea36291f30 G12: General › Corner Radius is the Rounded Rectangle tool's radius (#394)
Squashed from #4074 onto main.
2026-10-26 09:09:47 +07:00
ncic 09b3b25004 Fix #3328: Pencil Fidelity down to 0.01 pt, with a logarithmic slider and key steps that fit the range
Squashed from #4196 onto main.
2026-10-26 09:09:47 +07:00
dotCooCoo 05e09039f5 Pencil: a stroke from an end of one selected path to an end of another connects them
Squashed from #4095 onto main.
2026-10-26 09:09:47 +07:00