Commit Graph
8248 Commits
Author SHA1 Message Date
dotCooCoo 83f5b7eead OpenType: a menu choice at a Type tool caret reaches every character
At a caret the panel sends text.setRangeStyle with no range, which
styles all of the text, but the check that skips a choice that changes
nothing read only the insertion style. When the characters at the caret
already had the chosen feature and others did not, the choice did
nothing. The check now covers every character of the text at a caret,
so the choice applies, and a choice that changes no character still
adds no undo step.
2026-11-04 22:29:18 +07:00
dotCooCoo e0ebc13a2e Type: right-to-left manual kerning keeps whole-point spacing on both sides
With System Layout on or Fractional Widths off, each advance is rounded
to whole points, but a right-to-left character with manual kerning
still moved by the unrounded kerning value. The difference between the
two changed the space after the character before it in reading order.
The character now moves by the change the kerning makes to its rounded
advance, so only the space before the next character changes.
2026-11-04 22:29:14 +07:00
dotCooCoo 75ba71618a Docs: type-parity lists manual tate-chu-yoko once
The CJK table had an older manual tate-chu-yoko row that still said the
Up/Down and Left/Right settings remain, next to the current row that
lists Tate-chu-yoko Settings as done. The ruby row also said manual
tate-chu-yoko is missing, and a separate row marked ruby as missing.

Remove the older tate-chu-yoko row and the "ruby missing" row, and
leave the ruby row about ruby only.
2026-11-04 22:29:11 +07:00
BFlat 6b66f1d75f Merge pull request #5627 from dotCooCoo/fix/plural-message-count-backtrack
i18n: a count in a translated message matches only a number
2026-11-04 22:25:16 +07:00
BFlat d7820bde59 Merge pull request #5626 from dotCooCoo/fix/edit-layer-nested-save
Symbols: saving leaves out a nested editing layer and keeps layers named in file data
2026-11-04 22:24:58 +07:00
BFlat 9602a422df Merge pull request #5625 from dotCooCoo/fix/quick-bounds-nine-slice
Symbols: the quick box of a 9-slice instance holds art its guides move
2026-11-04 22:24:41 +07:00
BFlat 240fc57daf Merge pull request #5623 from mockydevs/fix/export-artboards-5502
Fix #5502: Export As PNG exports the active artboard, not always the first
2026-11-04 22:24:24 +07:00
BFlat 98f0ab78f1 Merge pull request #5621 from dotCooCoo/fix/perceptual-pdf-shading-docs
Gradient: PDF shading notes name linear and radial gradients and DeviceN
2026-11-04 22:24:07 +07:00
BFlat dd1786a42b Merge pull request #5620 from dotCooCoo/fix/upright-vertical-baseline-shift
Type: baseline shift moves an upright glyph across the column in vertical type
2026-11-04 22:23:49 +07:00
BFlat c605283f80 Merge pull request #5619 from dotCooCoo/fix/touch-type-upright-vertical-move
Type: Touch Type moves an upright character in vertical type down and across its column
2026-11-04 22:23:33 +07:00
BFlat 9ab54db91a Merge pull request #5618 from dotCooCoo/fix/perceptual-ink-mix-fallback
Gradient: Perceptual spot ink mixes stay continuous from red to blue
2026-11-04 22:23:17 +07:00
dotCooCoo a574139814 i18n: a count in a translated message matches only a number
A plural status message such as "Saved {path} with {n} note: {first}"
matched a path that holds " with " by taking the first split, so for
"/out/art with notes.pdf" the count became "notes.pdf with 1". The
count did not parse, the translation took the plural form and split
the path.

The {n} of a @msgplural template now matches only a number, and the
matcher tries the next split when it does not. {n} in a @msg template
still matches any text, since those name brushes, symbols and presets.
2026-11-04 21:59:15 +07:00
dotCooCoo 32456839eb Native format: a saved mask-editing id drops only a top-level layer
Files saved mid-edit by older versions carry the opacity-mask editing
layer at the top level. An id there that names a sublayer is ignored on
load, so that sublayer and its art are kept.
2026-11-04 21:59:11 +07:00
dotCooCoo 9992fa0bf6 Symbols: saving leaves out a nested editing layer and keeps layers named in file data
Leaving opacity-mask or symbol editing now removes the editing layer
wherever it is, so a save or export after Layers moved it into another
layer no longer writes it. An editing id that names anything other than
a layer is left alone.

