"""StructureGraphView shell (R08-T14) — assembles ``graph_renderer.py::GraphRenderer`` and ``graph_qa_widget.py::GraphQaWidget`` behind the splitter that used to be inline in ``ui/structure_graph_view.py::StructureGraphView.__init__`` (lines 188-343 of the original 1035-line file), and forwards the public methods ``app.py``/``ui/workspace_tab.py`` call: ``schedule_rescan``, ``auto_scan_and_fit``, ``set_project``, ``prewarm``. """ from __future__ import annotations from PySide6.QtCore import Qt, Signal from PySide6.QtWidgets import QSplitter, QVBoxLayout, QWidget from cowork_local.i18n import on_language_changed from cowork_local.presentation.graph.graph_qa_widget import GraphQaWidget from cowork_local.presentation.graph.graph_renderer import GraphRenderer from cowork_local.state import AppContext from cowork_local.ui.widgets import CollapseStrip _COLLAPSED_SIZES_HINT = (840, 320) # matches the original single-class default class StructureGraphView(QWidget): status_message = Signal(str) def __init__(self, ctx: AppContext): super().__init__() self.ctx = ctx root = QVBoxLayout(self) self.renderer = GraphRenderer(ctx) self.renderer.status_message.connect(self.status_message.emit) self.qa = GraphQaWidget(ctx, self.renderer) self.qa.status_message.connect(self.status_message.emit) self.qa.collapse_changed.connect(self._on_qa_collapse_changed) self._split = QSplitter(Qt.Horizontal) self._split.addWidget(self.renderer) self._split.addWidget(self.qa) self._split.setChildrenCollapsible(False) self._split.setSizes(list(_COLLAPSED_SIZES_HINT)) root.addWidget(self._split, 1) on_language_changed(self._retranslate) def _retranslate(self) -> None: self.renderer._retranslate() self.qa.retranslate() def _on_qa_collapse_changed(self, collapsed: bool) -> None: strip_w = CollapseStrip.WIDTH + 2 if collapsed: self.qa.setMaximumWidth(strip_w) sizes = self._split.sizes() if len(sizes) == 2: self._split.setSizes([max(1, sum(sizes) - strip_w), strip_w]) else: self.qa.setMaximumWidth(16777215) self._split.setSizes(list(_COLLAPSED_SIZES_HINT)) # ---- public API (app.py / ui/workspace_tab.py) --------------------------- # def schedule_rescan(self, path: str = "") -> None: self.renderer.schedule_rescan(path) def auto_scan_and_fit(self) -> None: self.renderer.auto_scan_and_fit() def set_project(self, project_id: str) -> None: self.renderer.set_project(project_id) def prewarm(self) -> None: self.renderer.prewarm() def hideEvent(self, e): # noqa: N802 # Leaving the GraphRAG tab → drop the temporary extracted info. self.qa.clear_extracts() super().hideEvent(e) __all__ = ["StructureGraphView"]