Commit Graph
7035 Commits
Author SHA1 Message Date
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 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
dotCooCoo 89ca9d9a25 Batch: keep an existing artboard file of a one-artboard Separate Artboards save
A save in the native, template or .ai formats with separateArtboards writes an
artboard file even when the document has one artboard, so an existing file with
that name now gives the data set the next free suffix too.
2026-11-01 01:22:06 +07:00
dotCooCoo 6f0d5f509f i18n: package, missing-font, missing-link and CSS counts use each language's plural forms
The Package status and question, the missing-links note, the Missing Fonts
and Find Linked Files search counts, the modified-links questions, Apply to
All, and the CSS Properties panel's notes no longer use a fixed "(s)" or
plural template. They use the plural rows of each catalog, so "1 linked file
not found" and Czech "Nenalezeny 2 propojené soubory" read correctly.

The searched line is built from two plural phrases, "{n} folder" and
"{n} file", in a "{folders} and {files} searched" frame. Package rows that
joined the note to the folder without a space now keep the space.
2026-11-01 01:22:06 +07:00
dotCooCoo 5dcc65d69a Batch: keep existing artboard files when choosing data set file names
When a step can write one file per artboard (Save in the native, template or
.ai formats, or Export in SVG, EPS, the raster formats, DXF, EMF, WMF or .ai)
and the document has more than one artboard, an existing file with one of the
stem's artboard file names now gives the data set the next free -2, -3 suffix,
as the stem's own file does. Names a data set's outputs will take are also
reserved for the later data sets of the same batch.
2026-11-01 01:22:06 +07:00
dotCooCoo 483c191e24 Batch: keep a backslash in a source file name on Linux and macOS
Destination and Override Save/Export paths reject only the current platform's
path separators, so a folder batch writes `a\b.svg` into the destination
folder on systems where that is one file name.
2026-11-01 01:22:06 +07:00
dotCooCoo c55e4a226e Batch: pass the data set naming choice in the batch run
The naming choice reaches batch_datasets as a field of the run, and the short
Batch entry in docs/mcp.md is back to main's text; the longer Batch section
names datasetFileNaming and when an existing output gets a suffix.
2026-11-01 01:22:06 +07:00
dotCooCoo 1b4c050bd3 Batch: check existing data set outputs only in a folder the batch may read and write
The `-2`, `-3` suffix for a data set output that already exists is now
looked up only when the destination folder and the output path pass the
read and write access checks, so a call cannot learn which files exist in
a folder it may not use.

The lookup uses only extensions of formats the app knows, without path
separators or `..`, and only paths whose parent is the destination folder.
A step whose `format` is unknown keeps its own path instead of being
pointed into the destination folder. A data set or document named `.` or
`..` gets the `Untitled` stem with its three-digit number.
2026-11-01 01:22:06 +07:00
dotCooCoo f8bba3388e Batch: data set files name by File + Number, File + Data Set Name or Data Set Name
The Batch dialog has a File Name choice for a Data Sets source, starting
with File + Number (`source001`), as well as File + Data Set Name
(`source_Alpha`) and Data Set Name (`Alpha`). `action.batch` takes it as
`datasetFileNaming`; a call without it keeps File + Data Set Name, and a
folder source ignores it. An unknown value is an error.

A data set output whose name already exists in the destination folder
now takes the next free `-2`, `-3` suffix instead of replacing the file,
and a Windows device name under Data Set Name gets a trailing `-`.
2026-11-01 01:22:06 +07:00
dotCooCoo 777ad6765c File formats: JPEG 2000 images open and place
File › Open and File › Place read JP2 files and raw JPEG 2000
codestreams (.jpf, .jpx, .jp2, .j2k, .j2c, .jpc) through hayro-jpeg2000,
and store the pixels as PNG. Gray, RGB, CMYK and ICC-tagged images, with
or without alpha, are converted to RGBA. Several codestreams, JPX
composition or layers, other color spaces, inconsistent or oversize
palettes, inconsistent channel definitions, oversize tile grids and
images past the pixel allowance are refused with a message before the
pixels are decoded.

The capture and display resolution boxes size the image: the box that
comes last sets each axis, and an axis without a usable value uses
72 ppi.