symbol_edit is no longer read from files: a value in file data is
dropped on load, so the layer it names is kept and saving does not
write the value again.
2026-11-04 21:59:11 +07:00
dotCooCoo 9dc172a26d Symbols: the quick box of a 9-slice instance holds art its guides move
An object in 9-slice art that crosses a guide and draws symbol art is
placed by the map of the cell its center is in, so it can draw outside
the instance's transformed art box. Bounds measured without placing the
art (the renderer's culling, and placements past the object limit) used
that box alone, so the displaced art could be culled and not drawn.

The fallback now takes in the art box placed by each of the nine cells'
maps (NineSliceMap::placement_bounds), grown by the art's reach as
before.
2026-11-04 21:59:07 +07:00
Don Omondi ef5a4d967a Fix #5502: Export As PNG exports the active artboard, not always the first
File > Export > Export As PNG... opened PNG Options with no artboard
chosen, and a single-image export without one writes the first
artboard, whichever was in use. With no artboard choice given, it now
takes the active artboard, or each artboard the Artboard tool has
selected (one file each). A choice the caller gives is kept.
2026-11-04 21:59:04 +07:00
dotCooCoo 204b57e046 Docs: American spelling in the PDF shading notes 2026-11-04 21:58:59 +07:00
dotCooCoo eb03e8943f Gradient: PDF shading notes name linear and radial gradients and DeviceN
The PDF writer writes a spot gradient as a Separation or DeviceN shading
only when it is linear or radial; freeform gradients and dithered fills
are written as images in process colors.

- `paint.editGradient`'s method help and the Method paragraph in
  docs/mcp.md limit the Perceptual exception to linear and radial
  gradients.
- The Linked gradient stops paragraph in docs/mcp.md no longer says the
  writer has no DeviceN: a gradient mixing spot inks with other spot,
  CMYK or gray inks exports as a DeviceN shading, and only a mix with RGB
  or Lab colors is written in process colors, with a warning.
2026-11-04 21:58:59 +07:00
dotCooCoo d639508a9a Type: baseline shift moves an upright glyph across the column in vertical type
Baseline shift on an upright glyph in vertical type moved it up the column
instead of across it, at any Character Rotation, because the shift was
applied before the glyph was turned upright. The shift is now taken off
before the turn and put back after it, so an upright glyph moves across the
column by the shift as a letter lying on its side does, and still turns
about its shifted pen position.
2026-11-04 21:58:55 +07:00
dotCooCoo a883874a73 Type: Touch Type moves an upright character in vertical type down and across its column
An upright glyph in vertical type has its frame's up axis along its column, parallel to the
line, so Touch Type split no drag or arrow-key nudge into kerning and baseline shift and sent
no movement. Such a glyph now takes the line's cross axis, right of its column, as the way
baseline shift moves it.
2026-11-04 21:58:52 +07:00
dotCooCoo ebbbf29f1e Gradient: Perceptual spot ink mixes stay continuous from red to blue
Mixed in display RGB, red and blue darken past blue's lightness and come
back. The weight search for a Perceptual DeviceN shading then found a
red-side weight for stops near the blue stop, and the inks jumped there.
When the display RGB mix's lightness turns back between two stops, the
inks are mixed at each stop's mix position instead.
2026-11-04 21:58:48 +07:00
BFlat 8890eb9304 Merge pull request #5624 from storytold/fix/font-menu-test-race
Tests: the font menu and idle-socket tests don't fail on a busy machine
2026-11-04 21:56:48 +07:00
BFlat bb0d913d50 Merge pull request #5614 from FractalEncrypt/fix/new-doc-units-per-template
New Document: units belong to the chosen preset, not the whole tab
2026-11-04 21:56:32 +07:00
BFlat ff9c3f585f Merge pull request #5617 from dotCooCoo/fix/angle-rail-set-value
Accessibility: screen readers can set a dialog slider's number
2026-11-04 21:56:14 +07:00
BFlat 6b59723677 Merge pull request #5616 from dotCooCoo/fix/kerning-manual-parentheses
Character: Kerning reads (10+5) with a manual value too
2026-11-04 21:55:58 +07:00
BFlat 55d3588e5c Merge pull request #5615 from dotCooCoo/fix/opening-test-handshake
Tests: the opening queue tests wait on the worker's signal instead of the clock
2026-11-04 21:55:42 +07:00
BFlat 89af74f345 Merge pull request #5613 from mockydevs/fix/huge-font-library-5483
Fix #5483: a large font library no longer keeps the window from opening
2026-11-04 21:55:26 +07:00
bflatastic 292b385a66 Tests: the font menu and idle-socket tests don't fail on a busy machine
type_font_menu_lists_every_available_family compared two reads of Type › Font while a test running alongside could add a font in between, so the menu was rebuilt with one more family. It now judges a run in which the font generation held still.

idle_expiry_closes_without_writing_a_line took a connection reset as a failure; on Windows the server's close of an idle connection can reach the client as one.
2026-11-04 21:46:50 +07:00
FractalEncryptandDevin dc9b2f087f Contributors: credit FractalEncrypt by their GitHub profile name
Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-11-04 21:38:01 +07:00
FractalEncryptandDevin 985ef69cb7 New Document: units belong to the chosen preset, not the whole tab
Choosing units in Preset Details restyled every preset card in the Recent
and Saved tabs, so switching between inches and millimetres rewrote all the
user's templates at once. The pane's options apply to the selected preset
(helpx, "Create and save custom document presets"), so only the chosen card
follows the chosen units now; the others keep the units their document or
preset was made in, and clicking one brings its units back. The built-in
category tabs still show the chosen units (#2078).

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-11-04 21:38:01 +07:00
dotCooCoo 69ef2a4e50 Accessibility: a whole-number dialog slider rounds a set value 2026-11-04 21:37:57 +07:00
dotCooCoo c743662add Accessibility: a set-value request without a number leaves a dialog slider as it is 2026-11-04 21:37:57 +07:00
dotCooCoo 07e598c636 Accessibility: a set value in another unit keeps a number past the rail
A dialog slider whose field shows another unit, such as Transform Each's
Move in millimeters, converted the number back to points and held it to
the rail's range, so a set value past the rail that the field holds came
back as the rail's end.
2026-11-04 21:37:57 +07:00
dotCooCoo d1e69239a7 Accessibility: a set value can reach a field's number past the rail
The range screen readers get for a dialog slider takes in a field's number
past the rail's end, and the set-value action now accepts that range too.
2026-11-04 21:37:57 +07:00
dotCooCoo 0417367532 Accessibility: screen readers can set a dialog slider's number
Dialog sliders and the Blob Brush tip preview offered screen readers only
the increment and decrement actions. They now also offer the set-value
action: the last request in a frame sets the number within the slider's
range, rounded to the places its field shows, and a value that is not a
finite number leaves it as it is.
2026-11-04 21:37:57 +07:00
dotCooCoo 84f528f5bb Character: Kerning reads (10+5) with a manual value too
Kerning read one pair of parentheses around its text only while it
showed an automatic value as (12), so typing (10+5) over a manual value
committed nothing. spin_kerning now reads that pair in both states;
the field still shows parentheses only for an automatic value, and
(10+5)*2 is still refused.
2026-11-04 21:37:54 +07:00
dotCooCoo 21be9e6b6e Tests: the opening queue tests wait on the worker's signal instead of the clock
The opening tests waited 400 or 500 ms of wall-clock time for files read off
the UI thread, and up to 30 s in loops that polled until the queue emptied.
Under load a read could take longer, and
a_file_that_opens_and_asks_holds_back_the_next_one_ready failed.

wait_read now blocks on each pending file's own result channel and keeps the
result for poll, and open_ready waits and then polls once. The background save
in long_operation_busy_while_a_file_opens_or_a_background_save_runs waits with
background::wait_all, and its job waits on the release channel without a
timeout. Shipped code is unchanged.
2026-11-04 21:37:51 +07:00
Don Omondi b8269d7bdf Native menu: read the menus again when the fonts change
On macOS the menu bar is native and is read again only when its state
hash changes. Type > Font now lists the loaded fonts until the installed
ones are scanned, so the hash takes the font generation and whether the
scan has ended. The tests that wait for process-wide generations to
hold still wait for the fonts too.
2026-11-04 21:37:48 +07:00
Don Omondi 0143e0f706 Fix #5483: a large font library no longer keeps the window from opening
The menu bar builds Type > Font in every frame, the first included, and
its family list waited for the scan of every installed font. When that
scan took longer than the 20 s first-frame watchdog (thousands of fonts
on a slow disk, or each file checked by antivirus), the app took the
graphics adapter for hung and started again without it, until none was
left and no window ever showed.

The menu now lists the fonts already loaded until the scan ends, then
all of them (FontDb::menu_family_list_now, installed_fonts_ready).
2026-11-04 21:37:48 +07:00
BFlat 0a311b6d20 Merge pull request #5611 from dotCooCoo/fix/tabs-ctrl-drag-no-op
Tabs: setting the stops a paragraph already has records no undo step
2026-11-04 21:13:40 +07:00
BFlat b1cb969ac9 Merge pull request #5610 from dotCooCoo/fix/appearance-add-params-text
Appearance: Add New Fill and Add New Stroke params text match the code
2026-11-04 21:13:22 +07:00
BFlat 328b4283ab Merge pull request #5609 from dotCooCoo/fix/shape-builder-options-refuses-alpha
Shape Builder Tool Options: a highlight color with an alpha part is refused
2026-11-04 21:13:06 +07:00
BFlat 3013a85faa Merge pull request #5608 from dotCooCoo/fix/escape-binding-after-cancel
Shortcuts: an Escape that cancels a Tools or ruler move runs no Escape command
2026-11-04 21:12:49 +07:00
BFlat d36ef3e436 Merge pull request #5607 from dotCooCoo/fix/package-status-english
i18n: the package status stays English until the status bar shows it
2026-11-04 21:12:33 +07:00
BFlat 33d2784c35 Merge pull request #5606 from dotCooCoo/fix/kerning-optical-check-manual
Type: Kerning menu checks neither method for a manual value
2026-11-04 21:12:15 +07:00
dotCooCoo be52e4e8af Tabs: setting the stops a paragraph already has records no undo step
text.tabs.set and text.tabs.clear return without an edit when every
targeted paragraph already holds the stops. A Ctrl-drag that the 0 pt
bound keeps from moving, or a drag released where it started, no longer
adds an undo step that changes nothing. When one targeted paragraph
holds other stops, the command still sets them all.
2026-11-04 20:51:10 +07:00
dotCooCoo 535d423d6c Appearance: Add New Fill and Add New Stroke params text match the code
appearance.addFill copies the active fill row only when the call has no
`ids`, no `id` and no `target: "contents"`; the params text now names
`id` too. appearance.addStroke gives the new stroke at least 1 pt, so a
0.5 pt top stroke gives a 1 pt stroke; the params text now says so.

Tests pin both: `id` alone leaves the active row alone and puts the new
fill on top, and Add New Stroke on a 0.5 pt stroke adds a 1 pt one.
2026-11-04 20:51:07 +07:00
dotCooCoo 88aeee8f8e Shape Builder Tool Options: a highlight color with an alpha part is refused
OK in Shape Builder Tool Options sent highlightColor to tool.setOption,
which keeps only #rrggbb, so #ff000080 was applied as #ff0000 with no
error. OK now gives the same error as the Live Paint tool options for a
hex color with an alpha part (#rrggbbaa or #rgba), the dialog stays open
and the tool's options do not change. The tool.options params text,
docs/mcp.md and the progress doc say so.
2026-11-04 20:51:03 +07:00
dotCooCoo db6a0d786e Shortcuts: an Escape that cancels a Tools or ruler move runs no Escape command
A command bound to plain Escape no longer runs when that Escape
cancels a floating Tools panel move or a ruler-origin drag, nor on the
key repeats while Escape stays held. The next separate Escape press
runs it as before. A test binds Select None to Escape and holds Escape
through both cancels.
2026-11-04 20:51:00 +07:00
dotCooCoo 49616e0a16 i18n: the package status stays English until the status bar shows it
File > Package stored its status line in the interface language, so after
a language switch the status bar kept the old language, and the control
channel and MCP read a translated message. The status line and its notes
are now English, and only the "Package created" dialog is translated when
it is shown. Each catalog gets message rows for the notes, so the status
bar translates them too. On the desktop, where the dialog names every font
left out, a long font list is cut short in the status line so the line
stays short enough to translate.
2026-11-04 20:50:55 +07:00