]> git.cworth.org Git - apitrace/blobdiff - gui/apitrace.cpp
Implement jump to.
[apitrace] / gui / apitrace.cpp
index c8cb0860bc87ce710da0be504cae706b9ae7538b..7a04756bc26fab1f8160a2c4d4cb625f165fd508 100644 (file)
@@ -41,6 +41,10 @@ ApiTrace::ApiTrace()
             this, SIGNAL(foundFrameStart(ApiTraceFrame*)));
     connect(m_loader, SIGNAL(foundFrameEnd(ApiTraceFrame*)),
             this, SIGNAL(foundFrameEnd(ApiTraceFrame*)));
+    connect(this, SIGNAL(loaderFindCallIndex(int)),
+            m_loader, SLOT(findCallIndex(int)));
+    connect(m_loader, SIGNAL(foundCallIndex(ApiTraceCall*)),
+            this, SIGNAL(foundCallIndex(ApiTraceCall*)));
 
 
     connect(m_loader, SIGNAL(startedParsing()),
@@ -444,4 +448,46 @@ void ApiTrace::findFrameEnd(ApiTraceFrame *frame)
     }
 }
 
+void ApiTrace::findCallIndex(int index)
+{
+    int frameIdx = callInFrame(index);
+    ApiTraceFrame *frame = 0;
+
+    if (frameIdx < 0) {
+        emit foundCallIndex(0);
+        return;
+    }
+
+    frame = m_frames[frameIdx];
+
+    if (frame) {
+        if (frame->loaded()) {
+            ApiTraceCall *call = frame->callWithIndex(index);
+            emit foundCallIndex(call);
+        } else {
+            emit loaderFindCallIndex(index);
+        }
+    }
+}
+
+int ApiTrace::callInFrame(int callIdx) const
+{
+    unsigned numCalls = 0;
+
+    for (int frameIdx = 0; frameIdx <= m_frames.size(); ++frameIdx) {
+        const ApiTraceFrame *frame = m_frames[frameIdx];
+        unsigned numCallsInFrame =  frame->loaded()
+                ? frame->numChildren()
+                : frame->numChildrenToLoad();
+        unsigned firstCall = numCalls;
+        unsigned endCall = numCalls + numCallsInFrame;
+        if (firstCall <= callIdx && endCall > callIdx) {
+            return frameIdx;
+        }
+        numCalls = endCall;
+    }
+
+    return -1;
+}
+
 #include "apitrace.moc"