forked from 1b-agent/opencadstudio-upstream
feat(app): dispatch HostNotifications to native plugins (API v9)
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.
This commit is contained in:
1 parent
50db12b169
commit
2cdc1df021
11 files changed
+536
-11
No files matched your search
@@ -142,6 +142,11 @@ impl<'a> HostSession<'a> {
|
||||
let key = (self.tab_id(), self.app.tabs[self.tab].scene.geometry_epoch);
|
||||
if self.app.last_plugin_document != Some(key) {
|
||||
v4_support::publish_drawing_changed(key.0, key.1);
|
||||
// The plain `DocumentChanged` follows the same immediate
|
||||
// publish contract (API v9): a plugin-initiated write settles
|
||||
// here, so native plugins' `on_notification` sees it now —
|
||||
// the message boundary's fingerprint guard then dedupes.
|
||||
v4_support::publish_document_changed(key.1);
|
||||
}
|
||||
v4_support::publish_document_view_v4(self.tab_id(), doc);
|
||||
self.app.last_plugin_document =
|
||||
@@ -3151,7 +3156,7 @@ impl<'a> HostSession<'a> {
|
||||
/// through this session. The designation is a scene-scoped in-memory set
|
||||
/// keyed by handle: nothing is written to the saved DWG/DXF, the set dies
|
||||
/// with the tab, and a reloaded drawing starts undesignated — the owning
|
||||
/// plugin re-marks its entities when the document opens, which makes the
|
||||
/// plugin re-marks on the `DocumentOpened` notification, which makes the
|
||||
/// in-memory designation fully equivalent to a persisted one for its use
|
||||
/// case.
|
||||
///
|
||||
|
||||
Reference in new issue
Block a user