Finding where the Rotate All, Space, Move All and Select/Move widgets
go and testing whether the pointer is over one flattened the group's
path two to three times per widget. Starting a Space, Move All or
Select/Move drag flattened it five times, and one pointer move over the
group could flatten it eleven times. Each lookup now flattens the path
once and shares that measurement across the widgets:
- vectorcraft-doc makes `Measured` public with `stop` and `stops`, and
adds `attachable`, which returns the path with its measurement.
- `Widgets::of` gives all four widgets for the canvas, `widget_at` gives
the widget under the pointer, and `WidgetDrag::hit` gives the drag a
press starts, each from one flattening. The Selection and Objects on
Path tools and the canvas use them.
- A Space, Move All or Select/Move drag keeps its measurement and
measures again only when the group's path changes.
Widget places, hits, cursors and drag results are unchanged. The new
`spine-count` feature of vectorcraft-doc exposes the flattening counter
to vectorcraft-tools' tests; it is enabled only as a dev-dependency and
leaves Cargo.lock unchanged.
A freeform gradient's image was sampled, encoded and written inline at
every fill, outside the reuse placed images have. Fields now go through
the same codes and placements: a fill whose encoded image (color setup,
image dictionary, filter, operator and samples) matches one already
kept draws from it, so its samples are written once in the setup as
VCim<i>. A field drawn once is still written where it is drawn.
A fill whose placement can't be drawn, or that arrives when the page is
already at the 256 MB limit, is no longer sampled first, and a field
image taken back with art that passed the limit is forgotten.
A gradient vector drawn on the art, a click that applies one, and the
dragged start and end handles snapped through snap_draw, which gathers
the bounds and anchors of the art only. Path segments, View › Snap to
Glyph's guides and the construction guides through the vector's start
did not pull them, and a click applied the gradient from the pointer
rather than from the snapped point. They now snap through DrawSnap, as
the Pen and Line Segment tools do:
- The press gathers the targets, for a vector drawn on the art and the
start and end handles only, and the drag keeps them. A click applies
the gradient from the snapped press.
- A dragged end or handle leaves its start as a Line Segment's end does:
it lands on the construction guides through the start, and with Shift
it keeps to 45° steps from the Constrain Angle and snaps along them.
- The pointer hovering where a press would draw a vector (anywhere with
art selected, over art with nothing selected), and not over the
annotator, shows the guides of the point the vector would start on.
A press that snaps onto a nearby target no longer starts the drag
early: the 3 px drag threshold counts from where the pointer was
pressed, not from the snapped start.
The palette listed the Layers panel's Delete Selection twice: as
Window › Layers › Delete Selection, which ran layer.delete and deleted a
layer holding art without asking, and as a bare Delete Selection, which
ran ui.layerDelete and asked first.
- The palette now lists one Window › Layers › Delete Selection result,
which runs ui.layerDelete, so a pick asks before deleting a layer or
sublayer that holds art. Scripts and the control channel still run
layer.delete at once.
- New Brush…, Brush Options…, Symbol Options…, Import SVG Filter… and
Convert to Text were also listed twice under the same name, once as
the engine command, which the palette ran with no params. Each is now
listed once, as the UI command that opens its dialog or file chooser
or acts on the edited paragraphs.
- A search for a wrapped engine command's id or menu path still finds
the one result.
Docs: docs/target-app-parity.md (Layers panel deletion).