The Layers panel's trash button, rows dropped on it, the panel menu's
Delete Selection, and Delete or Backspace on highlighted rows now run
ui.layerDelete. When a layer or sublayer among the rows holds art
(hidden, locked and nested objects count; guides do not), a confirm
dialog asks first. OK deletes the rows it asked about, by id, in the
document it was asked in, as one undo step; Cancel keeps them. Empty
layers, guide-only layers and object or group rows alone are deleted at
once. layer.delete itself is unchanged and never asks.
The double-click right of an RGB field was the only way to switch R, G and B
between percent and 0 to 255 from the UI. ui.colorRgbPercent (Toggle RGB
Percent) is listed in the command palette and in Keyboard Shortcuts without a
default key, and switches the same setting. A parameter answers an error and
changes nothing. The label has a row in every complete catalog.
The Actions panel menu has Insert Select Path, after Insert Menu Item.
With one whole path or compound path selected, it inserts a Select
Path step into the action being recorded, or after the selected action
or step. Playing the step selects that path again.
- New engine command `select.storedPath {id, fingerprint}`. The step
stores the path's object id and a fingerprint of its geometry and
fill rule ("v1:" and 16 lowercase hex digits, FNV-1a 64). Playback
selects the path only while it exists unchanged and can be selected;
otherwise the step fails and the selection stays as it was. A path
on a locked artboard is refused in isolation mode too.
- Capture refuses an empty selection, several objects, selected
anchors or segments alone, groups, type, guides, a path selected
together with ruler guides, a member of a compound path, and hidden,
locked or template art.
- New UI command `ui.action.insertSelectPath {set?, action?, step?}`.
Step rows show "Select Path".
- `.vcactions` files that hold a Select Path step are written as
version 4. Reading accepts versions 1 to 4 and refuses a Select Path
step with invalid params.
- Rows for the new labels and messages in every catalog.
Docs: docs/mcp.md, docs/target-app-parity.md.
Dragging the Control bar's gripper and releasing it within 24 points of
the top (under the menu bar) or the bottom of the window docks the bar
at that edge, as before. Released farther from both edges, the bar now
floats over the window under the pointer, 800 points wide or as wide as
the window, without taking room from the canvas. A floating bar's
gripper moves it or docks it again, and its panel menu keeps Dock to Top
and Dock to Bottom, neither checked while it floats.
- window.control.dock takes edge "float"; a floating bar floats where it
last floated, first at 60, 80 in window points.
- Escape cancels a gripper drag, and a release outside the window leaves
the bar where it was. In a window too short for a floating bar between
the two zones, a release docks it at the nearer edge. A floating bar is
kept inside a window that shrinks.
- Workspaces and preferences keep whether the bar floats and where;
older ones dock it at the edge they name. Menus stop at the window's
bottom while the bar floats.
Docs: docs/mcp.md, docs/target-app-parity.md.
crates/mcp/src/ui_catalog.rs is regenerated with `cargo xtask ui-commands`, so
the ui.savePdfDialog entry matches its description in
crates/ui-egui/src/menus/ui_commands.rs.
In RGB mode a double-click in the cell right of the R, G or B field
switches all three fields and sliders between 0 to 255 and percent (0 to
100 with a % suffix, as the CMYK fields show). The color does not change;
a typed percent converts back (50% is 127.5 of 255) and a slider click
picks a whole percent. Web Safe RGB, the hex field and the other modes
keep their units.
Only RGB rows have the cell. It is blank, is highlighted under the
pointer, and takes no keyboard focus, so Tab does not stop on it. The
RGB sliders are narrower by the cell's width and spacing, so an RGB row
is as wide as a row in the other modes and Tint, in a narrow panel too.
While a mixed selection disables the rows, a double-click on the cell
does nothing, as the fields beside it take no input.
The double-click runs ui.colorPanel {rgbPercent}, which takes a bool and
answers it. The setting is off by default and is kept with the
preferences (ui.color_rgb_percent); a saved value that is not true or
false reads as off. The color mixer in the Fill and Stroke chips'
popovers (Control bar and Properties panel) and the gradient stop dialog
show the same rows and follow the same setting.
Docs: docs/mcp.md, docs/control-protocol.md, docs/target-app-parity.md.
The Actions panel menu gets Select Object…, which opens Set Selection with a Note field and
Case Sensitive and Whole Word. The step it inserts runs the new select.byNote command, which
replaces the selection with every object that can be selected whose note matches. When none
matches, the selection, its Puppet Warp pins and the active Appearance item stay as they were,
and playback stops with an error. Action set files that hold the step are saved as version 4.
ui.action.record's params text now says that a recorded command whose
step passes a limit only from the values it adds as it runs keeps its
edit and result, that later recorded commands are an error and do not
run, and that ui.action.stop leaves its step out.
crates/mcp/src/ui_catalog.rs now matches the desktop table again
(cargo xtask ui-commands --check), including the action-limit params
texts of the earlier commit.
With the Artboard tool chosen, the Align panel's Align Objects,
Distribute Objects and Distribute Spacing buttons, their UI commands and
the Control bar's Align and Distribute buttons act on the artboards the
tool has selected, as the public page describes:
https://helpx.adobe.com/illustrator/desktop/create-manage-artboards/organize-manage-artboards/align-and-distribute-artboards.html
- artboard.align, artboard.distribute and artboard.distributeSpacing
move whole artboards with their guides, and with the art inside them
when Move Artwork with Artboard is on, in one undo step. No undo step
is recorded when no artboard moves.
- Align To offers Align to Selection and Align to Artboard. Align to
Artboard keeps the active artboard in place, and the Distribute
buttons then send the Distribute Spacing value. A locked artboard
stays where it is. These rules are VectorCraft's own.
- The Control bar shows the Align buttons, the Align To menu and the
Distribute buttons after the artboard controls while it has room.
Docs: docs/mcp.md, docs/ui-parity.md.
Preferences > User Interface > UI Scaling sets egui's zoom factor, and the
canvas mapped one document point to one of the interface's points at
100%. A document point then covered UI Scaling times as many device pixels,
so the art grew and shrank with the interface.
The canvas now maps the document at the view's zoom divided by the UI
zoom (View::screen_zoom, Xf::at). The rendered frame, the pointer, rulers,
grids, Fit and Actual Size, pan, scroll, zoom and turn about a point, the
Zoom tool's marquee, Pixel Preview's check, tiled panes, the Navigator's
view box and the tools' tolerances use that mapping. The zoom value means
the same at every UI Scaling, and the interface still follows UI Scaling.
fit_zoom, zoom_about, rotate_about, pan_pixels and scroll_by take the UI
zoom, and Xf::new is now test-only.
Found while looking into a report by bortek about the art's size at 100%.
The Window menu checked a panel whenever it was in front in the layout,
even while Tab, Shift+Tab or Presentation Mode hid every panel, so
choosing it, or pressing its function key, closed the panel it was
meant to show.
- A new panel_docking::visible adds the dock and Presentation Mode to
showing. The Window menu's check marks and the toggle use it, and
window.panel puts a flyout or floating panel away only while it can
be seen. With the dock hidden, the dock shows again with the panel in
its earlier place; the toolbar and the Control bar stay as they are.
- In Presentation Mode window.panel fails with "panels can't be shown
in Presentation Mode" and changes nothing.
- reveal_panel, the Gradient and Magic Wand tool double-click, the
Character field shortcuts and the Corner and Shared Edge Merge tool
items show a panel the dock hid instead of reporting it open or
closing a floating Anchor Inspector.
Docs: window.panel params text, docs/mcp.md, docs/target-app-parity.md.
On Linux, ui.sampleScreenColor and the Color Picker's eyedropper button
now show the XDG desktop portal's color sampler (Screenshot.PickColor,
https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.Screenshot.html).
A thread of its own makes the call and waits for the person, and the
picked sRGB color goes through the same conversion into the working RGB
space as on macOS and the web. A cancel leaves the colors as they were.
A session without a portal that has PickColor, a portal that does not
return from the call within 25 seconds (VectorCraft's own limit) or
leaves the bus before it answers, and a portal that ends the request in
another way each show a status message and end the wait. The two new
messages are translated in every catalog that has the sampler's other
messages. The request token is random, as the Request documentation
asks (https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.Request.html).
The window is named for the portal on the UI thread, as for the save
dialog, and the sampler's thread keeps the window and its export until
the portal answers.
An approval question that a control request, MCP, injected input, or a
file dialog one of them opened leads to now keeps OK disabled and
refuses every confirm, a person's click included. The dialog says to
choose Object › Plug-ins › Install Plug-in…, and ui.installPlugin answers
approval: "personMustStartInstall". The person's own Install Plug-in…,
File › Open or drop inspects the module again and asks a new question
with its half-second delay.
The origin is fixed when the request is made and goes with a native
file dialog's deferred answer and the web picker's answers, which now
arrive apart from drops and from window.vectorcraft.openFile (always
automation). A question about taking another module's place now opens
in the approval dialog, and automation's replace: true no longer skips
it. A module that needs no approval still installs at once.
draw_shape's rotation also turns rectangles and ellipses; object.reflect's numeric axis is counter-clockwise from horizontal. A test covers that axis and the Scatter brush's rotation range, which every_turn_param_says_which_way_it_turns can't reach.
ui.pointer and the headless pointer call read a pointer event's pressure,
holdMs, tiltX, tiltY and rotation with a default for any value that was not a
number, and treated any space other than screen as document space. Each event
is now checked before the packet runs: those values must be numbers and space
must be doc or screen, with null keeping the default. docs/mcp.md says so.
VectorCraft could open and place HP-GL plot files but not write them,
so art for a pen plotter or a vinyl cutter had to go through another
program.
Export As, document.export and Export Selection now write HP-GL.
vectorcraft_cad::hpgl::export draws each visible path once along its
own line: a filled shape is its closed outline and a stroked path its
center line. Type is drawn as glyph outlines, a gradient mesh as its
outline, and a symbol instance as its art with its effects and the
instance's stain. Clipping masks cut the art they clip, and the art is
cut at the artboard's edges. Hidden and non-printing layers, hidden objects,
objects at 0% opacity, template layers, guides and placed images are
left out. Coordinates are plotter units (1016 to the inch, y up) from
the artboard's bottom-left corner or its center, and art more than
8,388,607 units from the origin is cut off.
Each color is a pen, in the order the plot first draws in it (up to
255), or a pen table maps each path to the pen of the nearest color.
With Use Artboards every file of the export uses the same numbering.
The pens draw in turn, each in paint order or, with sortPaths, nearest
path first. Curves are flattened to curveTolerance (0.1 pt by default).
hpglVersion "hpgl" writes IN, SP, PU and PD; "hpgl2" also writes the
palette (NP, PC) and each pen's paths as one encoded polyline (PE).
Options are checked, and Export As writes the file with the defaults.
Plots read back by the HP-GL reader give the same lines.
Docs: docs/mcp.md, docs/control-protocol.md, docs/file-format-parity.md,
docs/target-app-parity.md.