Commit Graph
2026 Commits
Author SHA1 Message Date
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
dotCooCoo c6644c15cb i18n: French linked-image count forms keep the no-break space before ? 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 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 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
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 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 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
dotCooCoo 62555c2246 Contextual Task Bar: a basic shape shows its properties in place of Lock
A live rectangle, rounded rectangle, ellipse or polygon selected with the
Selection tool shows a Shape Properties button where Lock was. It opens a
popup with the shape's rows from the Transform panel, which stays open
while the fields are edited. Every other selection, and the Direct and
Group Selection tools, keep Lock; Object > Lock and Cmd+2 still lock a
shape.

The Transform panel, the Properties panel and the popup draw the rows
through one live_shape_rows function.
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 f4161a3ab7 Symbols: the French delete question keeps the no-break space before ? 2026-11-01 00:37:07 +07:00
dotCooCoo a8b3786f8c Symbols: Delete Symbol asks first, and Alt-click deletes an unused symbol without asking
The Symbols panel's Delete Symbol button and menu item now ask before
deleting. A symbol no instance uses gets "Delete the selected symbol?"
with Yes and No. A symbol with placed instances gets Expand Instances,
which turns the instances into ordinary art, Delete Instances, which
removes them, and Cancel; either Instances button deletes the symbol in
one undo step. Alt-click on the button deletes an unused symbol at once
and still asks about one with instances.

The question is bound to the document it was asked in: once another
document is active, or the symbol is gone, Yes deletes nothing, and a
symbol that gained instances while the question was open gets the
in-use question instead. symbol.delete itself does not ask.

