A historyName of zero-width, filler or BOM characters showed an empty History
row, and a bidi control or line separator could make a row read differently
from its name. A history name now has no control or line-break character
anywhere, loses white space and ZWNJ/ZWJ at its ends, and is then held to the
plug-in menu-label rule, now shared as
photocraft_plugins::manifest::printable_name (1-64 characters with a visible
one, no hidden format characters; plug-in names also refuse U+2028/U+2029).
select.lasso takes an optional historyName; the Patch tool sends "Patch Tool" so its
lasso is that step (the Lasso tool keeps "Lasso"). paint.patch records "Patch Selection"
in every mode; the content-aware job keeps its progress text.
Tests: patch_history_names_tests (engine) and patch_tool_history_names_tests (ui-egui).
#9970 reopened Image > Adjustments > Photo Filter... at the filter, colour,
density and Preserve Luminosity of its last OK. Measured in the reference
application: after OK at 60, 70 and 74 %, with a preset or with Color and a
custom colour, it reopens every time at Warming Filter (85), the orange
swatch and 25 %; only Preserve Luminosity carries over (off after an OK with
it off, on after an OK with it on). Opening now starts from the neutral
settings and takes just that one value from the last OK; Alt still reopens
at all the last settings (#8900). Tests and the ui-parity row follow the
measured behaviour.
Co-Authored-By: ljkx <177671075+ljkx@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The review on #9306 asked to build the live preview on main's Path
Selection dragging instead of a separate handler. A drag now draws the work
path, or the saved path selected in the Paths panel, where its release will
put it: the same whole-pixel offset and click threshold as
path_selection_finish (path_selection_offset, shared by both), and only the
selected components when some but not all are (path_components::
moved_selected, through the engine's own move_anchors). The document still
changes only on release, as one History step. A shape layer's or vector
mask's outline is not previewed: their pixels move only on release. A stale
drag (VectorGestureOwner) shows nothing, as its release moves nothing.
Co-Authored-By: FartmanAndBurps <FartmanAndBurps@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds an Alt+right-drag test (resizes, samples nothing), checks the
foreground while an Alt-drag is still held, that a plain click clears the
pixel, and that Control+Alt-drag changes the brush size.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main now drags paths through Path Selection's own code (path_ops.rs
path_selection_finish, path_components::move_selected) and drops a stale
vector drag through VectorGestureOwner, and vector_ui.rs is split into
tools/vector_ui/. The separate work_path_drag.rs handler is dropped here, as
the review on the PR asked; the next commit ports the live preview onto
main's code.
Co-Authored-By: FartmanAndBurps <FartmanAndBurps@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Holding Alt with the Background Eraser now turns it into the Eyedropper
for that press, as with the Brush, Pencil, Gradient and Paint Bucket: a
click or drag sets the foreground colour, adds no history state and
changes no pixel, and the cursor shows the pipette. Control+Alt stays the
brush-resize gesture.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A tool letter pressed mid-drag hands the release to the new tool, so the sampler
drag was never ended and the next Escape (Deselect, a toolbar flyout) was eaten
by it. The Escape hook now drops a sampler drag once the Color Sampler is no
longer the tool, and only consumes Escape while it still is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At the limit a drag off a point drew marker 11 following the pointer, though the
release cannot place it. The marker drawing now skips the new-point preview once
the document has MAX_SAMPLERS points; the release still reports the limit as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Implement `Default` for `SampleAllLayers` with `patch: true` and all other
tools `false` so a fresh start and `Reset Tool` on the Patch tool leave
Sample All Layers on.
- Update `sample_all_key` in `crates/ui-egui/src/tools/tool_reset.rs` to
toggle the probed tool's slot against `SampleAllLayers::default()`.
- Add `crates/ui-egui/src/patch_sample_all_default_tests.rs`.
Fixes#12125
CodeRabbit found three things after the last fix-up:
- `engine.execute` and action steps without `name` replied `selected: []`
while the panel listed the layers its kept Name text matches. `run` now
fills in the panel's Name text for every path, as the menu did.
- With Filter Options > Hide, Find Layers left a focus request that took
the caret once the row was shown again. In the reference application the
row stays hidden and showing it later does not focus the field, so the
request is only made for a drawn row.
- The control protocol said the selection never changes; the Name filter
deselects a selected layer it hides (#10879). The doc now says so and
describes each entry point and the reply.
Tests for the first two fail without the fix.
Co-Authored-By: NaufalDzz <NaufalDzz@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With no inverse map, the offset now comes from the pseudo-inverse of the box map's linear part, not from how far the top-left corner moved.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: psd_import.rs (main's vector_preview field kept, the SmartObject
still built as a binding so pin_puppet_meshes runs), smart_cmds/rendering.rs
(main's JobCtx argument kept next to the PR's placed_puppet_params).
Co-Authored-By: Tungtono <Tungtono@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>