Commit Graph
8997 Commits
Author SHA1 Message Date
dotCooCoo 90cd4797ea Graphs: an added or duplicated top row sets the series' stored paint
appearance.addFill, appearance.addStroke and appearance.duplicateItem can
put a new topmost row on a series mark with the paint the mark already
shows. When another mark of the series had set a different stored paint,
the mark's top paint did not change, so the graph kept the other mark's
paint and drew it again. A new topmost visible row now stores its paint,
as an Eyedropper append already does.
2026-11-08 12:01:39 +07:00
dotCooCoo 0ce16936b7 Graphs: docs say a band's stroke opacity is still kept
The Appearance commands do not store a stroke paint or weight for a series
that draws a Filled Lines band, but they do store a stroke opacity set on the
band, and the band's 0.25 pt black outline takes it when the graph is drawn
again. docs/mcp.md now says so, and a test covers it.
2026-11-08 12:01:39 +07:00
dotCooCoo d136ddb0cc Graphs: Appearance commands' params text names the stored opacity
The params text of the Appearance commands that update a series' stored
paint said the graph stores the paint and weight of the topmost visible
fill and stroke. Each of them also stores that row's opacity, as
docs/mcp.md says. The text now names the opacity too.
2026-11-08 12:01:39 +07:00
dotCooCoo 9a08f64a04 Graphs: Appearance commands and the Eyedropper update a series' stored paint
paint.setFill, paint.setStroke, paint.none, Apply Fill to Stroke and Apply
Stroke to Fill stored a series' paint on the graph. appearance.setItem, the
Eyedropper, appearance.transfer, Clear Appearance, Reduce to Basic Appearance
and the add, remove, move and duplicate row commands stored no paint or weight.
An Eyedropper pick of a blue fill at 40% onto a red column drew red at 40%
after the next redraw.

These commands and Show All Hidden Attributes now store the paint and weight
of the topmost visible fill and stroke of a path directly in a series group,
in the same undo step. A color, weight or opacity that a command writes to that
row replaces the stored value even when the mark's own value does not change. A
row that has no paint before and after the command does not change the stored
paint. These commands store no stroke for a series that draws Filled Lines
bands, and a band no longer takes its color from an empty stored stroke.

The stored opacity also comes from the topmost visible row: hiding a top row
stores the row under it, and an opacity set on a hidden top row is not stored.

Follows #5501.
2026-11-08 12:01:39 +07:00
BFlat 5a820855bf Merge pull request #6068 from dotCooCoo/feat/shortcuts-export-text
Keyboard Shortcuts: Export Text saves the shortcut list as a text file
2026-11-08 13:00:56 +08:00
BFlat b99038e6ac Merge pull request #6058 from dotCooCoo/fix/wasm-font-menu-fields
Font menu: the wasm build has no unread wheel-field warnings
2026-11-08 13:00:40 +08:00
BFlat 212ac6191d Merge pull request #6057 from dotCooCoo/fix/pdfx-bleed-warning
PDF export: warn when a PDF/X file leaves out the document's bleed
2026-11-08 13:00:24 +08:00
BFlat 9d430637b5 Merge pull request #6056 from dotCooCoo/fix/tests-without-time-limits
Tests: the shape builder and large edit guards count work instead of timing it
2026-11-08 13:00:08 +08:00
BFlat 9a1ff5e246 Merge pull request #6055 from dotCooCoo/fix/tr-keys-kept
i18n: Turkish error messages keep the parameter keys they name
2026-11-08 12:59:53 +08:00
BFlat f83ef70b5e Merge pull request #6054 from dotCooCoo/fix/open-layout-once
Open: the first frame drawn after the open uses the layouts it made for type objects
2026-11-08 12:59:39 +08:00
BFlat 436faefd83 Merge pull request #6053 from dotCooCoo/fix/wasm-menu-open-import
Menus: the wasm build has no unused import warning for menu_open
2026-11-08 12:59:24 +08:00
BFlat 8388520700 Merge pull request #6051 from dotCooCoo/docs/stroke-outline-line
Docs: the stroke outline reuse line is listed once
2026-11-08 12:59:09 +08:00
BFlat 882bbc2296 Merge pull request #6050 from dotCooCoo/fix/long-popups-scroll
Panels: long swatch, preset and Add New Effect popups scroll inside a short window
2026-11-08 12:58:54 +08:00
BFlat ad2a878dfb Merge pull request #6049 from dotCooCoo/fix/issue-5813
Fix #5813: floating panels hide while a tool group's flyout is open
2026-11-08 12:58:39 +08:00
dotCooCoo 8f16d153e4 Keyboard Shortcuts: Export Text saves the shortcut list as a text file
Edit > Keyboard Shortcuts gains Export Text..., which saves the set shown
in the dialog, as edited so far, as a UTF-8 text file the user names in a
save dialog with a .txt filter. shortcuts.exportText {path?} does the same
for the current set over MCP and the control channel.