IccProfile::to_srgb_into converts a pixel with the cached transform and
no heap allocation.
2026-11-01 01:22:05 +07:00
bflatastic 939af8e255 i18n: one Kerning row per catalog after the Character Styles and Kerning changes 2026-11-01 01:22:05 +07:00
bflatastic 2f1404af22 Optical kerning: shaped advances are read with get() 2026-11-01 01:22:04 +07:00
dotCooCoo 14100bfab2 Character Styles: Style Options edits the name and Basic Character Formats
Squashed from #4809 onto main.
2026-11-01 01:22:04 +07:00
dotCooCoo 9896f633da Type: Kerning has an Optical option that spaces characters by their shapes
Squashed from #4825 onto main.
2026-11-01 01:22:04 +07:00
dotCooCoo 012af4fd49 Brushes: each Pattern Brush Options tile can be set to a pattern swatch or None
A menu under each of the five tiles in Pattern Brush Options lists None,
Original and the document's pattern swatches; the corner menus keep the
four automatic corners. A swatch choice copies the swatch's whole art and
its tile frame into the brush, so the brush keeps drawing after the swatch
is deleted, and the menu then shows that art as Original. Side cannot be
None: OK shows "You must choose a side pattern." and keeps the dialog open.

brush.options takes side_tile, outer_corner_tile, inner_corner_tile,
start_tile and end_tile (a pattern name, none, original, the corner auto
ids, or {"pattern": name} for a swatch named like one of those words), and
rejects side_tile "none" and unknown names before editing.
2026-11-01 01:22:03 +07:00
bflatastic 34d58c1bfb i18n: one row per catalog entry after #4829 2026-11-01 01:22:03 +07:00
dotCooCoo beac4504fc Brushes: the French delete questions keep the no-break space before ? 2026-11-01 01:21:54 +07:00
dotCooCoo bb56345290 Brushes: the Delete Brush question deletes nothing once another document is active
The question records the document it was opened for. If another document has become the active one by the time it is confirmed, it closes as Cancel does.
2026-11-01 01:21:54 +07:00
dotCooCoo 3a6770e784 Brushes: Yes in Delete Brush asks again when a stroke started using a brush meanwhile
The question for unused brushes checks again when Yes is chosen. If a stroke uses one of the brushes by then, the dialog asks with Remove Strokes and Cancel instead of deleting.
2026-11-01 01:21:54 +07:00
dotCooCoo 3937473e54 Brushes: the Delete Brush question for brushes in use no longer mentions expanding strokes
The dialog offers Remove Strokes and Cancel, so the question asks only about taking the brushes off the strokes. Both questions are reworded in every catalog.
2026-11-01 01:21:54 +07:00
dotCooCoo b1aa576764 Brushes: Delete Brush asks Yes or No for unused brushes, and Remove Strokes or Cancel for brushes in use
The question for brushes no stroke uses reads "Delete the brush selection?" with Yes and No, from the bottom button and the panel menu, and Alt-click (Option-click on macOS) on the button still deletes them without asking. When a stroke uses one of the brushes, the button, Alt-click and the menu item ask with Remove Strokes and Cancel; Remove Strokes deletes the brushes and the strokes that used them become plain strokes.

brush.unused also counts the tile that pattern editing's Cancel puts back, which brush.delete already clears, so the panel asks the in-use question for a brush only that tile uses.
2026-11-01 01:21:54 +07:00
dotCooCoo 79188b3593 Brushes: the Delete Brush prompt for several brushes uses each language's plural forms
The confirmation for several brushes now goes through i18n::tn, as the
Graphic Styles prompt does, and each catalog gives the count-dependent
forms in an @plural row.
2026-11-01 01:21:54 +07:00
dotCooCoo 90f9907de9 Brushes: Alt-click Delete Brush runs through the shared command helper 2026-11-01 01:21:54 +07:00
dotCooCoo 49290fa8e6 Brushes: Delete Brush asks first, and Alt-click deletes without asking
The Brushes panel's Delete Brush button and its panel menu item now ask
before deleting the selected brushes, as Swatches and Graphic Styles do.
OK deletes them in one undo step and strokes that used them become plain
strokes; Cancel leaves the document unchanged. Alt-click (Option-click on
macOS) on the button deletes without asking. The brush.delete command
still deletes at once.
2026-11-01 01:21:54 +07:00
bflatastic 19b4fc8d43 Canvas tests: the isolation-mode Lock test uses plain paths, as the task bar shows Lock for them 2026-11-01 01:21:53 +07:00
dotCooCoo f1a6a9ff67 Contextual Task Bar: the Shape Properties popup stays open for its Corner dropdown
Opening a polygon's Corner dropdown closed the Shape Properties popup,
so no corner type could be picked from it. The popup now uses
widgets::popover, which keeps it open while its dropdowns are open.
2026-11-01 01:21:53 +07:00
bflatastic 9badc6bae7 i18n: one row per catalog entry after #4860 2026-11-01 01:21:53 +07:00
dotCooCoo b46cdc4e4d Isolation mode: Lock, Unlock All, Hide and Show All work on the isolated art
Squashed from #4849 onto main.
2026-11-01 01:21:53 +07:00
dotCooCoo 5a00238a0c Docs: describe the Shape Properties overview line in our own words
The evidence line for the Shape Properties button quoted the reference
app's overview. It now paraphrases it and keeps the citation.
2026-11-01 01:21:53 +07:00