Kill the GraphRAG flash: warm the view up, and never paint it white
Two causes, both dealt with. A fresh QWebEngineView paints white, and _ensure_web put it on screen empty — so on a dark theme that white rectangle sat there for the whole first scan. It is now blanked to the app's own background colour the moment it is created, before it is ever shown. And the work itself moved off the click. MainWindow warms GraphRAG up 3s after the window appears — building the browser view (~140ms) and the first graph (~485ms) while nothing is waiting on them. Clicking GraphRAG then costs 78ms with zero scans and zero setHtml calls, where before it was ~625ms of empty view. This spends the memory the lazy construction was saving, a few seconds after startup rather than never — which is the trade you asked for. Startup itself is untouched: the checker asserts neither the view nor the graph exists at the moment the window opens. check_graphrag_rescan now covers the warm-up too, and fails if it stops running. 24/24 checkers pass; check_combo_popup took a teardown segfault in the suite and passed 3/3 standalone. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
d1e3be0feb
commit
c4e9158779
@@ -495,10 +495,31 @@ class StructureGraphView(QWidget):
|
||||
f'<pre style="white-space:pre-wrap; font-family:Consolas,monospace; '
|
||||
f'font-size:12px;">{html.escape(text)}</pre>')
|
||||
|
||||
def prewarm(self) -> None:
|
||||
"""Pay for the graph view before it is clicked on, not during.
|
||||
|
||||
Opening GraphRAG built a QWebEngineView (~140ms) and scanned the project
|
||||
(~485ms) while an empty browser sat on screen — long enough, and white
|
||||
enough, to read as the app restarting itself. Called from an idle timer
|
||||
after the window is up, so startup itself is unaffected; the memory the
|
||||
lazy construction was saving is spent a few seconds later instead.
|
||||
"""
|
||||
if not _HAS_WEB or self.web is not None:
|
||||
return
|
||||
self._ensure_web()
|
||||
if self._graph is None and self.path_edit.text().strip():
|
||||
self._needs_scan = False
|
||||
self._scan() # runs on a worker thread
|
||||
|
||||
def _ensure_web(self) -> None:
|
||||
if self.web is not None or not _HAS_WEB:
|
||||
return
|
||||
self.web = QWebEngineView()
|
||||
# Blank the page in the app's own background first. A fresh
|
||||
# QWebEngineView paints white, and on a dark theme that white rectangle
|
||||
# WAS the flash — it showed for as long as the first scan took.
|
||||
self.web.setHtml(
|
||||
f"<body style='margin:0;background:{current_palette().bg}'></body>")
|
||||
self._bridge = _Bridge()
|
||||
self._channel = QWebChannel()
|
||||
self._channel.registerObject("py", self._bridge)
|
||||
|
||||
Reference in New Issue
Block a user