The file holds a "Keyboard Shortcuts" line and the set's name, then a
Tools and a Menu Commands section with the rows the dialog lists, in its
order and named as it shows them: the name, a tab and the shortcuts as the
dialog shows them on the current platform. A row with no shortcut ends
after the tab. A path that is not a string, or a file that cannot be
written, returns an error and nothing is written.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-08 11:42:48 +07:00
dotCooCoo 670880f686 Font menu: the wasm build has no unread wheel-field warnings
The queued and replayed wheel events of the font menu are read only by
native-only code (the viewport-layer plugin and the replay loop). Their
fields that only that code reads (frame, menu, position, event and
amount of QueuedWheel, and target of ReplayWheel) and the push that
fills the queue now carry the same cfg(not(target_arch = "wasm32")) as
their readers, so
`cargo check --target wasm32-unknown-unknown -p vectorcraft-ui-egui`
no longer warns that they are never read. Native builds do not change.
2026-11-08 11:42:48 +07:00
dotCooCoo a8a1c82a43 PDF export: warn when a PDF/X file leaves out the document's bleed
Choosing a PDF/X standard without a PDF/X preset writes a file with no bleed
(BleedBox = TrimBox) even when Document Setup sets one, and the export gave no
warning about it. The export now warns when a PDF/X file has no bleed on a side
where the document's bleed has one. The warning comes ahead of the flattening
note, because the status bar shows only the first warning. The code adds a
warning and does not change what is written.

These cases do not warn: the PDF/X presets, Use document bleed settings, a
nonzero bleed on every side the document sets, a document with no bleed, files
that aren't PDF/X files, and Export for Screens rows whose artboards Include
Bleed grows.

The warning has a row in every catalog. The Summary's warning and error rows in
the Save PDF and Print dialogs now go through the catalog, so they show its
translations.
2026-11-08 11:42:47 +07:00
dotCooCoo 500f74b700 Tests: the index read count includes entries read from more than one cell
RectIndex::at notes its reads before it sorts and removes repeats, so an
entry filed under several of the cells a lookup spans counts once per cell.
2026-11-08 11:42:47 +07:00
dotCooCoo d2e58a36a4 i18n: Turkish error messages keep the parameter keys they name
Turkish rows translated backticked parameter keys and command ids, so a
message named a key the command does not accept: `stops` read as
"duraklar", `ids` as "kimlikler", `aspect` as "boyut", and `plugin.list`
as "eklenti.liste". Each of these rows now keeps the key in backticks as
the English has it. The rows that list accepted values ("corner",
"merge", first, previous, next, last, grayscale, websafe, true, false)
keep the values too, and the gradient stop rows read "stop" as a
gradient stop rather than the verb.

Seven Bulgarian rows quoted a placeholder with „“ where the English and
the rest of the catalog use backticks; they now use backticks.

A new test checks that every translated row in every catalog keeps each
backticked span of its English text.
2026-11-08 11:42:46 +07:00
dotCooCoo 003f709eb2 Docs: give the open's kept-layout timings in CPU cycles on current main 2026-11-08 11:42:46 +07:00
dotCooCoo 4cf4ea3a39 Tests: the shape builder and large edit guards count work instead of timing it
The Shape Builder, Live Paint and run_around tests in planar/tests.rs
measured elapsed time against a 5 s limit, and the large edit tests
(large_edits.rs, with the Lock and Hide All Artwork Above and perspective
Alt-drag tests that share `soon`) against 20 s. On a loaded machine they
failed without any change in the code.

- pathops: a test-only counter adds up the items `RectIndex::at` reads
  and the segments `nearest_u` searches. The four planar tests assert a
  bound on that count.
- doc: `tree_walks` counts, per thread, the walks of a document's tree
  that lookups by id make. `soon` fails when a command walks the tree
  more than 64 times, and keeps a 300 s wait for a hang. The tests that
  named a 20 s limit are renamed.

