Commit Graph
1690 Commits
Author SHA1 Message Date
skylar taylor-barrick 581c79dcb1 M14: distinguish qualification from publication (#4173) 2026-10-25 23:47:58 -04:00
Taha-Mahmoodi 502b204d74 Transform panel: the menu's Transform Object Only, Pattern Only, Both and Use Registration Point for Symbol act
Squashed from #4146 onto main.
2026-10-26 10:04:25 +07:00
bflatastic f5c528069f Revert "Merge pull request #4203 from storytold/fix/sonar-s2208-remaining"
This reverts commit 15e4054f7a, reversing
changes made to d7a2591dc0.
2026-10-26 09:56:24 +07:00
Dylan M. Taylor 96cd4b1b14 lint: explicit imports in remaining test and module files (S2208)
Replace glob imports (`use super::*`, `use crate::*`, `use sig::*`) with
the names each file uses, in scriptcheck, pdf, render, text and ui-egui.
No code changes.
2026-10-26 09:52:51 +07:00
dotCooCoo df716c3118 Image Trace: Document Library traces with a color group from the Swatches panel
Squashed from #3975 onto main.
2026-10-26 09:25:42 +07:00
vangel76 b54a5e6765 Artboards: canvas menu to lock and unlock artboards (#2531)
Squashed from #2532 onto main.
2026-10-26 09:25:35 +07:00
BFlat 4e70e39e90 Merge pull request #4106 from addibble/web-zoom-keys
Web: shortcuts the browser also has run only in the app
2026-10-26 09:22:50 +07:00
BFlat 076a7d72a7 Merge pull request #4099 from dotCooCoo/feat/highlight-substituted-fonts-preference
Type: Highlight Substituted Fonts moves to Preferences › Type and applies to every document
2026-10-26 09:22:35 +07:00
BFlat 817d6da31e Merge pull request #4104 from dotCooCoo/feat/web-pen-eraser-end
Pen tablets: a pen's eraser end selects the Eraser in the web build
2026-10-26 09:22:19 +07:00
BFlat df016b4f8f Merge pull request #4097 from dotCooCoo/feat/windows-pen-eraser-end
Pen tablets: a pen's eraser end selects the Eraser on Windows
2026-10-26 09:22:01 +07:00
BFlat 61f566b2c9 Merge pull request #4196 from ncic/pencil-fidelity-range
Fix #3328: Pencil Fidelity down to 0.01 pt, with a logarithmic slider and key steps that fit the range
2026-10-26 09:21:26 +07:00
BFlat 82f8fd1a51 Merge pull request #4152 from dotCooCoo/feat/pencil-new-path-star
Pencil: the cursor shows a star before a press that draws a new path
2026-10-26 09:20:58 +07:00
BFlat 0693fe4e61 Merge pull request #4175 from Taha-Mahmoodi/fix/1732-transform-each-remembers
Fix #1732: Transform Each opens on the values it was last confirmed with and has a Copy button
2026-10-26 09:20:40 +07:00
BFlat 8b9267d412 Merge pull request #4180 from dotCooCoo/feat/eraser-angle-roundness
Eraser: Angle and Roundness in Eraser Tool Options shape the tip
2026-10-26 09:20:27 +07:00
BFlat e24c576209 Merge pull request #4181 from dotCooCoo/feat/art-brush-width-pressure
Brushes: Art Brush Options' Width can follow the pen pressure
2026-10-26 09:20:08 +07:00
BFlat ad0a9c9201 Merge pull request #4182 from dotCooCoo/feat/pencil-live-curve-fitting
Pencil: Live curve fitting in Pencil Tool Options shows the stroke's points until the release fits them
2026-10-26 09:19:54 +07:00
BFlat 24b50b1643 Merge pull request #4057 from dotCooCoo/feat/mcp-answer-dialog
MCP: answer_dialog sets the fields of the app's open dialog and confirms or cancels it
2026-10-26 09:19:25 +07:00
BFlat b1feb063a5 Merge pull request #4055 from dotCooCoo/feat/mcp-render-trace-views
MCP: screenshot and render_preview can draw the Image Trace view
2026-10-26 09:19:11 +07:00
BFlat f3e07d7ecc Merge pull request #4049 from dotCooCoo/fix/dialog-set-unknown-field
Dialogs: ui.dialog.set returns an error for a field the open dialog does not read
2026-10-26 09:18:55 +07:00
BFlat f0bdf3fa2c Merge pull request #4105 from dotCooCoo/fix/trace-preview-drafts
Image Trace: changes that wait with Preview off stay with their object
2026-10-26 09:18:24 +07:00
BFlat 6d855b4af4 Merge pull request #4076 from dotCooCoo/fix/trace-eye-button-hold
Image Trace: the eye button's hold ends on release, and the panel uses any selected trace or image
2026-10-26 09:17:13 +07:00
BFlat bb8e1897f6 Merge pull request #4158 from devius/ka-short-labels
i18n(ka): shorter Georgian for 15 labels that were cut off
2026-10-26 09:16:23 +07:00
Dylan M. Taylor 97ccb83337 lint: shell helper and lossless float conversion (S1192, S7679, S4325) (#4205)
- packaging/linux/package.sh: one verify_sha256 helper replaces the four
  repeated printf|sha256sum -c pipelines.
- packaging/macos/package.sh: stapler_retry copies its positional
  arguments into locals before use.
- swatch_options: f64::from(v) instead of v as f64 (same value; the
  argument is an f32, so the conversion stays).
2026-10-25 22:12:52 -04:00
Drew Dibble f6a20c9f56 Web: shortcuts the browser also has run only in the app
Squashed from #4106 onto main.
2026-10-26 09:09:47 +07:00
dotCooCoo ad75ea5d06 Type: Highlight Substituted Fonts moves to Preferences › Type and applies to every document
Highlight Substituted Fonts is now a preference in Preferences › Type,
next to Highlight Alternate Glyphs, on by default and saved with the
other preferences (`prefs.set highlightSubstitutedFonts`). The canvas
reads it through `RenderOptions::highlight_substituted_fonts` for every
open document; a document's own setup no longer decides it. File ›
Document Setup no longer shows the checkbox and keeps Highlight
Substituted Glyphs.

A file saved with Document Setup's Highlight Substituted Fonts off now
shows the pink highlight when it opens, while the preference is on.
The file still opens with the stored value, and saving it again keeps
that value.

`document.setup` no longer reports `highlightSubstitutedFonts`. It
ignores the key and adds a `warnings` entry that names `prefs.set` to
its reply, so an older reply passed back still applies its other keys.

The raster cache of type under a raster effect now also redraws when
Highlight Alternate Glyphs changes.
2026-10-26 09:09:47 +07:00
dotCooCoo be5bd7dbf0 Pen tablets: a pen's eraser end selects the Eraser in the web build
Pointer Events report a press of a pen's eraser end as the eraser button
(button 5). The browser build ignored that press. It now presses like the
tip, and the web runner writes the pen's samples into a stylus feed with
the end they came from, so the canvas selects the Eraser tool before the
press and the press erases. The next press of the tip selects the tool
used before, as on Linux and macOS. A hovering pen keeps the end it last
pressed with, since Pointer Events report no end while a pen hovers. A
mouse or finger takes the pen out of the feed; a palm rejected while the
pen presses does not.

Docs: docs/hardware-parity.md, docs/gaps.md (G14),
docs/target-app-parity.md.
2026-10-26 09:09:47 +07:00
dotCooCoo dbc446329f Pen tablets: a pen's eraser end selects the Eraser on Windows
With Windows Ink, winit reports a pen as a touch and drops its pen
flags, so on Windows the eraser end of a pen draws with the current
tool. The message hook that reads the barrel button now also reads
each pen pointer message's POINTER_PEN_INFO and writes the pen's
pressure and end into the canvas's pen feed: PEN_FLAG_INVERTED or
PEN_FLAG_ERASER is the eraser end. The canvas then selects the Eraser
tool and the tip brings back the tool used before, as on Linux and
macOS. A pen leaving detection range or the window, another pointer,
or a mouse message that Windows did not make from a pen or a touch
clears the feed, so a mouse presses fully.
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 c9fa005a54 Pencil: the cursor shows a star before a press that draws a new path
Draw freeform paths with the Pencil tool says a small star appears on
the Pencil when it is ready to draw a freeform path, and Reshape paths
with the Pencil tool says the star disappears over a selected path the
drag reshapes. The Pencil cursor had no star.

- New Cursor::PencilNew: the Pencil's crosshair with a small star where
  the closing cursor has its ring. It becomes the crosshair with Use
  Precise Cursors and as a system cursor.
- The Pencil shows it before a press when neither find_extend nor
  find_redraw (the lookups the press uses, within Edit Selected Paths)
  finds a selected path under the pointer. Over such a path and while a
  stroke is drawn, the cursor has no star.

Docs: docs/target-app-parity.md.
2026-10-26 09:09:46 +07:00
Taha-Mahmoodi 0dc9d9abb4 Fix #1732: Transform Each opens on the values it was last confirmed with and has a Copy button
Squashed from #4175 onto main.
2026-10-26 09:09:46 +07:00
dotCooCoo 3d8c40f500 Eraser: Angle and Roundness in Eraser Tool Options shape the tip
Squashed from #4180 onto main.
2026-10-26 09:09:46 +07:00
dotCooCoo 7117c82cab Brushes: Art Brush Options' Width can follow the pen pressure
Art Brush Options' Width had no pen tablet option, so an art brush
drew at one width whatever the pressure. The Width row now has a
Fixed or Pressure menu and a second width. With Pressure the art is
Width wide at the lightest pen pressure and the second width at the
heaviest, following the pressure the Paintbrush recorded along the
stroke, and half way between the two on a stroke drawn without
pressure. brush.options takes width_mode and width_max; a brush
without them is saved as before.
2026-10-26 09:09:46 +07:00
dotCooCoo 60cb4c45ab Pencil: Live curve fitting in Pencil Tool Options
Pencil Tool Options has a Live curve fitting checkbox, on by default.
With it off, the path shown while a Pencil stroke is drawn joins the
stroke's points with straight segments, and the release fits the curve
at the Fidelity, as it does with the option on. Choosing another tool
while a stroke is drawn also keeps the stroke fitted. The option is
saved with the tool's other options.

path.freehand takes fit (true by default): with fit false, a new path,
a continued path and a redrawn section join the points with straight
segments.
2026-10-26 09:09:46 +07:00
bflatastic a8cc7b8f72 Dialog field-list tests use fields the Move dialog reads (#4049 refuses the others) 2026-10-26 09:09:46 +07:00
dotCooCoo 9f358a1d6d MCP: answer_dialog sets the fields of the app's open dialog and confirms or cancels it
Squashed from #4057 onto main.
2026-10-26 09:09:46 +07:00
dotCooCoo 8c67ade824 Dialogs: Move runs with a Distance and Angle set before its next frame
Move opened without Distance and Angle, so its first frame replaced the
values a control client set with ones computed from Horizontal and
Vertical, and OK read Horizontal and Vertical without the Distance and
Angle set since the last frame. Move now opens holding the Distance and
Angle of its offset, and OK applies a Distance and Angle set since the
last frame.
2026-10-26 09:09:45 +07:00
dotCooCoo fd4c187ab5 Image Trace: settings that wait stay with their object when a plain image is selected
With Preview off, selecting a plain image after an Image Trace object
kept the panel on that object without saving its waiting settings. A
trace of the image then made the image's trace the panel's object, and
selecting the first object again showed its stored settings and lost the
change. The panel now keeps the waiting settings for the object it
leaves whatever is selected next.
2026-10-26 09:09:45 +07:00
dotCooCoo 2bbbdafc63 Image Trace: the eye button's hold ends on release, and the panel uses any selected trace or image
Squashed from #4076 onto main.
2026-10-26 09:09:45 +07:00
dotCooCoo eadf7674f1 MCP: screenshot and render_preview can draw the Image Trace view
After imageTrace.setView, screenshot and render_preview still drew the
tracing result, because ui.render renders with the export options and only
the canvas turns on trace views. Only the app window showed the view.

ui.render now takes traceViews. With traceViews: true, Image Trace objects
draw in the view set with imageTrace.setView, as on the canvas, both
headless and in the running app. screenshot and render_preview take
traceViews and pass it on; without it they draw the tracing result, as
exports do. The trace-and-style prompt names the argument.

A supersampled render drew Outline view's lines, type outlines and dotted
guides as little as a quarter of an output pixel wide, so they came out
pale gray. The renderer now scales those widths and the guides' dashes by
the supersampling factor in the larger frame, so the lines stay one output
pixel wide.

Docs: docs/mcp.md (render_preview, screenshot), docs/control-protocol.md
(ui.render).
2026-10-26 09:09:45 +07:00
dotCooCoo 0641412cce Dialogs: ui.dialog.set returns an error for a field the open dialog does not read
ui.dialog.set stored any field name it was given, so a misspelled field
(`discrad` for `discard`) was kept without effect and the dialog then
ran with its old value. It now answers such a field with an error that
lists the dialog's fields, and leaves the dialog unchanged.

A dialog accepts the fields it holds, `__` fields, `discard` with a
discard button, `preview` with a live preview, the fields it reads
before a control adds them (each spec's `inputs`, for example Copy and
the object options of the Transform dialogs, Move's `distance` and
`angle`, the reference point, `path` of the export options dialogs,
`searchFolder`, Brush Options' `tips`, the Justification and
Hyphenation values that open blank, the Corners `kind` and `radius` of
corners that differ, the Gradient Stop popover's `color`, `opacity`,
`location` and `spread`, and a new artboard's `color` and display
marks), and the fields it passes to the command it runs: every
parameter of the generic `command` dialog's command, and the
`textureImage` that Load Texture… sets in the Glass and Texturizer
effects. Edit Selection now opens holding `deleted<i>` for each of its
rows, so setting a row number it does not have returns an error, and
Transparency Flattener Presets opens holding the selected preset's name
and options instead of adding them on its first frame.
2026-10-26 09:09:45 +07:00
dotCooCoo 3eda1b128c Image Trace: changes that wait with Preview off stay with their object
With Preview off, changes made in the Image Trace panel for one Image
Trace object were lost when another object was selected: selecting the
first object again showed its stored settings. The panel now keeps the
waiting changes for each object and shows them again when that object
is selected, unless the object's own settings changed in the meantime.
When Preview was turned on while another object was selected, the
object is traced with its changes when it is selected again.

Preview is now the UI command imageTrace.preview ({on?}: on, off or
toggle), and both the panel's checkbox and ui.set's imageTracePreview
run it. The command label has a row in every catalog.
2026-10-26 09:09:45 +07:00
Davit MatchakhelidzeandClaude Opus 5.5 5e68d5891c i18n(ka): shorter wording for labels that were cut off
Decided in the native-speaker review of the screens (all-t01).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF
2026-10-26 09:09:44 +07:00
Dylan M. Taylor 46ece73197 lint: method references and elided const lifetimes (S1612, S8863) (#4204)
Use function paths where a closure only forwarded its argument
(PoisonError::into_inner, OsStr::to_str, FindRange::is_empty), and drop
redundant 'static on associated and module consts. No behaviour change.
2026-10-25 22:08:44 -04:00
dotCooCoo bb45038617 Character: Character Direction is off at a caret with no characters selected
With the Type tool at a caret and no characters selected, choosing an
item in the Character panel menu's Character Direction submenu set the
direction of every character in the type object. The three items are now
disabled until characters are selected.
2026-10-26 08:18:23 +07:00
dotCooCoo 3088b6dc99 Appearance: Add New Fill and Add New Stroke are off with nothing selected
With nothing selected, Cmd+/ and Cmd+Alt+/ ran the commands, which put
"select objects or give ids" in the status bar, and the command palette
listed both as available. Without ids and without an Appearance panel
subject (a targeted layer, group or object, or a selected one), the two
commands are now off in menus and the palette, as the panel's buttons
are, and their keys run nothing. Called with ids, they still add to those
objects.
2026-10-26 08:18:22 +07:00
Dylan M. Taylor caef923806 feat: startup update prompt modal and direct self-updating (#4138)
* feat: startup update prompt modal and direct self-updating

The update flow (check at start or on request, the startup prompt, the self-update worker) is craft-update's Updater; the app only supplies the suite, its close path and its status window. The check at start is opt-in for the desktop app, and the Windows update helper runs before argument parsing.

Ref: storytold/craft-libs#319

* refactor(updates): hold the install back while documents are unsaved

* fix(updates): drop the manual window's custom id; pin craft-update to craft-libs main (db19c37)

* fix(updates): address review feedback

Wake the UI when a manual check is queued from a menu callback; the update prompt owns the keyboard while it is open (LightCraft); Download opens through the desktop URL hook (FilmCraft); the Help menu dispatches through menus::invoke (FigCraft); print jobs and comment drafts hold an install back (WordCraft); Check for Updates is a registered command (GridCraft); an install holds back while documents are unsaved.

* fix(updates): localize the update status messages

* build: resolve the craft-update pin after rebasing
2026-10-25 16:22:52 -04:00
aiongg 714434527e Docking: panels on craft-ui's shared docking, floating panels in OS windows (#4135)
* Build: craft-libs at 2869b8cc

Pin craft-pdf, craft-print, craft-docpath, craft-ui, craft-keymap,
craft-window and the patched hayro/krilla backends to craft-libs
2869b8cc1077530bd07a7e192fb2b0e1304a1354, with the pdf-deps gate,
NOTICE, ASSETS.md and docs/pdf-backend.md at the same revision.

PDF: no modification date beyond the creation date, DeviceN images
are not JPEG-encoded, and clipping text draws nothing (its outlines
arrive as a clip path).

* Docking: compile against craft-ui at 2869b8cc

Floating windows are trees of groups: window_panels and window_active
read one as a flat group, and windows rebuilt from the legacy groups
keep their ids. Unknown dock actions are rejected, the new ones are
checked like the old, and every panel a close action removes keeps its
return location.

* Docking: panels and canvas on craft-ui's docking area

* Docking: tests for the dock area, flyouts, floating panels and the Tools panel

* Docking: catalogs without the old dock's strings

* Build: craft-libs at 8a503cfe

* Docking: floating panels in OS windows of their own on the desktop

* Docking: modal dialogs block panel windows; their keys and dropped files reach the main window

* Docking: art dragged onto a panel in its own window drops there

* Docking: module doc names the OS windows

* Build: craft-libs at a042cf26

* Docking: onto, above, below, collapsed, icon and column places on Float and Dock Panel; ui.docking

* Docking: command descriptions of Float, Dock, Move and Collapse Panel for the craft-ui layout

* Docking: control protocol describes the craft-ui layout, its commands and ui.docking

* Docking: rustfmt

* Docking: layouts saved before the canvas joined convert on load

Saved ui.json files and workspaces from before the shared layout held the
canvas (a dock-only tree plus floating_panels, docking_icons,
docking_collapsed, dock_collapsed and dock_width) convert into one layout:
the dock tree's groups in the main column, the icon column with the panels
dropped on it, floating groups and sets, sets docked as columns, collapsed
groups, the dock width and the places of closed panels. The legacy fields
are read, never written. A ui.json read only in part is copied to
ui.unreadable.json before anything saves over it.

* Docking: catalogs without the old collapse message

* Docking: converted floating sets start at most 720 points tall

* Docking: closed icon panels convert into the icon column; old floating rects, set heights and a copy of the file before conversion

* Build: craft-libs at 27e60765

* Docking: dock column places and icon count from the icon column; a docked column moves to a later place

* Build: craft-libs at d24e4bcc

* Build: craft-libs at 5bbe9f62

* Docs: floating panels in OS windows of their own close the other-monitor gap

* Docking: keys forwarded from a floating panel's OS window run shortcuts while the main window is unfocused
2026-10-25 15:25:35 -04:00
Dylan M. Taylor 6e7854967d Merge pull request #4113 from storytold/codex/egui-037-vectorcraft-20261023
Migrate VectorCraft input, text and capture to egui 0.37
2026-10-25 14:09:31 -04:00
Brandon Thomas f792c63597 Merge pull request #4090 from marcoarnulfo/feat/recolor-picker
Recolor Artwork: double-click a new color to pick it in the Color Picker, in the model it was picked in
2026-10-25 10:56:13 -04:00
Brandon Thomas 70a05ba09b Merge pull request #4068 from dotCooCoo/fix/eps-no-art-central-file-text
EPS: the help text says no central file is written when no art shows
2026-10-25 10:38:12 -04:00