Commit Graph
5173 Commits
Author SHA1 Message Date
dotCooCoo 01509e2316 Docs: the eraser end's switch waits for the pointer to come back over the window 2026-10-24 03:09:06 +07:00
dotCooCoo 8fa918b30b Pen tablets: a pen's eraser end selects the Eraser on Linux under X11 and XWayland
On Linux under X11, and under XWayland, the X server lists a pen's
eraser end as a pointer device of its own, and winit 0.30 hands it to
the window as a mouse. Turning the pen over and dragging the eraser
end drew with the active tool, for example a Paintbrush stroke.

The tablet reader now marks a pen device whose name or XInput type
contains "eraser", and Services::stylus carries the pen's end with
its pressure. Once a frame while no press is held and the pointer is
in the window, the canvas selects the Eraser when the eraser end
moves, and it selects the tool used before when the tip moves again.
The return goes through Session::switch_tool, so a perspective grid
hidden meanwhile stays hidden. A tool chosen while the eraser end
stands in stays when the tip comes back. The feed starts afresh when
the pen turns over, so a press of one end does not take the pressure
the other end last touched with. Native Wayland is unchanged.

The switch follows PhotoCraft's sync_eraser_tool
(storytold/photocraft#255, and storytold/photocraft#5043 for the
cleared tool).

