The guard remembered only the last announced (tab, generation), so
switching A -> B -> A announced A's load again. Each tab now carries
its own pending flag, set when a document is installed and cleared by
the boundary dispatch.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Reference-only entities (plugin API v9): a scene-scoped, in-memory
designation for plugin-owned display geometry, plus HostNotification
dispatch to native plugins so they can re-mark on DocumentOpened.
Resolves the new DeltaSnapshot site in block_editor.rs.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The color_book_dirs setting is gone. Colour books live in color_books in
the config folder (book::folder()), like the other fixed locations;
Options > Files shows it through Folders::color_books. read_all() and
load_from_dialog() use that folder directly.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
Options > Files lists the color book folder as a read-only row with Open
folder, like Plot styles or Fonts. The Add folder / Remove buttons, their
messages and the explanatory line (in all 22 locales) are gone; the
folder list stays in the settings for a later location option.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
book::load_from_dialog (pick, read, copy into the first folder) and
book::read_all (built-in book plus every .acb in the folders) move out of
update/mod.rs, which now just calls them. Same behaviour.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
- book::add_or_replace adds a colour book or replaces one of the same
name, for both reading the folders and loading a file.
- style.rs: the Plot Style and View Background colour targets use
math::color_rgb (and hex_string) instead of their own conversions.
- Ribbon: one layer_color lookup for Ribbon::active_layer_color and the
ribbon's ByLayer swatch.
- Picker: one swatch() for the Index and Document swatches, fill_of() for
"colour or gray" and divider() for the 1 px separators.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
- Arrow keys only walk the colours on screen: the Document tab's search
results, and the Color books matches while searching (the whole book,
page after page, otherwise). One helper per tab now gives the visible
colours to both the view and the arrow keys.
- show_identity no longer returns an unused bool; ink() absorbs its
one-use ink_is_dark helper.
- document::layer_identity joins a layer's book and colour name, used by
the Document scan and the panel's current colour instead of two copies.
- Recently-used sorting looks a colour's rank up once (sort_by_cached_key)
instead of on every comparison.
- Searching compares case-insensitively without allocating a lower-case
copy of every name on each redraw (ASCII queries).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
- The pipette is Phosphor Icons' "eyedropper" (regular, MIT); its
licence is in assets/icons/ui/LICENSE-phosphor.txt and the SVG header.
- The load-book button and the page strip's up/down arrows use the active
tab's colours (background.strong and its text colour), slightly darker
on hover.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
Close the no-load-callback gap: on_notification was a dead dispatch sink —
a plugin had no way to learn that the active document changed, the selection
changed, or that a document opened, so runtime designations could not be
re-seeded after a load.
Dispatch the existing plain variants at the fingerprint-guarded boundaries
the v4 bridge already uses: DocumentChanged (the active tab's settled
geometry epoch) and SelectionChanged (the selection set) leave through
BuiltinPlugin::on_notification at the post-message boundary — after the
mutation settles and pending history scopes closed, never mid-undo or
mid-pick — and at the automation post-op boundary. Plugin-initiated writes
publish immediately after settling, like the drawing-changed event; the
boundary fingerprint guard deduplicates.
Add the additive HostNotification::DocumentOpened { tab_id } variant
(discriminant 10, the counterpart of DocumentTabClosed): fired exactly once
per whole-document install — file open, template new, system open — keyed on
a new per-tab document generation, so an edit can never repeat it and a
reload fires it once. The API version stays v9 (the bump is unreleased).
Write semantics for handlers, tested and documented: a handler may call
HostApi write methods through the same session (set_reference_only at
minimum); its write bumps the epoch, the next boundary notifies once more,
and because re-marking already-designated geometry is a documented no-op —
no epoch bump, no undo step, no publish — the loop terminates. History
(undo/redo) replay itself emits nothing; the boundary is the only channel.
No Python mapping, like the rest of this increment.
Per the upstream review of the XDATA-based storage: the host no longer writes
its own state into the saved file. The marker record under the host-owned OCS
APPID, the on-first-use APPID registration and the verbatim-EED rewrite
handling are removed; the single source of truth is a scene-scoped in-memory
set of entity handles (Scene::reference_only) that dies with the drawing tab,
so a reopened file starts undesignated and the owning plugin re-marks on the
document-opened notification.
All behaviour sites are unchanged, driven by the set: the wire stamp moves
from an XDATA read to a set lookup threaded through the tessellation
pipelines (tessellate_entity and the dimension text path take the handle set
as a plain parameter), and the pick filters, selection retains and
update/erase refusals read Scene::is_reference_only.
Undo keeps the entity-write contract: set mutations are recorded as explicit
first-touch before/after values on each history delta (the parametric-
constraints channel pattern). A designation inside a plugin push_undo scope
joins it, a scope-less change is one step of its own, an idempotent re-mark
records nothing, erasing a designated entity drops the set entry with the
entity, and undo/redo restores entity and designation together.
The round-trip test is inverted: reference_only_designation_is_not_written_
to_dwg_or_dxf now asserts the marker appears in neither format's bytes, that
no OCS APPID or marker record survives a reload, and that the designation
stays live in memory.
- Colour books now come from folders, like AutoCAD's Color Book
Locations: Options > Files lists them (add, open, remove); by default
one color_books folder in the config directory. The Color Books tab
shows the built-in books plus every .acb in those folders; Load copies
the chosen file into the first folder. Web: session only, as before.
- Grid/list buttons use the app's toggle style (light accent, its text
colour for the icon, same corners as inactive).
- Color Books: the load button sits right of the book list; the search
box keeps its start over the page strip and runs to the end.
- Translations for the two new Options strings in all 22 locales.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
- Info line shows a colour-book colour as "BOOK - NAME".
- Document tab: a search box (by name) replaces the "Colors in this
drawing" heading; grid swatches no longer carry text; larger grid/list
icons, dark on the accent colour when active, like the OK button.
- Color books tab: no "Color book"/"Find" labels; the book list is as
wide as the colour bars, and the search box (magnifier, gray "Search")
and load button sit over the page strip and RGB values, all 28 px high;
the load button and page arrows use the button's dark text colour.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
ByLayer swatches were always gray. The Select Color panel's Current/New
band and info line now show the colour of the layer the colour is for
(the newest selected object's layer, or the current layer for new
objects); the ribbon's colour control and the ByLayer row of its colour
dropdown show the current layer's colour.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
-BLOCK, -WBLOCK, -BEDIT, ATTSYNC, BASE and INSBASE follow the reference
prompts and messages; empty blocks; WBLOCK keeps object coordinates and
stores INSBASE; annotative and hyperlink data on the block record; block
preview images; remembered dialog choices; block aliases.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Open the Edit Block Definition dialog when BEDIT is invoked without an active selection, listing candidate block definitions alphabetically while filtering layout records, anonymous blocks, and external references. Allow typing a new valid block name to start an empty block editor session that only commits to the drawing block table upon explicit save.
Preview the current unsaved block in a disposable drawing with independent history. Keep normal Draw tools available, append Close Test Block, and return to the original editor without saving. Guard persistence paths and handle refresh and parent-close lifecycle by stable document identity.
- True Color opens in RGB; the gradient field, hex and nearest index sit
at the bottom so CMYK's fourth slider doesn't move them; slider rows
closer together.
- Document tab: grid or list view (list drawn like the colour-book bars),
and Name A–Z / Z–A sorting (translated in all locales). Swatches of
colour-book colours show the colour's name.
- A colour-book colour picked as the current colour (nothing selected)
keeps its BOOK$NAME on the objects drawn with it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
A code the reference shows on two buttons runs the button whose command
the reference runs for it (VC runs Viewport Configuration), decided by
the code table's order. Labels, combo values and panel titles report
their bounds while key tips are open, and each code takes the first
spot nearest the reference place that covers none of them nor another
code; a collapsed panel's title is measured to place its code beside
the words.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Editor modes RGB, HSB and CMYK; the saturation/brightness field and hue
strip now sit below the sliders in every mode instead of being a mode.
- The panel opens on the Document tab.
- Built-in colour books: RAL CLASSIC and SIKKENS 4041 (Open Colour
Systems Collection 2.0, CC BY-ND 4.0); CSS COLORS removed.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8
The count line now uses the objects the selection step itself picked
(a click, a window or crossing, a lasso, a fence, Last / Previous /
All): "N found (D duplicate), M total" when some were chosen already,
"N found, R removed, M total" in remove mode, "N found, M total" when a
removal picks objects that were not chosen.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Quick-access buttons take the numbers the reference toolbar gives the
same buttons (Print 6, Undo 7, Redo 8). Codes the reference shows on two
buttons appear on both, the first in ribbon order running. Codes sit
where the reference puts them: under tab and large-button labels, on a
large dropdown's arrow strip, with their corner at the icon's centre on
icon buttons, and centred on panel titles and the corner launcher; a
button code a panel code would cover rises clear of it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Viewport stacking rank kept apart from its ID in DXF; a layer's method-0
transparency reads as opaque.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The end angle subtracted a whole octant less the end offset, so the arc
in the ISOCP 9 stopped about 45 degrees short and the glyph shrank to
0.68 of the cap height; clockwise arcs and n = 0 (a full circle) drew
nothing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Lines still showing when the pointer reaches the overlay history no
longer fade under it; leaving restarts their COMMANDLINEFADETIME.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Every pick during object selection prints the reference's count line:
"N found" for the first pick or a pick that adds nothing, "N found,
M total" after it, "N found, N removed, M total" when objects leave the
set. It is printed before a command's own filtering, so "N were filtered
out" follows it. COUNT reports through it and the ad hoc
"object(s) found." / "object(s) added to selection." lines are gone.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A save records the entered model viewport (or the sheet) as the layout's
last active viewport, and opening the layout enters it again with its
UCS. Picks up the codec fix that kept a last-active link from being read
as the sheet viewport (codec d57097c, kernel b40fa59, graph 2360341).
Co-Authored-By: Claude Opus 5.5 <[email protected]>