Commit Graph
7062 Commits
Author SHA1 Message Date
BFlat e9c2aa2491 Merge pull request #4974 from storytold/feat/addon-tools-2
Add-ons: Group Overlapping Objects, Divide into Dashes, Save a Timestamped Copy, New Symbols from Layers
2026-11-01 02:58:55 +07:00
bflatastic 68391bdde4 Fix #4926: New Symbols from Layers 2026-11-01 02:44:16 +07:00
bflatastic 916b60898a Fix #4927: Save a Timestamped Copy 2026-11-01 02:44:16 +07:00
bflatastic 9e3f8dccec Fix #4950: Path Precision Tools: Divide into Dashes
addon.pathtools.divideDashes cuts the selected paths (or only their
direct-selected segments) into separate open paths of a dash length
measured along the curve, with an optional gap (gap pieces dropped
unless removeGaps is false) and Fit to Corners and Ends; pieces keep
the path's appearance, one undo step, at most 100000 pieces. Geometry
in vectorcraft-pathops; dialog with unit fields and Preview; tests,
sweep cases, catalog rows and docs.
2026-11-01 02:44:16 +07:00
bflatastic 69985f4998 Fix #4928: Arrange Tools: Group Overlapping Objects
addon.arrange.groupOverlapping groups the selected top-level objects
whose visual bounds overlap or touch, chains included (union-find over a
sweep along x, at most 20000 objects), only within one layer or group.
Each group takes its frontmost member's stacking place; one undo step,
all groups made in one pass over the tree. Menu item, tests, sweep case,
catalog rows and docs.
2026-11-01 02:44:15 +07:00
BFlat a261bce002 Merge pull request #4958 from dotCooCoo/fix/issue-3187
Part of #3187: a gradient mesh made from an ellipse keeps its shape
2026-11-01 02:23:58 +07:00
BFlat 1beb821d39 Merge pull request #4960 from dotCooCoo/feat/caps-lock-crosshair
Cursors: Caps Lock gives the drawing tools the crosshair
2026-11-01 02:23:42 +07:00
bflatastic cf656e2b70 Gradient mesh tests: add_lines_at takes the click tolerance (#4954) 2026-11-01 02:07:08 +07:00
dotCooCoo 23da2fe461 Part of #3187: a gradient mesh made from an ellipse keeps its shape
Create Gradient Mesh and a Mesh tool click estimated each border edge's
handles from the surface's derivatives, so the mesh's border cut across a
curved outline: a 1x1 mesh over a 400 x 300 pt ellipse came out up to
7 pt off it, with corners at its four mesh points. Each border edge now
takes the handles of the cubic that best fits the outline between its
points, and handles where two border edges meet along a side stay
collinear.

Deleting a mesh line (Alt-click with the Mesh tool) joined the two edges
on either side with a straight line, which turned the ellipse's border
into a diamond. The joined edge now keeps the outer handles, grown back
to the length they had before the line split the edge.
2026-11-01 01:59:57 +07:00
dotCooCoo dfd07552c8 Cursors: Caps Lock gives the drawing tools the crosshair
While Caps Lock is on, the tools whose pointer General > Use Precise
Cursors changes show the crosshair, and the saved preference does not
change. The desktop app reads the lock state on macOS, Windows and
Linux X11 and passes each change to the new view.capsLock command. A
change to view.capsLock or usePreciseCursors through app.run refreshes
the canvas pointer. The view.preciseCursors command is labeled Use
Precise Cursors, so command search finds it by the preference's name.
2026-11-01 01:59:54 +07:00
BFlat 1bb52c5b38 Merge pull request #4959 from storytold/feat/text-language
Fix #4940, #4946: text is shaped in its language, with a Language setting per text and Indian languages (#4943)
2026-11-01 01:53:48 +07:00
BFlat 6f26d88ac2 Merge pull request #4957 from storytold/fix/ui-4931-4933-4944-4953
Fix #4931, #4933, #4944, #4953: save version menu, refused-save alert, Contributors header, freeform point swatch
2026-11-01 01:53:32 +07:00
bflatastic 214fca7ca7 Character: apply() sets the font in a helper of its own 2026-11-01 01:39:16 +07:00
bflatastic 2bdaaa8981 Fix #4946: a Language setting per text, with Indian languages (#4943)
Character panel > Language sets the selected characters' language;
text.setFormat and text.setRangeStyle take `language` by name or tag
(unknown: an error), and character styles carry it. Document Setup's
language list gains Hindi, Marathi, Gujarati, Bengali, Punjabi, Tamil,
Telugu, Kannada, Malayalam, Odia and Urdu, with catalog rows; the
Digits menu's numeral names move to a digits context, as Hindi is now
also a language name.
2026-11-01 01:39:16 +07:00
bflatastic a85487ad39 Fix #4940: text is shaped in its language
Characters get a language (CharStyle::language, a BCP 47 tag of one of
Document Setup's languages; none for the default, English: USA, saved
only when set). The shaper sets it on the HarfRust buffer, so fonts use
their language forms (OpenType locl): Turkish keeps fi apart and the dot
on its i. Runs in different languages are shaped apart. New type takes
the document's language.
2026-11-01 01:39:11 +07:00
bflatastic 14c4616202 Fix #4953: the Gradient panel's freeform point swatch opens the point's popover 2026-11-01 01:39:08 +07:00
bflatastic 6caa2f74ef Fix #4944: About › Contributors table keeps its header above the scrolling rows 2026-11-01 01:39:08 +07:00
bflatastic 78d801395a Fix #4933: a save refused before writing shows the Can't save alert 2026-11-01 01:39:08 +07:00
bflatastic 7ad5ee0dff Fix #4931: native Save As Version is a menu of the versions VectorCraft writes 2026-11-01 01:39:08 +07:00
BFlat 0014e4e1f0 Merge pull request #4932 from dotCooCoo/fix/issue-2678
Fix #2678: Ungroup no longer multiplies the group's opacity into its members
2026-11-01 01:32:38 +07:00
BFlat 9d642d9826 Merge pull request #4945 from dotCooCoo/fix/ai-zstd-trailing-zero
.ai import: a Zstandard frame that ends in a zero byte keeps it
2026-11-01 01:32:23 +07:00
BFlat fdc1c41884 Merge pull request #4951 from dotCooCoo/fix/drag-regions-not-tab-stops
Accessibility: Tab no longer stops on window, dialog, panel-grip and ruler drag regions
2026-11-01 01:32:08 +07:00
BFlat 51c3d6e10a Merge pull request #4952 from Silvertree2010/fix/h4981-docsetup-keep-in-range-leaves-na
Replace non-finite type values in DocSetup::keep_in_range
2026-11-01 01:31:52 +07:00
BFlat 77a8b9770b Merge pull request #4954 from dotCooCoo/fix/mesh-locate-edge
Mesh tool: a click on a mesh's edge from just outside adds the lines there
2026-11-01 01:31:40 +07:00
BFlat 769f6c78f2 Merge pull request #4872 from dotCooCoo/fix/count-messages-plural-forms
i18n: package, missing-font, missing-link and CSS counts use plural catalog rows
2026-11-01 01:31:25 +07:00
BFlat 5a24177882 Merge pull request #4812 from dotCooCoo/feat/batch-data-set-file-naming
Actions: Batch names data set files File + Number, File + Data Set Name or Data Set Name
2026-11-01 01:31:08 +07:00
BFlat 0e22a425e0 Merge pull request #4822 from dotCooCoo/feat/open-jpeg2000-files
File formats: JPEG 2000 images open and place
2026-11-01 01:30:52 +07:00
BFlat c25c1a5cda Merge pull request #4809 from dotCooCoo/feat/text-style-options-sections
Character Styles: Style Options edits the name and Basic Character Formats
2026-11-01 01:30:36 +07:00
BFlat bf29743c8d Merge pull request #4825 from dotCooCoo/feat/optical-kerning
Type: Kerning has an Optical option that spaces characters by their shapes
2026-11-01 01:30:20 +07:00
BFlat c8d4845aae Merge pull request #4821 from dotCooCoo/feat/pattern-tile-art
Brushes: each Pattern Brush Options tile can be set to a pattern swatch or None
2026-11-01 01:30:04 +07:00
BFlat f09f5aee5b Merge pull request #4829 from dotCooCoo/feat/delete-brush-asks-first
Brushes: Delete Brush asks first, and Alt-click deletes unused brushes without asking
2026-11-01 01:29:48 +07:00
BFlat d150f9b5b3 Merge pull request #4849 from dotCooCoo/feat/lock-commands-in-isolation
Isolation mode: Lock, Unlock All, Hide and Show All work on the isolated art
2026-11-01 01:29:32 +07:00
BFlat b9819cfd13 Merge pull request #4854 from dotCooCoo/feat/taskbar-shape-properties
Contextual Task Bar: a basic shape shows its properties in place of Lock
2026-11-01 01:29:17 +07:00
BFlat 0d2eeaddcc Merge pull request #4860 from dotCooCoo/feat/delete-symbol-asks-first
Symbols: Delete Symbol asks first, and Alt-click deletes an unused symbol without asking
2026-11-01 01:29:01 +07:00
BFlat 87fbb92698 Merge pull request #4861 from dotCooCoo/fix/eyedropper-sample-pattern-mesh-image
Eyedropper: Shift-click samples the color of a pattern or gradient mesh
2026-11-01 01:28:46 +07:00
BFlat 3b32ab39ba Merge pull request #4862 from dotCooCoo/feat/intertwine-arrange-menu
Intertwine: a right-click where three or more objects overlap arranges the nearest one
2026-11-01 01:28:30 +07:00
BFlat 19dad26e7a Merge pull request #4865 from dotCooCoo/fix/ai-type-from-text-document
.ai import: type comes from the text document alone when every shown story reads
2026-11-01 01:28:14 +07:00
BFlat 8492308e14 Merge pull request #4813 from dotCooCoo/feat/colorize-gray-images-svg-eps
Images: SVG and EPS export write colorized grayscale and 1-bit images in their fill color
2026-11-01 01:27:59 +07:00
BFlat a3c53968aa Merge pull request #4783 from dotCooCoo/fix/pdf-eps-pattern-image-flatten
PDF/EPS export: see-through and colorized pattern tile images are flattened
2026-11-01 01:27:48 +07:00
dotCooCoo db6c5ea9df Fix #2678: Ungroup no longer multiplies the group's opacity into its members
Ungroup multiplied each member's opacity by the group's, so a member of a
50% group stayed at 50% after the group was gone, and members that
overlapped showed through each other. Each member now keeps its own
opacity, and the group's opacity is removed with the group.
2026-11-01 01:22:08 +07:00
dotCooCoo d2d4315524 .ai import: a Zstandard frame that ends in a zero byte keeps it
The reader cut every trailing zero byte off the Zstandard editing data
before decoding it, to drop the padding after the last frame. A frame can
end in a zero byte itself (a raw or RLE block, or a checksum whose last
byte is zero), and cutting it left the frame short, so the file failed to
open with "its Zstandard compression is damaged". The reader now decodes
frame after frame and stops when only zeros are left.
2026-11-01 01:22:08 +07:00
dotCooCoo d2418d6e7a Accessibility: Tab no longer stops on window, dialog, panel-grip and ruler drag regions
Regions that only the pointer uses were made with Sense::drag() or
Sense::click_and_drag(), which egui makes focusable, so Tab stopped on
each of them and no key acted there. They now sense drags (and clicks
where they use them) without taking the keyboard focus: the custom
title bar's background and the window's resize zones, the band that
moves a dialog, the Tools panel's grip, a flyout's and a floating
strip's tear-off bar, the isolation bar's background, and the rulers
and their origin box. Their pointer behavior is unchanged, and the grip
and tear-off bars keep their screen-reader names.

Each region has a test that tabs through its UI and fails without the
change.
2026-11-01 01:22:08 +07:00
NetterSilverandClaude Haiku 5.5 34563945a1 Replace non-finite type values in DocSetup::keep_in_range
Found while testing crates/doc/src/setup.rs:308-316 (keep_in_range)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 01:22:08 +07:00
dotCooCoo fc820cc066 Mesh: no edge search for a lookup without tolerance 2026-11-01 01:22:08 +07:00
dotCooCoo c6644c15cb i18n: French linked-image count forms keep the no-break space before ? 2026-11-01 01:22:08 +07:00
dotCooCoo c1205c4017 Mesh: a point outside the mesh locates on the nearest boundary edge
locate_within maps a point outside the outline to the nearest point of the outer edges, so a patch folded past the outline does not take an edge click as an interior one.
2026-11-01 01:22:08 +07:00
dotCooCoo 5a5a7b9ce8 Mesh tool: a click on a mesh's edge from just outside adds the lines there
A Mesh tool click within the hit tolerance outside a gradient mesh hit the
mesh, but object.mesh.addLine looked for the point inside the outline only
and failed with "point is outside the mesh". The same click on a path's edge
made a 1x1 mesh without the line.

- GradientMesh::locate_within takes a tolerance: a point outside the mesh
  within it of the outline gives the nearest point of the edge.
- object.mesh.addLine and object.mesh.create take an optional `tolerance`
  (0 by default), and the Mesh tool sends its hit tolerance.
2026-11-01 01:22:08 +07:00
dotCooCoo 6f8e0294ff i18n: a package status with a note names the folder last, so a folder name with parentheses keeps it whole after a language switch
A package status with a note, such as "Packaged 1 file in /out/card (draft) (fonts not copied: Mono)", was translated after a language switch as if the folder ended at its first " (", so German showed "1 Datei in /out/card verpackt (draft) ...". The English status now puts the note before the folder ("Packaged 1 file (fonts not copied: Mono) in /out/card (draft)"), and each catalog's @msgplural row for it reads the folder as the rest of the line after ") in ".
2026-11-01 01:22:07 +07:00
dotCooCoo 62401182e6 i18n: an English package status is translated after a language switch, in each language's plural form
The package status now says "file" or "files", and the catalogs' `@msg`
rows for it still matched only the old "file(s)" text, so a status
written in English stayed in English after a switch to another
language.

- Catalogs take a new `@msgplural` row: the English one|other forms as
  the source and the language's plural forms as the translation. The
  `{n}` value picks the form, so Czech shows "Zabaleny 3 soubory" for 3
  files and "Zabaleno 5 souborů" for 5.
- Every catalog replaces its four package status rows with `@msgplural`
  rows. The row for a status with a note finds the note by its opening
  parenthesis, so a folder name with spaces stays whole.
- `package_status` builds the status line for the folder and the web
  download.
2026-11-01 01:22:07 +07:00
dotCooCoo 28014a9fed i18n: French one-item count forms keep the no-break space before ? and : 2026-11-01 01:22:07 +07:00