The shared dialog frame takes a Cancel label (DialogSpec::cancel) for
the No button. The new strings have rows in every catalog.
2026-11-01 00:37:07 +07:00
dotCooCoo ec8c1cb8d1 Intertwine: a right-click where three or more objects overlap arranges the nearest one
Squashed from #4862 onto main.
2026-11-01 00:36:29 +07:00
dotCooCoo 6fb9152fa7 Blob Brush: the tip preview test checks that a drag gives it the focus
The test moves the focus to the Roundness field before the drag and
steps the Angle with an arrow key after it, so it fails if a drag stops
giving the preview the keyboard focus.
2026-10-31 23:48:55 +07:00
dotCooCoo 5751dcc293 Blob Brush: the tip preview is a named Angle slider with arrow keys
The tip preview square in the Blob Brush Tool Options set the Angle by a
drag but had no accessible name, no value and no keyboard control.
Screen readers now get it as the Angle slider with the Angle in degrees
as its value. A click or a drag gives it the keyboard focus, and the
arrow keys, Shift with an arrow, Page Up and Page Down, Home and End
step the Angle within -180 to 180 degrees, as the dialog sliders built
on color_slider_stepped do (crates/ui-egui/src/widgets/color.rs). The
new widgets::stepped_area gives a caller-drawn control that slider's
screen-reader node, focus, keys and focus outline.
2026-10-31 23:48:55 +07:00
bflatastic 06043139e6 Fix #4893: New Document saves a preset after More Settings 2026-10-31 22:22:30 +07:00
bflatastic ca0785573d Add-ons: Arrange Tools — Arrange in Grid, Swap, Replace with Top Object, Set Size of Each, Zoom to Selection
A built-in add-on in Object › Plug-ins › Arrange Tools (#4830, #4831, #4832, #4833, #4834):

- addon.arrange.grid lays the top-level selected objects out in rows and
  columns, a row or a column (stacking order from the back, visual bounds,
  each object centred in its cell), from the selection's top-left or
  centred on the artboard.
- addon.arrange.swap swaps two objects' bounds centres, and with `size`
  their widths and heights.
- addon.arrange.replace puts a copy of the topmost selected object centred
  on each of the others, in its stacking place, kept, stretched or fitted
  in proportion; the replaced objects are deleted unless `keep`.
- addon.arrange.size gives each selected object an exact width and/or
  height about a reference point.
- addon.arrange.zoomSelection (a UI command) fits the active view to the
  selection.

Places and sizes are measured as object.setBounds measures them (its
transform, now also available per object), strokes scale as Scale Strokes
& Effects says, each command is one undo step, and Arrange in Grid,
Replace with Top Object and Set Size of Each open previewed dialogs.
Catalog rows, command sweep cases, docs/mcp.md, parity docs and the
ROADMAP progress log.
2026-10-31 22:22:15 +07:00
bflatastic 7a2acbc178 Export for Screens: the dialog is laid out as Illustrator's 2026-10-31 21:43:13 +07:00
bflatastic 54b0c7266c Fix #4826: Artwork Cleanup's Join Point Text stacks one-line type into one object 2026-10-31 20:44:15 +07:00
dotCooCoo b0f6174c37 i18n: Dutch names a brush 'penseel' everywhere, with neuter agreement 2026-10-31 20:44:01 +07:00
bflatastic 672a5342a6 Fix #4817: Properties' Quick Actions has Blend Options for a selected blend with any tool 2026-10-31 19:44:50 +07:00
bflatastic 437280315f Fix #4803: Enter or Escape in a floating panel's field stays in the field 2026-10-31 19:43:17 +07:00
NetterSilverandClaude Haiku 5.5 18709b0b63 Reject multiple leading '#' in the colour panel hex parser
Found while testing crates/ui-egui/src/panels/color.rs:199-205 (parse_hex)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 19:43:17 +07:00
Taha-Mahmoodi 59eb658fd7 Fix #2651: Grid Repeat Options has a Preview checkbox
The grid options' public page lists a Preview option: the repeat on the canvas follows the fields while the dialog is open. Object > Repeat > Options had none, so a change showed only after OK. Now a Grid Repeat's dialog has the checkbox: Cancel puts the original back without a history step, OK keeps the previewed values as one undo step. Radial and Mirror Repeat Options are left as they are, since their public pages list no Preview.
2026-10-31 19:43:16 +07:00
dotCooCoo b13b3260cd Keyboard Shortcuts: a shortcut on the Turkish Q quotation-mark key shows " and runs
Squashed from #4851 onto main.
2026-10-31 19:43:16 +07:00
dotCooCoo f28de75a22 Shortcuts: an exact Shift binding for the typed character wins over a plain binding at Shift+Comma or Shift+Period 2026-10-31 19:43:16 +07:00
dotCooCoo 26173437b9 i18n: Bosnian paint-chip tips name Shift+, and Shift+.
The Bosnian catalog still carried the Color (,) and Gradient (.) rows, which no longer match the toolbar's tips. It now translates Color (, or Shift+,) and Gradient (. or Shift+.) like the other catalogs.
2026-10-31 19:43:16 +07:00
dotCooCoo 64c776af4c Shortcuts: a bound layout candidate for Shift+Period or Shift+Comma wins over the key position 2026-10-31 19:43:16 +07:00
dotCooCoo 55108efef4 Toolbar: the paint-chip tips name Shift+, and Shift+. instead of < and >
The Color and Gradient tips now read "Color (, or Shift+,)" and
"Gradient (. or Shift+.)". The shortcuts follow the key positions, so on
layouts where Shift at those keys types another character the tips name
the keys to press. The 25 catalogs with these rows and the toolbar
accessibility test follow.
2026-10-31 19:43:16 +07:00
dotCooCoo 021fa4a846 Shortcuts: Shift+Comma and Shift+Period follow their key positions only with Shift alone
The key-position match for Shift+Comma and Shift+Period now applies only
when Shift is the only modifier. Cmd/Ctrl+Shift and Alt+Shift presses at
those keys keep their logical key, so the type-size shortcuts on German-like
layouts behave as before. The typing test also checks that no paint command
runs while text is edited.
2026-10-31 19:43:16 +07:00
dotCooCoo 3a7e81e6c3 Appearance: Add New Fill copies the selected fill row right above it
With a fill row selected in the Appearance panel, Add New Fill now
inserts a copy of that row directly above it and selects the new fill.
Rows already above the selected one stay where they are. Before, the
new fill was always a copy of the topmost fill, added at the top.

The selected row belongs to the first selected object. In a mixed
selection, an object that shares that row gets the copy above its own
equal row; an object that does not share it gets a copy of its top
fill on top, as before. With a stroke row selected, or with `ids` or
`target: "contents"`, Add New Fill works as before.

The panel drops rows that were Cmd- or Shift-clicked together when the
active row changes outside the panel, so after Add New Fill (button,
menu or shortcut) only the new fill is selected.
2026-10-31 19:43:15 +07:00
dotCooCoo 1f31b6ed4a Find Font: Change and Change All leave hidden and locked text alone
Squashed from #4852 onto main.
2026-10-31 19:43:15 +07:00
dotCooCoo 2a5e2e8588 Blob Brush: the tip preview draws 0% Roundness as thin as the brush
The Tool Options tip preview floored the short axis at 1% of the long one, while the brush draws 0% Roundness at 0.1%. The preview now uses the same 0.1% minimum, with a test that compares it with the tip the brush draws.
2026-10-31 19:43:15 +07:00
dotCooCoo baaffd63e7 Blob Brush: Tool Options set the brush's Angle and Roundness
Blob Brush Tool Options gain Angle (-180 to 180 degrees, 0 by default)
and Roundness (0 to 100 percent, 100 by default), with a preview of the
tip and three dabs; a drag in the preview square sets the Angle. The
elliptical tip keeps its angle on the page along a stroke, a 0 percent
tip is drawn 0.1 percent as wide as it is long, and Size set to
Pressure still varies its size. path.blob takes angle and roundness,
and both values are kept with the tool's options.

While a non-round tip drags, the Blob Brush shows the outline of the
area it covers with its length label, and an Alt drag that smooths
shows the Smooth tool's thin line.
2026-10-31 19:43:15 +07:00