Docs: docs/development.md, docs/gaps.md, docs/hardware-parity.md,
docs/target-app-parity.md.
2026-10-24 03:09:06 +07:00
Dan Green 632598ba17 Libraries panel: items show as icons or in a list, toggled beside the library picker
The list view gives colours and graphics a row each with the item's name (a colour's hex value too, where it fits); items drag and drop by row there. Graphic thumbnails are shrunk on the CPU to the size they are drawn at, as egui-wgpu doesn't mipmap textures and thin strokes broke up in small tiles.
2026-10-24 03:09:06 +07:00
Marco Arnulfo 8bdc60b995 Pencil: a Shift line ignores Alt for the cursor and smoothing, and a line dragged back to its press point is cancelled 2026-10-24 03:09:06 +07:00
Marco Arnulfo 5f6fff3638 Pencil: a Shift line drops the press's Smart Guides and stays open with Alt (part of #3799) 2026-10-24 03:09:06 +07:00
Marco Arnulfo c39be04573 Pencil: Shift held at the press draws a straight line at 45° steps (part of #3799) 2026-10-24 03:09:06 +07:00
bflatastic b3673b7f32 Fix status-bar coordinates after changing the ruler origin
Squashed from #2847 onto main.
2026-10-24 03:09:06 +07:00
Tomasz LewandowskiandClaude Opus 5.5 99cb497708 i18n(pl): "Wtyczki i dyski robocze", "Geometryczne linie pomocnicze"
Two Polish rows added this week:

- "Plug-ins & Scratch Disks" read "Wtyczki & Dyski robocze": every other "&"
  in the catalog is "i", and Polish doesn't capitalize the second noun.
- "Geometric Guides" read "Prowadnice geometryczne"; Guides are "linie
  pomocnicze" in the rest of the catalog (Guides, Smart Guides …), as in #2870.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DukHNvUY45rjRnvtz91x33
2026-10-24 03:09:06 +07:00
bflatastic deb6afb2db i18n(fi): one row for the PDF security settings message (#3847 added it too) 2026-10-24 03:09:06 +07:00
Janiz-zzzandClaude Opus 5.5 ef10fba513 i18n(fi): fix package-note spacing and a few Finnish labels
- Packaged … in {folder} {note}: keep the space before {note}, as the
  English does, and use "Paketoitiin" in the status line like the @msg row
- Colored Pencil: Värikynä (Väriliitu is a crayon)
- Underpainting: Pohjamaalaus
- Select artwork to apply effects: use "kuvitus" like the rest of the catalog
- Arc Segment Tool Options: Kanta akselilla, X-/Y-akselin pituus
- Plug-ins & Scratch Disks: Laajennukset ja työlevyt
- Add the Finnish row for "PDF security settings are not an object" (#3836)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 03:09:05 +07:00
aiongg cb06c7b34e i18n: missing translations never fail; xtask ci prints one report (#3856)
* i18n tests: report missing translations instead of failing

The scans for untranslated menu strings, tl! literals, undo labels, menu labels and status
messages print what a complete language lacks. A missing translation shows the English
text until a translator adds the row, so it no longer fails the gate.

* i18n: one untranslated report in xtask ci; drop one-language wording tests

`i18n::tests::untranslated_report` lists, per language, the menu strings, tl! literals, undo
step names and templates, menu labels, render-site labels, status and error messages,
PostScript error meanings and default swatch names its catalog lacks; strings every language
lacks are listed once. It never fails on a gap, only on a scan that finds too few strings.
`cargo xtask ci` runs it in an `i18n-report` step, and `cargo xtask i18n-report` runs it alone.

The five scan tests, the render-site and swatch coverage tests and untranslated_messages.txt
fold into the report. Tests that pinned one language's wording are gone; where they also
checked code (lookups, plural rules, locale tags, menu and History step names, engine
parameter errors), that check stays and compares with the catalog lookup.
2026-10-23 16:01:11 -04:00
BFlat 5c008243cd Merge pull request #3770 from Silvertree2010/fix/3666-legacy-ai-v7-round-trip-changes
Flatten transparent image pattern tiles in legacy .ai v7 export
2026-10-24 02:45:14 +07:00
BFlat 6fc0ec4e9a Merge pull request #3788 from Silvertree2010/fix/3577-audit-repeat-the-250-000-instanc
Count Repeats inside symbol art toward the Repeat instance budget
2026-10-24 02:44:58 +07:00
BFlat 47dfb127a2 Merge pull request #3813 from Taha-Mahmoodi/feat/variable-font-filter
Font menu: Font Technology › Variable lists only variable font families
2026-10-24 02:44:40 +07:00
BFlat 8d3d1f2162 Merge pull request #3808 from lehni/fix/svg-outlined-colour-order
SVG: type written as outlines stacks colour glyphs under their run's paint
2026-10-24 02:44:22 +07:00
BFlat 55aa6ec530 Merge pull request #3803 from lehni/fix/colour-glyphs-outlined
Type: colour glyphs go with type that effects reshape and Expand Appearance
2026-10-24 02:44:11 +07:00
BFlat 9e1ab82b07 Merge pull request #3804 from lehni/fix/svg-glyph-coordinates
Type: SVG glyph documents follow the SVG table's coordinate rules
2026-10-24 02:43:53 +07:00
BFlat d414c500fb Merge pull request #3755 from fortesnow/fix/pdf-font-split-postscript-name
Fonts: a family and style split from a PostScript name find the face once it is installed
2026-10-24 02:43:37 +07:00
BFlat 03be3d31b1 Merge pull request #3795 from dotCooCoo/feat/live-objects-in-symbol-art-kept
Render: live objects in symbol art and opacity masks keep their evaluations between frames
2026-10-24 02:43:21 +07:00
BFlat 5f36cc5813 Merge pull request #3823 from MiQ71/fix-3786-text-spacing-shortcuts
Fix text spacing shortcuts for selected type
2026-10-24 02:28:11 +07:00
BFlat 03b84fda34 Merge pull request #3814 from Taha-Mahmoodi/feat/simplify-part-of-path
Simplify: with part of a path direct-selected, Object › Path › Simplify refits only the selected runs of segments
2026-10-24 02:27:35 +07:00
BFlat b18dda34f5 Merge pull request #3791 from dotCooCoo/fix/opening-waits-only-for-a-drag
Open and Place: a file read in the background waits for a busy tool only during a drag
2026-10-24 02:26:57 +07:00
BFlat 107a2c2a54 Merge pull request #3798 from MiQ71/fix-3766-stroke-profile-flip
Fix #3766: correct stroke profile flip icons
2026-10-24 02:26:24 +07:00
BFlat 4fddbd2337 Merge pull request #3805 from Taha-Mahmoodi/fix/3705-double-click-clip-group
Fix #3705: art drawn or pasted inside an isolated object in Draw Inside stays in isolation mode
2026-10-24 02:25:53 +07:00
BFlat edf5db3f6c Merge pull request #3827 from dotCooCoo/fix/point-type-from-threaded-frame-keeps-its-text-once
Threaded text: Convert To Point Type on a frame no longer duplicates its text
2026-10-24 02:25:20 +07:00
BFlat 99c788beb8 Merge pull request #3783 from marcoarnulfo/feat/tab-strip-double-click-collapse
Panels: a double-click on the tab strip right of the tabs collapses the group
2026-10-24 02:24:45 +07:00
BFlat 81028c80e0 Merge pull request #3830 from marcoarnulfo/feat/tab-collapse-beside
Panels: a double-click on a tab of a group beside another no longer reports an error
2026-10-24 02:24:15 +07:00
BFlat c92ce1153b Merge pull request #3840 from marcoarnulfo/fix/cmd-click-ends-type-editing
Type: a Ctrl/Cmd click away from the type being edited ends its edit
2026-10-24 02:23:45 +07:00
BFlat 758e57902b Merge pull request #3845 from MarekSpodBiedry/issue-3769
Bring the window forward when Finder opens a file (#3769)
2026-10-24 02:23:20 +07:00
bflatastic a8fd8ddeef Legacy .ai pattern flattening: skip the ancestry walk for leaves without a pattern fill 2026-10-24 02:06:54 +07:00
NetterSilverandClaude Opus 5.5 94759cbe71 Flatten transparent image pattern tiles in legacy .ai v7 export
Fixes #3666

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 02:06:40 +07:00
bflatastic 2e572c7805 Count Repeats inside symbol art toward the Repeat instance budget
Squashed from #3788 onto main.
2026-10-24 02:06:39 +07:00
Taha-Mahmoodi 52d93cfce5 Font menu: Font Technology › Variable lists only variable font families
As Illustrator's help describes (Filter fonts by classification, Font Technology › Variable), the font menu gets a Font Technology row whose Variable choice lists only the families with variation axes, together with the script, kind, favourites and search filters, and stays set from one opening to the next. A family is variable when any of its faces, loaded or scanned, has an `fvar` table, so a family installed as static files beside a variable one counts.

Spec: https://helpx.adobe.com/illustrator/desktop/design-with-text/fonts-and-scripts/find-apply-and-adjust-variable-fonts.html
2026-10-24 02:06:16 +07:00
Jürg Lehni a26ac22794 SVG: type written as outlines stacks colour glyphs under their run's paint
As on the canvas: each run's bitmap, COLR and SVG glyphs come before the run's path, so a plain character set over a colour one stays on top.
2026-10-24 02:06:13 +07:00
Jürg Lehni c8fe9193d9 Type: colour glyphs go with type that effects reshape and Expand Appearance
COLR and SVG glyphs, which have no outlines, were left out wherever type was taken as its outlines: geometry effects, Expand Appearance, EMF/WMF export.
2026-10-24 02:06:11 +07:00
Jürg Lehni 863a954cd2 Type: SVG glyph documents follow the SVG table's coordinate rules
A root size without a viewBox sets up the em, a viewBox that isn't square is centred in it, and a glyph element nested in others is drawn on its own, as if used.
2026-10-24 02:06:09 +07:00
fortesnow bfceca7b4d Fonts: a family and style split from a PostScript name find the face once it is installed
A PDF names fonts by PostScript name. When the font isn't installed at import, the importer
splits the name (`Honoka-Mincho` → family Honoka, style Mincho) and the document keeps that
pair. Installing the font later didn't help when its family name shares nothing with its
PostScript name (ほのか明朝): the pair stayed missing. FontDb::canonical now also looks the
pair up, joined, among the PostScript names, and answers with that face's own family and style.
2026-10-24 02:06:09 +07:00
dotCooCoo e313c93e2c Render: live objects in symbol art and opacity masks keep their evaluations between frames
The renderer placed symbol art that holds a blend, an envelope or a
repeat again for every instance in every frame. The live object in the
placed copy was a new node each time, and the renderer evaluated it
again. Symbol art that is itself a live object, an opacity mask whose
art is one, and a live object in a clip group in Outline view were
drawn from an uncached copy in every frame. At 1000 x 1000 pixels,
2,000 instances of a symbol holding an envelope took 126 ms a frame on
main, and the same 2,000 envelopes on the page took 30 ms.

The renderer now keeps the placed art of instances and inline graphics
when it holds blends, envelopes or repeats, and when the art is itself
a live object. It draws kept live art, opacity-mask art and Outline
view clip members that are live objects from the live cache, which
evaluates them again when the symbols, patterns, fonts or color
settings they show change. The 2,000 instances take 28 ms a frame,
with the same pixels.

Docs: docs/target-app-parity.md
2026-10-24 02:06:08 +07:00
bflatastic 50c801b36f Alt+arrow type spacing: reuse the Type tool's step_key, check Alt before the selection walk 2026-10-24 02:05:19 +07:00
Taha-Mahmoodi 309119dc4c Docs: Simplify of part of a path is described in our own words, not the help page's
Review follow-up (CodeRabbit, clean-room): the test header, gaps.md and
target-app-parity.md quoted a phrase from the cited help page. Comments
and docs only.
2026-10-24 02:05:19 +07:00
dotCooCoo 2db1ada660 Open and Place: a file read in the background waits for a busy tool only during a drag
A file opened or placed off the UI thread waited while the active tool
reported busy. The Dimension tool also reports busy between its clicks,
so after one click a ready file stayed queued with its spinner until
the dimension was finished or canceled. Files also waited between the
clicks of the Blend tool.

The session now records whether the pointer button is held. A file
waits for a busy tool only while the button is held. A file that
opens between a tool's clicks resets the tool, as a switch of
documents does; a file placed in the active document leaves the
tool's clicks in place. Files still wait while a dialog is open, a
drag is under way or a preview is open, and a tool's preview between
its clicks counts as one (the Flare tool after its center drag, the
Dimension tool's line once the pointer moves after its second click).
2026-10-24 02:05:19 +07:00
Mirko Kerezovic 78213cdf00 Fix #3766: correct stroke profile flip icons 2026-10-24 02:05:19 +07:00
Taha-Mahmoodi 9ca5ffab8e Fix #3705: view.drawMode's params text says plainly where isolation goes
Review follow-up (CodeRabbit): the sentence about isolation in the
command's parameter text was hard to parse. Text only.
2026-10-24 02:05:19 +07:00
Mirko Kerezovic a79bf0f42e Handle Shift Alt arrows on selected type 2026-10-24 02:05:19 +07:00
Taha-Mahmoodi 606796b934 Simplify: with part of a path direct-selected, Object › Path › Simplify refits only the selected runs of segments
The Simplify help page says a path can be simplified whole or "a specific
path region with the Direct Selection tool"
(https://helpx.adobe.com/illustrator/desktop/draw-shapes-and-paths/modify-paths/manually-simplify-paths.html).
Simplify refitted every selected path whole, whatever part of it was
direct-selected.

object.path.simplify now looks at each path's direct selection: the
segments picked as segments, or else every segment with both anchors
selected. Each run of consecutive selected segments is refitted on its own
(vectorcraft_pathops::simplify_part) between its two end anchors, which stay
where they are with their handles on the side away from the run; every
other anchor and segment stays exactly as it was. A closed path's run may
cross its start point (the path then starts at the run's end anchor),
separate runs on one path simplify independently in one undo step, and the
runs stay direct-selected (as segments when segments were picked). A path
with only lone anchors selected still simplifies whole, as before, and
wholePaths: true simplifies partly selected paths whole. The slider, its
preview, Auto-Simplify and the Simplify dialog all run the command, so
they act on the part too. simplify_with now shares its run fitting with
the part refit (same results).

Verification: crates/engine/src/tests_simplify_part.rs (unselected anchors
and segments equal bit for bit, run end anchors fixed, the run within the
tolerance, two runs equal to each simplified alone in one undo step, a
closed run across the start point, picked segments, wholePaths, slider
preview and Auto-Simplify, a run that can't be simpler records no step)
and simplify_slider_and_dialog_simplify_only_the_direct_selected_part_of_a_path
(the slider's preview, Enter and the dialog's OK). Live: the release build's
slider at level 20 on a 91-anchor wave with anchors 30–60 selected refits
only that stretch.
2026-10-24 02:05:19 +07:00
Taha-Mahmoodi 0a83c19911 Fix #3705: art drawn or pasted inside an isolated object in Draw Inside stays in isolation mode
The drawing modes help page
(https://helpx.adobe.com/illustrator/desktop/draw-shapes-and-paths/learn-drawing-basics/drawing-modes-overview.html)
has you draw or paste into the selected object in Draw Inside. The isolation
help page
(https://helpx.adobe.com/illustrator/desktop/manage-objects/select-objects/isolate-objects.html)
isolates a path, group or object on a double-click with the Selection tool,
and puts art added in isolation mode where the isolated art was once the mode
ends, so that art belongs with what is isolated.

Steps: select a path, choose Draw Inside, double-click the path with the
Selection tool (it is isolated), then draw or paste. The art went into the
clip group Draw Inside makes around the path, but isolation mode stayed on the
bare path, so the new art was outside it: drawn dimmed, passed through by
clicks and marquees, and a double-click on it selected the path and never
entered the clip group. Double-clicking an existing Draw Inside clip group
from outside isolation mode already isolated it, and pastes then went inside
it; that is unchanged.

Cause: create::insert_look_turned and edit::paste_clip put the art into
create::draw_inside_group's clip group but left DocState::isolation on the
object drawn into, and with a single object isolated, hit testing reaches
only that object.

Change: when the object drawn into is the isolated one, isolation moves to its
clip group (create::isolate_draw_inside_group), after new art and after Draw
Inside pastes. A drag's previews replay from its snapshot and make the group
under the same id, and cancelling the drag restores the isolation it began
with. Undo and redo end isolation mode when the isolated object is no longer
in the document (the undone clip group), as mask editing already does,
instead of keeping an id a later object may take.

Verification: drawing_inside_an_isolated_object_keeps_the_new_art_in_isolation_mode
fails without the change (isolation Some(NodeId(2)) instead of the clip group
Some(NodeId(6))). A whole-window egui run through the control channel's
ui.click/ui.drag (double-click the rectangle, drag an ellipse inside, paste,
click the copy) left isolation on the rectangle and the click selected the
rectangle before; after, isolation is on the clip group and the click selects
the copy.
2026-10-24 02:05:19 +07:00
Mirko Kerezovic 32bcf8900c Fix text spacing shortcuts for selected type 2026-10-24 02:05:19 +07:00
dotCooCoo 0083587131 Threaded text: Convert To Point Type on a frame no longer duplicates its text
Converting a frame of threaded text to point type left the frame's
text in the point type, and the re-flow also added that text to the
story, as it does for a frame that was deleted. The other frames then
held it a second time.

A frame that is still in the document as point type now leaves its
thread with the text it holds. The story flows through the other
frames without that text, so each character is held once. A thread
left with one frame is no longer a thread, and undo restores the
thread.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-24 02:05:18 +07:00
Marco Arnulfo 777930fcd2 Panels: a double-click on the strip of a group beside another does nothing
Such a group can't collapse, so the strip queued window.panel.collapse only for the command to refuse it and leave an error in the status bar.
2026-10-24 02:05:18 +07:00
Marco Arnulfo 35104e10ed Panels: a double-click on a tab of a group beside another no longer reports an error 2026-10-24 02:05:18 +07:00