9823 Commits
Author SHA1 Message Date
David Mann eb3b17b765 Merge pull request #10730 from Lcoding15/fix/typing-records-one-step
Actions: typed text records as one step; Batch says which files failed (#10113, #10682)
2026-11-07 12:16:19 +01:00
David Mann eaba29cbd5 Merge pull request #11862 from yoriswind/codex/eyedropper-layer-mask-11752
Sample the targeted layer mask with the Eyedropper
2026-11-07 12:11:57 +01:00
David Mann 1cc2e08acd Merge pull request #11865 from yoriswind/codex/note-show-on-new-11792
Show notes after creating one with the Note tool
2026-11-07 12:11:36 +01:00
David Mann 8548ed57a1 Merge pull request #11851 from DuBearte/fix/11771-count-delete-group-first
fix(engine): deleting the current count group makes the first group current (#11771)
2026-11-07 12:11:15 +01:00
David Mann 83eaf7c0bc Merge pull request #11847 from hnoerenberg/fix/pressure-size-default-off-11809
fix(paint): Pressure for Size starts off, as the reference does
2026-11-07 12:10:48 +01:00
David Mann 99f70bfe9b Merge pull request #11841 from DuBearte/fix/11788-note-delete-key
fix(ui): Delete with a note selected asks to delete the note, not the layer (#11788)
2026-11-07 12:09:36 +01:00
David Mann 9ba029129e Merge pull request #11540 from TrevorBrown-dev/feat/move-options-bar-distribute-gear-11381
feat(move): options bar gets Distribute buttons, the ... icon panel and the gear menu (#11381)
2026-11-07 11:57:35 +01:00
David Mann 7f7badcdc4 Merge pull request #11692 from RickiNano/fix/magnetic-lasso-right-click-11689
Magnetic Lasso: a right-click while drawing opens no menu (#11689)
2026-11-07 11:57:00 +01:00
David Mann 339adcb7bc Merge pull request #11322 from Saloouu/fix/toolbar-groups-survive-restart
Toolbar slots and tool keys keep their last tool across launches (#3569)
2026-11-07 11:55:58 +01:00
yoriswind d40d8a5278 Document the Eyedropper sample and mask fixture 2026-11-07 01:19:26 -08:00
yoriswind c2ce77df77 Keep the Eyedropper mask fix within the click sampling scope 2026-11-07 01:06:13 -08:00
yoriswind 2fffb10386 Test denied note creation through the pointer handler 2026-11-07 00:46:06 -08:00
yoriswind 619576ebae Preview the targeted layer mask in the Eyedropper ring 2026-11-07 00:37:18 -08:00
yoriswind 3b3c648f61 Reveal notes after creating one with the Note tool 2026-11-06 23:12:35 -08:00
DuBearteandClaude Opus 5.5 daf1d48d88 fix(engine): deleting the current count group makes the first group current (#11771)
count.deleteGroup kept the same index current after deleting the
current group, so with three groups and the second current the third
became current. The first remaining group now becomes current, as the
reference application does. Deleting another group by index still keeps
the current one (#5654), and deleting the last group still leaves none.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 01:50:14 -05:00
yoriswind c392cb8cdf Sample the targeted layer mask with the Eyedropper 2026-11-06 22:25:05 -08:00
Hartmut Nörenberg ccc263e49e fix(paint): Pressure for Size starts off, as the reference does
BrushSettings::default() turned Pressure for Size on, so a fresh brush -
and the brush Reset Tool hands back, which is that default plus
Photoshop's 10 % smoothing - reported pressureSize: true from brush.get
and drew the options bar's "Always use pressure for size" button
highlighted, while the reference application leaves both pressure
toggles off after Reset Tool. Neither is on now.

The toggle itself is untouched: it still switches both ways, Shape
Dynamics' Pen Pressure control is unaffected, and path.stroke's Simulate
Pressure still tapers a brush that follows pen pressure. A brush JSON
that omits pressureSize now reads as off, as the reference's default is.

Two engine tests took their expectation from the old default and set
pressureSize explicitly instead: cmd::brush_cmds::tests::stroke_backwards_compatible
and cmd::vector_cmds::tests::stroke_path_simulate_pressure_tapers_both_ends.
The new crates/engine/src/brush_pressure_size_default_tests.rs covers the
default, brush.get on a fresh session, an omitted field, switching the
toggle, and that a pressure ramp with the default brush paints like
pressureSize: false.

Fixes #11809
2026-11-07 07:22:59 +01:00
DuBearteandClaude Opus 5.5 21a2665c92 fix(ui): Delete with a note selected asks to delete the note, not the layer (#11788)
With the Note tool and a note selected, Delete and Backspace went the
usual way and deleted the active layer, leaving the note. They now ask
"Delete this note?" (Yes / No, "Don't show again"); Yes deletes the note
as one "Delete Note" step and selects nothing, No changes nothing. The
Notes panel's trash asks the same, and "Don't show again" skips the
question for both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 00:35:13 -05:00
David Mann f68e227026 Merge pull request #11780 from davidmann4/i18n-fallback-no-coverage-tests
i18n: no test fails on a missing translation (#11778)
2026-11-07 02:20:37 +01:00
0eb6ba9dea #10730: keep the filter-preview comment the main merge cut; check both Batch outputs
The merge of main into #10730 dropped the first line of the comment above the
filter-preview check in confirm_generic_command; it is back. The Batch test now
compares out/b.png with the hand-typed reference as well as out/a.png, so a
replay that stops after the first file fails it (review on #10730).

Co-Authored-By: Lcoding15 <Lcoding15@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 01:40:56 +01:00
David Mann 048ae79779 Merge pull request #11672 from RickiNano/fix/11368-marquee-moves-outline-after-move
Marquee and Lasso: a drag after moving pixels moves only the outline (#11368)
2026-11-07 01:12:58 +01:00
David Mann 0f286b57a9 Merge pull request #11252 from NaufalDzz/fix-transform-several-selection-rules
fix(transform): refuse the Background among several layers and apply the box on a selection change
2026-11-07 01:12:41 +01:00
David Mann 927c63d394 Merge pull request #11022 from Hamza0101/fix/crop-overlay-and-fill-defaults
Crop: Always Show Overlay by default, Fill resets on another open document, and an untouched frame shows only itself (#10894, #10930)
2026-11-07 01:11:21 +01:00
David Mann 65cdc3159c Merge remote-tracking branch 'origin/main' into pr-10730 2026-11-07 01:09:59 +01:00
Trevor Brown 88c58ba8b2 Merge remote-tracking branch 'upstream/main' into feat/move-options-bar-distribute-gear-11381 2026-11-06 18:39:53 -05:00
David MannandClaude Opus 5.5 b826eb3650 i18n: no test fails on a missing translation (#11778)
Remove the Azerbaijani menu coverage test (red on main), the crop Fill
label coverage test and the has() loop in the pen path Esc test. A
missing string falls back to English; cargo xtask i18n-coverage lists
the gaps. docs/contributing.md now says tests never require a string to
be translated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 00:30:56 +01:00
David Mann 8df2b7a2e2 Merge pull request #11738 from davidmann4/fix/az-contextual-task-bar
i18n: translate Contextual Task Bar in the Azerbaijani catalog (#11737)
2026-11-07 00:20:21 +01:00
Trevor BrownandClaude Fable 5.1 ce74615500 i18n: Azerbaijani rows for the Move options bar labels (#11381)
Drafts in the catalog's style for the maintainers' review.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 17:57:15 -05:00
Trevor BrownandClaude Fable 5.1 a475de6139 Merge upstream/main into feat/move-options-bar-distribute-gear-11381
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 17:40:51 -05:00
David MannandClaude Opus 5.5 ee8a4caa03 i18n: translate Contextual Task Bar in the Azerbaijani catalog (#11737)
The Window menu item from #11669 and the Azerbaijani catalog landed
together, so azerbaijani_covers_every_menu_label_and_path fails on main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 23:32:50 +01:00
David Mann 9922871a4e Merge pull request #11148 from vangel76/perf/paint-procedural-texture-cache
perf(paint): cache procedural brush textures between strokes
2026-11-06 23:20:44 +01:00
David Mann ad55badcb8 Merge pull request #11146 from vangel76/perf/paint-retouch-smudge-selection
perf(paint): Smudge start-up and selection sampling without per-pixel work
2026-11-06 23:20:17 +01:00
David Mann 6b0f7762e1 Merge pull request #11671 from davidmann4/integration-batch-20
Integration batch 20: 7 i18n PRs (Thai, Hebrew, Urdu, Tamil, Azerbaijani, Romanian, Korean)
2026-11-06 22:49:42 +01:00
David Mann fd890eaca4 Merge pull request #11669 from davidmann4/feat/crop-task-bar-10890
Crop: Contextual Task Bar under the crop frame, as a reusable task-bar widget (#10890)
2026-11-06 22:49:21 +01:00
David Mann 7ecfccbd64 Merge pull request #11643 from davidmann4/integration-batch-19
Integration batch 19: epic PRs (WIP)
2026-11-06 22:48:55 +01:00
RickiNano 9d16699d45 Magnetic Lasso right-click: an ⌥-drag's freehand segment keeps its menu (#11689)
The issue leaves a right-click during an ⌥-drag unmeasured, so it keeps
today's behaviour. `magnetic_drawing` held that menu back too; it now
skips a freehand segment.
2026-11-06 22:21:45 +01:00
David Mann bd84401dcf Merge remote-tracking branch 'origin/main' into integration-batch-20 2026-11-06 21:46:47 +01:00
David MannandClaude Opus 5.5 e339ecead2 Batch fix-up: keep one path.toShape entry after merging #11005's 0b66e8f00c
#11005's new head adds path.toShape to the vector-path list next to
path.stroke; the batch's 95c7a5d17e had added it next to path.set. Both
merged cleanly into a duplicate or-pattern; keep the contributor's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:44:32 +01:00
David Mann 47f4f1ce23 Merge PR #11005's new head 0b66e8f00c (path.toShape vector-path fix) 2026-11-06 21:44:23 +01:00
RickiNano b471935d75 Magnetic Lasso right-click: keep to the files #11689 names
The issue lists the files this item may touch and leaves the parity docs
to its epic. The right-click check moves from magnetic_lasso_ui.rs to
canvas_tool_menu.rs as magnetic_drawing, where the issue allows it, with
the same document check. magnetic_lasso_ui.rs and
docs/context-menu-parity.md are back as on main.
2026-11-06 21:20:05 +01:00
David MannandClaude Opus 5.5 46d6307cba Crop task bar: Done fits the cropped document
The bar draws inside the canvas pass, whose write-back of its own camera
dropped the fit that commit_crop asks for, so Done kept the old zoom. The
stored view now wins when the bar changed it, as a view menu row's does.
done_fits_the_cropped_document starts at 50 % and fails without the fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:17:51 +01:00
RickiNano 8519977bc1 Magnetic Lasso: a border on another document holds back no menu (#11689)
The right-click check asked only whether a border existed. Over the
control channel no frame runs between events, so a border left on one
document stayed in place after a switch and kept the selection menu
from opening on the next. The check, now magnetic_lasso_ui::drawing,
also asks that the border belongs to the document in front, the same
test frame() uses to drop a stale border. The canvas, the control
channel and frame() share it.

agent_right_click_on_another_document_still_opens_the_selection_menu
fails without this change. The context-menu parity doc records the
behaviour.
2026-11-06 21:06:45 +01:00
David Mann ce88165362 Merge remote-tracking branch 'origin/main' into fix/crop-task-bar-fit-11669 2026-11-06 21:00:22 +01:00
tasosf b49c6c97c5 fix(export): preserve high-quality JPEG colour detail in Export As (#7985)
* fix(export): preserve full JPEG chroma in Export As

* style(ui): simplify blend preview condition for Clippy

* test(export): verify full JPEG chroma at every quality

Exercise real JPEG export and decode at five qualities across U8, U16 and F32. Read all sampling factors from the main frame while skipping metadata segments and embedded thumbnails. Keep the colour-error limit at quality 100 and verify that the layered source is unchanged.

* Keep JPEG regression compatible with current Clippy

Restore the upstream blend-preview and IME predicates, removing unrelated lint-only changes. Use array chunks in the JPEG colour-error assertion for current stable Clippy.

* Use quality-dependent JPEG sampling in Export As

Keep 4:2:0 through quality 50 and full 4:4:4 above it, using the existing percentage-scale cutoff from Save for Web. Photoshop 27.11 modern Export As measurements show 4:2:0 at levels 1-4 and 4:4:4 at 5-7; no exact numerical mapping of the two scales is claimed.

Exercise both sampling regimes through 15 real JPEG exports across U8/U16/F32, check all percentage qualities in settings, and retain the Save As default. Boundary mutations fail at 50 and 51 as expected.
2026-11-06 20:59:25 +01:00
DingusMcRinkyDinkyandClaude Opus 5.5 0b66e8f00c path.toShape: its path is a vector path, not a host file
The automation registry check takes a `path` parameter for a host file
unless the command is listed as taking a document vector path, as the
other path commands are. path.toShape's `path` is the inline path being
drawn, so it belongs in that list; integration batch #11643 failed on it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EZbgszHyuEuWAzxaamteuU
2026-11-06 20:55:12 +01:00
David MannandClaude Opus 5.5 0b3b3e470b direction tests: ignore the env override, check glyphs only with craft-fonts
Unit tests no longer read PHOTOCRAFT_UI_DIRECTION (cached per process, so a
developer's shell could flip the Hebrew/Urdu and shell assertions). The
Hebrew/Urdu test checks glyphs only when craft-fonts carries a face for the
script (the eager provider draws it in the first frame, as in CI with
CRAFT_FONTS_REQUIRED); without it the harness allows tofu and only the
mirroring is checked, instead of panicking on a host without the fonts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 20:52:58 +01:00
Trevor BrownandClaude Fable 5.1 d8bce6b97d Move gear: the marker getter names the direct-write exception too (#11381)
Doc only: the getter's comment now says, as the field's does, that a direct write to DocState::active_layer through active_mut() bypasses the change marker.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 14:40:19 -05:00
RickiNano 14a27b360f Magnetic Lasso: a right-click while drawing opens no menu (#11689)
With a Magnetic Lasso border in progress, a right-click on the canvas
opened the selection tools' menu over the live border, in the window and
over the control channel. As in Photoshop, it now opens nothing and the
border stays live: Enter or Esc still close or cancel it. With no border
in progress the menu opens as before. Cmd/Ctrl+right-click (the layer
list) is unchanged, since it was not measured.

Tests in crates/ui-egui/tests/it/magnetic_lasso_right_click.rs drive
both paths; the two "while drawing" tests fail without the fix.
2026-11-06 20:18:16 +01:00
Trevor BrownandClaude Fable 5.1 2e4ced2469 Move gear: active_layer_changes is a change marker, not an exact count (#11381)
Session::active_layer_changes now documents its contract: it advances at least once whenever the active document or layer changes, so callers compare two readings for equality. A file.new or a document close may advance it twice (add_document and execute both note it); removing that is not a one-liner, so the wording covers it. Adds a test that file.new advances the marker and a same-layer select_layer does not.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 13:45:24 -05:00
David MannandClaude Opus 5.5 e078c560ec Address CodeRabbit review: task bar tile, inspect and ui.set merge
- Draw the Crop task bar only on the active document's tile: a click into
  another tile activates its document mid-pass, and the tile drawn after it
  put the new frame's bar on itself for that frame.
- ui.inspect reports the bar hidden (and no rect) as soon as it can't show,
  not only after the next draw.
- ui.set merges panels.task_bar field by field: {"at": [x, y]} keeps a pin,
  {"pinned": true} keeps a dragged place; unknown nested fields are refused.
- Tests for each (each fails with its fix reverted), plus the task bar's
  preset dropdown picking 1 : 1 in sync with the options bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:41:21 +01:00