forked from 1b-agent/opencadstudio-upstream
feat(xref): reference list with stale and orphaned status detection
Reference list rows showing stale and orphaned states with handle-based identity.
This commit is contained in:
1 parent
37e2b50e1c
commit
42219a4b8c
9 files changed
+442
-1141
No files matched your search
@@ -757,6 +757,32 @@ pub(super) fn on_ribbon_tool_click(&mut self, tool_id: String, event: ModuleEven
|
||||
self.refresh_block_palette();
|
||||
}
|
||||
}
|
||||
|
||||
/// Rebuild the Reference Manager's entry list from the active drawing.
|
||||
/// Display-only: `collect_entries` stats files but mutates nothing.
|
||||
pub(crate) fn refresh_xref_manager(&mut self) {
|
||||
let i = self.active_tab;
|
||||
let base_dir: std::path::PathBuf = self.tabs[i]
|
||||
.current_path
|
||||
.as_ref()
|
||||
.and_then(|p| p.parent().map(|p| p.to_path_buf()))
|
||||
.unwrap_or_else(|| std::path::PathBuf::from("."));
|
||||
let tab_id = self.tabs[i].id;
|
||||
self.xref_manager
|
||||
.refresh(&self.tabs[i].scene.document, &base_dir);
|
||||
self.xref_manager.source_tab_id = Some(tab_id);
|
||||
}
|
||||
|
||||
/// Re-scan when the palette is open but showing another tab's drawing.
|
||||
pub(crate) fn refresh_xref_manager_if_stale(&mut self) {
|
||||
if self.active_modal != Some(crate::app::ModalKind::XrefManager) {
|
||||
return;
|
||||
}
|
||||
let i = self.active_tab;
|
||||
if self.xref_manager.source_tab_id != Some(self.tabs[i].id) {
|
||||
self.refresh_xref_manager();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
@@ -314,6 +314,9 @@ impl OpenCADStudio {
|
||||
// The block panel watches the drawing's block list and rebuilds its
|
||||
// thumbnails whenever the names change (BLOCK define, file open, …).
|
||||
self.refresh_block_palette_if_stale();
|
||||
// The Reference Manager watches the active drawing and re-scans when
|
||||
// the palette is open on another tab's entries.
|
||||
self.refresh_xref_manager_if_stale();
|
||||
// Let V4 plugins observe selection changes that happened while handling
|
||||
// this message (picking, window select, QSELECT, SELECTALL, grip edits,
|
||||
// and plugin request draining).
|
||||
@@ -2127,6 +2130,33 @@ impl OpenCADStudio {
|
||||
Task::none()
|
||||
}
|
||||
|
||||
Message::ToggleXrefManager => {
|
||||
if self.active_modal == Some(super::ModalKind::XrefManager) {
|
||||
self.active_modal = None;
|
||||
self.reset_modal_geometry();
|
||||
} else {
|
||||
self.refresh_xref_manager();
|
||||
self.active_modal = Some(super::ModalKind::XrefManager);
|
||||
}
|
||||
Task::none()
|
||||
}
|
||||
Message::XrefManagerRefresh => {
|
||||
self.refresh_xref_manager();
|
||||
Task::none()
|
||||
}
|
||||
Message::XrefManagerSelect(index) => {
|
||||
self.xref_manager.toggle_select(index);
|
||||
Task::none()
|
||||
}
|
||||
Message::XrefManagerToggleTree => {
|
||||
self.xref_manager.toggle_tree();
|
||||
Task::none()
|
||||
}
|
||||
Message::XrefManagerToggleExpand(key) => {
|
||||
self.xref_manager.toggle_expand(key);
|
||||
Task::none()
|
||||
}
|
||||
|
||||
Message::LayerStateManagerOpen => {
|
||||
let i = self.active_tab;
|
||||
self.ribbon.close_dropdown();
|
||||
|
||||
Reference in new issue
Block a user