]> git.cworth.org Git - apitrace/blobdiff - gui/apitrace.cpp
Implement jump to.
[apitrace] / gui / apitrace.cpp
index 51520c5e85df38cb2305914b7e798e714355cadc..7a04756bc26fab1f8160a2c4d4cb625f165fd508 100644 (file)
@@ -33,6 +33,18 @@ ApiTrace::ApiTrace()
             SIGNAL(searchResult(ApiTrace::SearchResult,ApiTraceCall*)),
             this,
             SLOT(loaderSearchResult(ApiTrace::SearchResult,ApiTraceCall*)));
+    connect(this, SIGNAL(loaderFindFrameStart(ApiTraceFrame*)),
+            m_loader, SLOT(findFrameStart(ApiTraceFrame*)));
+    connect(this, SIGNAL(loaderFindFrameEnd(ApiTraceFrame*)),
+            m_loader, SLOT(findFrameEnd(ApiTraceFrame*)));
+    connect(m_loader, SIGNAL(foundFrameStart(ApiTraceFrame*)),
+            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()),
@@ -418,4 +430,64 @@ void ApiTrace::loaderSearchResult(ApiTrace::SearchResult result,
     emit findResult(result, call);
 }
 
+void ApiTrace::findFrameStart(ApiTraceFrame *frame)
+{
+    if (frame->loaded()) {
+        emit foundFrameStart(frame);
+    } else {
+        emit loaderFindFrameStart(frame);
+    }
+}
+
+void ApiTrace::findFrameEnd(ApiTraceFrame *frame)
+{
+    if (frame->loaded()) {
+        emit foundFrameEnd(frame);
+    } else {
+        emit loaderFindFrameEnd(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"