Commit Graph
6373 Commits
Author SHA1 Message Date
bflatastic 536a98d17f Tests: give the covering window its sizing pass 2026-10-29 19:54:33 +07:00
bflatastic 8f5d14c7f7 Format 2026-10-29 19:54:33 +07:00
bflatastic 2c1713e90b Fix #4518: a dialog or floating panel over the canvas hides the pointer from it
The document point under the pointer (Object Highlighting, the rulers' marks, the status bar and the Info panel) was taken wherever the pointer was over the canvas's rectangle, even over a dialog, a floating panel or a menu on top of it, so objects under the Print or Export for Screens dialog lit up as the pointer moved over the dialog. It now takes the same check as the tool's hover (the canvas's own layer under the pointer), except during a drag that began on the canvas.
2026-10-29 19:54:33 +07:00
bflatastic 5438ed12d3 Fix #4542: Edit › Color Settings… and Assign Profile… show the Separations Preview panel
The commands opened the panel as an icon column's flyout, but Separations Preview isn't in an icon column, so the dock dropped the request on the next frame and nothing showed. They now show it the way Window › Separations Preview does (in its group, its remembered place, or floating), and leave it showing when it already does.
2026-10-29 19:21:34 +07:00
el-j 752bbb050d Fix #4567: vertically center numbers and text in input fields
In single-line text and numeric inputs across panels and dialogs, egui
0.37 defaulted TextEdit alignment to Align2::LEFT_TOP, placing the text
galley at the very top of the allocated input box (e.g. 1pt top margin,
11pt bottom margin in 26pt rows).