Looking objects up one at a time in Delete or Offset Path, or scanning
the whole index or ring in the planar code, makes these tests fail.
2026-11-08 11:42:46 +07:00
dotCooCoo a18364e2b4 Menus: the wasm build has no unused import warning for menu_open
The only callers of `menus::menu_open` are the native palette-window
code in `panel_docking.rs` and its native tests, so on wasm32 the
re-export and the function were unused and `cargo xtask wasm` printed
two warnings for them. Both now carry `#[cfg(not(target_arch = "wasm32"))]`.
The menu bar still records whether a menu is open on every target.
2026-11-08 11:42:45 +07:00
dotCooCoo f4ccca02d0 Docs: the stroke outline reuse line is listed once
The progress doc listed the moved-path stroke outline reuse twice, once
with the timings first measured and once with the timings measured
against current main. The line with the earlier timings is removed.
2026-11-08 11:42:45 +07:00
dotCooCoo dbcdbf2466 Open: the first frame uses the layouts the open made for type objects
Opening a document laid out every type object for its bounds and
baselines and threw the layouts away, and the first frame laid the same
objects out again. The open now keeps them, up to 128 MiB, and a frame
takes each one once.

A frame takes a layout only for a text object equal to the one laid out,
and only while the fonts, the system fallback setting and the hyphenation
exceptions are unchanged. When the last frame being drawn ends, the rest
are dropped if a frame took one, and all of them are dropped after eight
frames that take none. A layout with bitmap or color glyphs and a text
object with a gradient are not kept.
2026-11-08 11:42:45 +07:00
dotCooCoo e89f917f5e Panels: long swatch, preset and Add Effect popups scroll inside a short window
The gradient swatches menu, the Image Trace button's list of presets, the
Appearance panel's swatch picker and the top level of the Add New Effect
popup (Appearance panel, Properties) had no length limit, so rows past the
bottom of a short window could not be reached. Each now uses menu_scroll.
Items, order and commands do not change, and a list that fits does not
scroll.
2026-11-08 11:42:44 +07:00
dotCooCoo 0b43158fbb Fix #5813: floating panels hide while a tool group's flyout is open
A tool group's flyout and the All Tools drawer draw in the main window,
so a floating panel's OS window covered them. On the desktop, except on
Wayland, floating panels now hide while either one is open, as they do
for a menu or a dialog, and show again when it closes. A flyout or
drawer left set under a hidden toolbar does not draw and does not hide
them.
2026-11-08 11:42:44 +07:00
BFlat e89c036079 Merge pull request #6046 from dotCooCoo/fix/menu-test-font-race
Tests: the Mac menu bar tests do not depend on fonts other tests install
2026-11-08 12:36:55 +08:00
BFlat 6f1b6aa91c Merge pull request #6045 from dotCooCoo/fix/tr-params-row
i18n: the Turkish params and effect errors name their own keys
2026-11-08 12:36:40 +08:00
BFlat d60ec7a808 Merge pull request #6044 from dotCooCoo/fix/paste-many
Paste: skips relinking copies with no renames, global swatches or styles, and finds type in one walk
2026-11-08 12:36:24 +08:00
BFlat 36680d1e02 Merge pull request #6038 from dotCooCoo/fix/issue-5582
Panels: floating panels reopen on the monitor where they were left
2026-11-08 12:36:10 +08:00
BFlat 44b0136554 Merge pull request #6037 from dotCooCoo/fix/delete-empty-check-once
Menus: Delete Empty Artboards' enabled check does not walk the document every frame
2026-11-08 12:35:55 +08:00
BFlat 60303fbe93 Merge pull request #6036 from dotCooCoo/fix/issue-5347
Fix #5347: a floating panel's menu scrolls inside its window
2026-11-08 12:35:40 +08:00
BFlat 2347f968d3 Merge pull request #6034 from dotCooCoo/fix/ai-legacy-break-direction
.ai import: legacy overflow breaks keep the direction and paragraph attributes they were read with
2026-11-08 12:35:25 +08:00
BFlat d9d7c00e41 Merge pull request #6033 from dotCooCoo/fix/dimension-expand-stays-plain
Dimension tool: Expand keeps a dimension as plain art after it moves
2026-11-08 12:35:10 +08:00
BFlat ac11373527 Merge pull request #6032 from dotCooCoo/fix/ai-clip-path-keeps-fill
.ai import: a filled clipping path keeps its fill
2026-11-08 12:34:55 +08:00
BFlat 5ca010d7aa Merge pull request #6030 from dotCooCoo/fix/hex-field-paste
Color fields: a pasted hex code replaces the field's digits
2026-11-08 12:34:39 +08:00
BFlat a0fbeb0c06 Merge pull request #6028 from dotCooCoo/feat/actions-insert-stop
Actions: Insert Stop pauses playback and shows a message
2026-11-08 12:34:24 +08:00
BFlat 9a474f5138 Merge pull request #6024 from dotCooCoo/feat/ai-editing-data-variables
.ai save: the editing copy keeps variables, data sets and bindings
2026-11-08 12:34:08 +08:00
BFlat b63c07c1f9 Merge pull request #6006 from dotCooCoo/fix/ai-brush-art-colors
.ai import: spot colors in a kept brush's art become swatches
2026-11-08 12:33:52 +08:00
BFlat 46057d0453 Merge pull request #5996 from dotCooCoo/fix/ai-type-on-path-options
.ai import: type on a path keeps its effect, alignment and flip
2026-11-08 12:33:38 +08:00
BFlat 06dea5922e Merge pull request #5995 from dotCooCoo/fix/simplify-long-paths
Simplify: fitted curves stay within the tolerance of the path, and serpentines simplify faster
2026-11-08 12:33:23 +08:00
BFlat b019f881d9 Merge pull request #5994 from dotCooCoo/fix/artboard-locked-art-journal
Artboards: duplicate, copy, cut, move and rearrange journal whether locked and hidden art goes
2026-11-08 12:33:12 +08:00
BFlat 427a8a44c5 Merge pull request #5975 from dotCooCoo/fix/ai-reopen-keeps-active-artboard
.ai save: a reopened file opens on the artboard active when it was saved
2026-11-08 12:32:56 +08:00
BFlat 1a46511c5d Merge pull request #5890 from dotCooCoo/feat/execute-checks-params
Engine: execute refuses keys a command doesn't name, in every build
2026-11-08 12:32:40 +08:00
dotCooCoo eb99aaabfd Tests: the Mac menu bar tests do not depend on fonts other tests install
Type › Font and the plug-in rows come from process-wide state, and a test
running alongside can add to them. Two tests read the menus more than once
and compared the reads, so a font added in between failed them:
fonts_that_load_read_the_menus_again adds Vertitest Sans, for one.

