From 57b3ce04e315d085bd6a8fcb8955e742b3680d9e Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Mon, 3 Aug 2026 20:13:32 +0200 Subject: [PATCH] eliminate C++ calls in QML update loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - computeConnectionColor() in QML instead of ollie.sessionConnectionColor() (avoids O(n²) iteration through sessions list) - Use agent.state from session/idx data directly instead of ollie.agentState() (avoids hash lookup per agent per update) All data now flows from session/idx through m_sessions to QML with no callbacks into C++ during the update loop. --- gui/main.qml | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/gui/main.qml b/gui/main.qml index da7f4bf..742147e 100644 --- a/gui/main.qml +++ b/gui/main.qml @@ -126,6 +126,16 @@ ApplicationWindow { promptInput.forceActiveFocus() } + // Compute connection color from session data (avoids C++ call) + function computeConnectionColor(sess) { + var paused = sess.paused || false + var connected = sess.connected || false + if (paused && connected) return "yellow" // zombie + if (paused) return "gray" // intentionally paused + if (connected) return "green" // healthy + return "red" // crashed/broken + } + function appendSessionToModel(sess) { var sessionId = sess.id || "" var sessionName = sess.name || sessionId @@ -144,19 +154,19 @@ ApplicationWindow { model: sess.model || "", displayName: displayLabel, baseName: sessionName, - connectionColor: ollie.sessionConnectionColor(sessionId) + connectionColor: computeConnectionColor(sess) }) var agentIds = [] for (var j = 0; j < agents.length; ++j) { var agent = agents[j] - var liveState = ollie.agentState(sessionId, agent.id) + // Use state from session/idx data directly (already contains agent state) sessionTreeModel.append({ type: "agent", parentId: sessionId, agentId: agent.id, level: 1, - state: liveState || agent.state || "idle", + state: agent.state || "idle", connected: agent.connected, displayName: agent.name }) @@ -242,12 +252,12 @@ ApplicationWindow { var agentCount = agents.length var displayLabel = agentCount > 0 ? sessionName + " (" + agentCount + ")" : sessionName - // Update session properties + // Update session properties (use QML-computed color, avoids C++ call) sessionTreeModel.setProperty(sessionIdx, "displayName", displayLabel) sessionTreeModel.setProperty(sessionIdx, "baseName", sessionName) sessionTreeModel.setProperty(sessionIdx, "state", sess.state || "") sessionTreeModel.setProperty(sessionIdx, "model", sess.model || "") - sessionTreeModel.setProperty(sessionIdx, "connectionColor", ollie.sessionConnectionColor(sessionId)) + sessionTreeModel.setProperty(sessionIdx, "connectionColor", computeConnectionColor(sess)) // Build agent lookup var newAgentIds = {} @@ -262,10 +272,9 @@ ApplicationWindow { if (item.type === "session") break if (item.type === "agent" && item.parentId === sessionId) { if (newAgentIds[item.agentId]) { - // Update agent + // Update agent - use state from session/idx directly var agent = newAgentIds[item.agentId] - var liveState = ollie.agentState(sessionId, agent.id) - sessionTreeModel.setProperty(idx, "state", liveState || agent.state || "idle") + sessionTreeModel.setProperty(idx, "state", agent.state || "idle") sessionTreeModel.setProperty(idx, "connected", agent.connected) sessionTreeModel.setProperty(idx, "displayName", agent.name) } else { @@ -293,13 +302,13 @@ ApplicationWindow { if (oldAgentIds[n] === ag.id) { found = true; break } } if (!found) { - var liveState2 = ollie.agentState(sessionId, ag.id) + // Use state from session/idx directly sessionTreeModel.insert(insertIdx, { type: "agent", parentId: sessionId, agentId: ag.id, level: 1, - state: liveState2 || ag.state || "idle", + state: ag.state || "idle", connected: ag.connected, displayName: ag.name })