Align single-line TextEdit instances to Align2::LEFT_CENTER across
recessed_text, opt_field_named (dash/gap cells), hex fields, search
fields, and dialog inputs, matching DesignCraft's vertical centering.
Add regression assertions in look_tests verifying balanced vertical
spacing.
2026-10-29 19:21:33 +07:00
dotCooCoo cdf4453051 Libraries: gradients and patterns can be added to a library and applied from it
Squashed from #4442 onto main.
2026-10-29 19:21:33 +07:00
dotCooCoo c9853094d4 Image Trace: Manage Presets saves, renames and deletes custom tracing presets
Squashed from #4071 onto main.
2026-10-29 19:21:32 +07:00
dotCooCoo e492c4298c Blend: a click picks again when the Blend tool's first pick is gone
Squashed from #4447 onto main.
2026-10-29 19:21:32 +07:00
bflatastic c4d23f4af7 i18n: drop two stale Georgian rows the #4169 squash brought back 2026-10-29 19:21:32 +07:00
Taha-Mahmoodi b41599f657 Fix #3089: a stroked line with an effect expands to a stroked line, then Expand outlines it
Squashed from #4169 onto main.
2026-10-29 18:54:59 +07:00
dotCooCoo 3cfdb58b90 Transparency: pattern editing mode and opacity mask editing can't be entered from each other
Squashed from #4458 onto main.
2026-10-29 18:54:45 +07:00
dotCooCoo c8a7420b93 Place: an image whose pixels can't be read is refused instead of placed blank
Squashed from #4257 onto main.
2026-10-29 18:54:38 +07:00
dotCooCoo e764d770db Image Trace: Document Library fills link to the document's global swatches
Squashed from #4396 onto main.
2026-10-29 18:50:56 +07:00
dotCooCoo 3aebccaf06 Zoom tool: Space held while dragging moves the zoom marquee
Squashed from #4372 onto main.
2026-10-29 18:50:45 +07:00
dotCooCoo 74b408e8da Blend: choosing the Blend tool again finishes the blend
Squashed from #4454 onto main.
2026-10-29 18:50:34 +07:00
dotCooCoo 6fd042e4be Tests: the MCP concurrency, folder search and artboard export tests pass on a loaded machine
Squashed from #4473 onto main.
2026-10-29 18:50:24 +07:00
el-j 31a482bade perf(engine): rerun objects_on_path when dimension refresh mutates artwork 2026-10-29 18:46:48 +07:00
el-j 3e70c38d7b perf(engine): gate post-edit Shaper and Text-Wrap maintenance via edited-root diffing (#4554)
- In `shaper::refresh`, replace full document walks with `changed_shaper_groups`,
  diffing `before` and `after` layers and short-circuiting on pointer-equal (`Arc::ptr_eq`)
  subtrees in O(1).
- Return whether Shaper groups rebuilt or modified artwork (`Result<bool>`),
  allowing `Session::edit` to skip the second `cmd::objects_on_path::refresh`
  call when no artwork was modified.
- In `textwrap::refresh`, check pointer equality on layers against `before.layers`,
  skipping untouched layers in O(1) and checking only modified layers.
2026-10-29 18:46:47 +07:00
ham9zah 0cd82d8d7d Import: the page's type of a right-to-left or turned label is its text object's
A file's PDF part draws a right-to-left paragraph's words in the order
they show ("mm 120.5"), while its text object keeps them in the order
they are typed (" 120.5 mm "). The page's type was matched to the text
objects by their letters in order, so it matched none and stayed beside
the label as a second copy. It is now matched word by word.

A point type label turned a quarter (a vertical dimension's) lay outside
the box its text object was looked for in, which was always level; that
box now runs along the type's baseline.
2026-10-29 18:46:47 +07:00
ham9zah 2dcfbb0bf0 Import: a right-to-left paragraph of the editing data lays out right to left
The text document's paragraph key 33 (from the paragraph or the
document's defaults) said a paragraph runs right to left, but the reader
only used it to swap left and right alignment: the paragraph's direction
stayed unset, so it went by its first strong letter, and a label with no
Arabic or Hebrew letters (" 120.5 mm ") laid out left to right instead of
reading "mm 120.5". The paragraph style now gets that direction.
2026-10-29 18:46:47 +07:00
ham9zah 027884b0a4 Import: read one alternative of versioned content, not two
Versioned content can hold three alternatives: newer files write a
Dimension tool group, the same group again after
`%AI17_Alternate_Content_if_version_gt:…` for a version in between, then
plain art after `%AI17_Alternate_Content`. The reader skipped from the
plain `Alternate_Content` marker only, so the middle alternative was read
as art too and those objects came in twice.

The reader now reads the first alternative and skips from the next one,
whatever its marker, to the end of the block, nested blocks included. A
block that doesn't end is read whole with a note instead of failing the
file. The palette reader tracked alternatives with one flag that a block
nested in an alternative reset; it now tracks the depth.
2026-10-29 18:46:47 +07:00
HassanKhan 1c1ca30a11 Fix #4283: a wheel notch zooms at once without Animated Zoom
Squashed from #4313 onto main.
2026-10-29 18:46:47 +07:00
nevaremandClaude Opus 5.5 87fc61df79 Selection: a selected object's masked art is reached the way a click goes
The check of a selected object's masked art looked at its own place
only. A click goes down from the layer (or the isolated container) and
never reaches a Shaper group's original shapes outside Construction
mode, however deep the object lies in them; and below a layer whose
Preview is off it hits art in outline. A press inside such a path's
fill, or on a path in a Shaper group's hidden shapes, started a move.

The way down to the selected object is now checked as a click goes:
a Shaper group's part a click can't reach on it rules the object out,
and a Preview-off layer on it (below the isolated container) makes the
object count by its outline.

Tests also cover Shift with Direct and Group Selection (a marquee) and
an object a click hits over the masked art (it is selected).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EjfPR4a1jPek7r3nyFFNYv
2026-10-29 18:46:47 +07:00
nevaremandClaude Opus 5.5 f793547a7f Selection: a selected object's masked art counts only where a click reaches it
The selected object itself was checked for being hidden, locked or a
template, but not as a click checks it: a selected guide path was
grabbed where a mask hid it while guides were locked or hidden, though
a click on it there hits nothing.

The selected object now passes the same test a click applies to it
before its art is tried: guides while guides are locked or hidden, and
a Shaper group's hidden part, don't count.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EjfPR4a1jPek7r3nyFFNYv
2026-10-29 18:46:47 +07:00
nevaremandClaude Opus 5.5 6ecea97fdb Selection: a selected group's masked art counts only where a click hits
A selected group was grabbed by any of its contents under the pointer
where an outer mask hides them, including a hidden or locked child and
art the group's own clipping mask leaves out: none of these is drawn or
hit by a click.

A container's art now counts as a click would hit it: its contents as
the hit test tries them, through its own mask and without its hidden,
locked or template contents. The check for locked objects shares it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EjfPR4a1jPek7r3nyFFNYv
2026-10-29 18:46:47 +07:00
nevaremandClaude Opus 5.5 4cd9afe67c Selection: a press where a mask hides a selected object's art grabs it
An image in a clipping mask, picked in the Layers panel, shows its
whole frame, but a press on the part the mask hides hit nothing: the
Selection, Direct Selection and Group Selection tools started a marquee
there, which dropped the selection, so the image could be dragged only
by the part that shows.

Such a press now grabs the selection by that art, as a press on its
visible part does: a drag moves the selected object (the image, not its
clip group) and a click keeps it selected. With nothing of it selected
there, or with Shift, a press there starts a marquee as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EjfPR4a1jPek7r3nyFFNYv
2026-10-29 18:46:47 +07:00
nevaremandClaude Opus 5.5 a7db76bdfb Properties: selected ruler guides show their position in a Transform section
With ruler guides selected on their own (a click on one), the
Properties panel showed the Document sections, so a guide's position
could be typed only in the Transform panel.

The panel now has a Guides heading and a Transform section with the
Transform panel's guide fields (#1597): X moves the vertical guides and
Y the horizontal ones, together. With art selected too, it shows the
art's sections as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EjfPR4a1jPek7r3nyFFNYv
2026-10-29 18:46:47 +07:00
dotCooCoo d93657c631 Object: Hide Unselected Artwork keeps a selected layer's art and groups that hold locked guides
With a layer selected, Object > Hide > Unselected Artwork hid every object
on that layer, since the selected layer was dropped from the objects to
keep. The objects of a selected layer now count as selected.

While Lock Guides is on, a group that held a guide path was hidden whole,
which hid the guide with it. Guide paths now count as selected, so the
command keeps such a group visible and hides its other members one by one.
2026-10-29 18:46:47 +07:00
NetterSilverandClaude Opus 5.5 9c01829cbb Keep Smooth's closed-path start corner within the tolerance
Found while testing crates/pathops/src/edit.rs:342-364 (smooth_level calls smooth_seam after the fit)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 18:46:46 +07:00
bflatastic e962197260 Tests: put the Rearrange Artboards toggle test's comment back on it 2026-10-29 18:46:46 +07:00
Max MittelstädtandGPT-6-Luna 2b75c63431 Retain spacing when rearranging artboards
Fixes #4558

Co-Authored-By: GPT-6-Luna <noreply@openai.com>
2026-10-29 18:45:57 +07:00
dotCooCoo cfdeda35c4 Tests: the non-sRGB Drop Shadow test fails when its child test does not run
svg_darkness_uses_rendered_shadow_in_non_srgb_working_space runs itself
again in a child process with --exact and checked only the exit status.
libtest exits 0 when --exact matches no test, so a rename of the test
would have left the parent passing without running the non-sRGB check.
The parent now also requires "1 passed" in the child's output, as
layout_cache_follows_fonts_added_later in crates/tools does.
2026-10-29 18:45:54 +07:00
Max MittelstädtandGPT-6-Luna 2b37302fe5 Preserve comment markers inside CSS strings
Found while testing crates/svg/src/import/css.rs:346

Co-Authored-By: GPT-6-Luna <noreply@openai.com>
2026-10-29 18:45:51 +07:00
BFlat 5cb5f4514d Merge pull request #4549 from storytold/fix/vietnamese-stacked-marks
Text: keep a letter and its marks in one font when falling back (#4491)
2026-10-29 16:46:24 +07:00
BFlat 0b49023774 Merge pull request #4550 from storytold/fix/pan-fill-test-hermetic
Tests: the pan-fill canvas test runs again when another test moves the placed-document clock
2026-10-29 16:46:05 +07:00
bflatastic e0c92a4d90 Keep a letter and its marks in one font when falling back (#4491) 2026-10-29 16:27:18 +07:00
bflatastic ef086103cc Tests: the pan-fill canvas test runs again when another test moves the placed-document clock 2026-10-29 16:27:12 +07:00
BFlat c8d91d98de Merge pull request #4494 from Silvertree2010/fix/4490-ui-text-field-rounding-behaviour
Round stepper button steps like arrow-key steps
2026-10-29 15:42:12 +07:00
BFlat 8c0c5550ce Merge pull request #4415 from dotCooCoo/feat/shaper-drag-out
Shaper: dragging a shape out of a Shaper Group's bounds takes it out of the group
2026-10-29 15:41:12 +07:00
BFlat 9d747fa241 Merge pull request #4443 from dotCooCoo/fix/direct-fill-drag-keeps-partial-paths
Direct Selection: a drag from a fill moves only the selected anchors of partly selected paths
2026-10-29 15:40:52 +07:00
BFlat 6097cc11a2 Merge pull request #4418 from dotCooCoo/feat/hide-unselected-shortcut
Object: Cmd/Ctrl+Alt+Shift+3 hides every unselected object
2026-10-29 15:40:35 +07:00
NetterSilverandClaude Haiku 5.5 c90cea9e19 Round stepper button steps like arrow-key steps
Fixes #4490

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 15:16:20 +07:00
dotCooCoo a4ca347692 Shaper: dragging a shape out of a Shaper Group's bounds takes it out of the group
Squashed from #4415 onto main.
2026-10-29 15:16:17 +07:00
dotCooCoo b860a7b9af Direct Selection: a drag from a fill moves only the selected anchors of partly selected paths
Squashed from #4443 onto main.
2026-10-29 15:16:11 +07:00
dotCooCoo 6d66eaf3dc Object: Cmd/Ctrl+Alt+Shift+3 hides every unselected object
Squashed from #4418 onto main.
2026-10-29 15:16:05 +07:00
BFlat 20c9b363dd Merge pull request #4537 from nevarem/feat/rectangle-constrain-link
Shapes: the Rectangle and Ellipse dialogs link Width and Height
2026-10-29 15:12:34 +07:00
BFlat 1a9c746924 Merge pull request #4535 from dotCooCoo/fix/drop-shadow-additive-darkness
Drop Shadow: apply Darkness in the source color space
2026-10-29 15:12:15 +07:00
BFlat 001143f6d7 Merge pull request #4534 from dotCooCoo/fix/issue-3161
Fix #2249: macOS converts the canvas from sRGB to the display's profile
2026-10-29 15:11:58 +07:00
BFlat 76d78dda12 Merge pull request #4532 from dotCooCoo/fix/issue-3137
Part of #3137: Color Guide takes its base from colors chosen in Color, Swatches and the Color Picker
2026-10-29 15:11:46 +07:00
BFlat 92ac961719 Merge pull request #4530 from Silvertree2010/fix/h3704-hyphenation-exception-break-poin
Map hyphenation exception break points to the original word's chars
2026-10-29 15:11:35 +07:00