every_in_window_item_is_in_the_mac_menu_bar_once now lays out the Mac bar
from the in-window bar it compares it with, so both come from one read.
documents_and_selections_change_state_not_structure changes the document
between its reads, so it runs through undisturbed, which runs it again when
the shortcut, plug-in or font generations change.
2026-11-08 11:22:42 +07:00
dotCooCoo 2af4c12dd3 i18n: the Turkish params and effect errors name their own keys
``params` must be an object` read as "gradyan" and `missing `effect`` read as "isim", the keys of two other rows. Both rows now keep the key in backticks, as the rows next to them do.
2026-11-08 11:22:41 +07:00
dotCooCoo a18fbee3c9 Docs: the paste timing line gives CPU time per paste and undo 2026-11-08 11:22:41 +07:00
dotCooCoo b17a744a9c Panels: floating panels reopen on the monitor where they were left
Squashed from #6038 onto main.
2026-11-08 11:22:40 +07:00
dotCooCoo 2f09d9998e Menus: Delete Empty Artboards' enabled check does not walk the document every frame
The Artboards panel menu asks whether Delete Empty Artboards can run on
every frame while it is open, and each ask measured the document. With
an open path of 200,000 anchors across two artboards, that took 70.4 ms
a frame in a release build.

The answer is now kept per open document with the version of the
document it was measured on, and is measured again when the document
changes. A later frame takes under 0.001 ms. The first frame after an
edit measures once. A change of the selection or the view keeps the
answer.
2026-11-08 11:22:40 +07:00
dotCooCoo 7d8f2a315a Paste: skips relinking when nothing changes and finds pasted type in one walk
A paste relinked every copy to the document's resources even when no
resource had another name or color and the objects linked no graphic
style. It now leaves those copies as they are.

Finding the pasted type looked each id up and compared every text object
with the ones already found. Text commands and the bounds refresh after
a paste now look all ids up in one walk and keep the found ids in a set.
Giving a pasted group new ids builds its map of old to new ids only for
an Objects on Path group, which is the only kind that reads it.

A pasted solid paint with no swatch link and a tint other than 1 now
keeps that tint when no relinking runs. Saved art carries a tint of 1 on
such a paint.
2026-11-08 11:22:40 +07:00