]> git.cworth.org Git - apitrace/commitdiff
Implement jump to.
authorZack Rusin <zack@kde.org>
Tue, 13 Sep 2011 21:33:05 +0000 (17:33 -0400)
committerZack Rusin <zack@kde.org>
Tue, 13 Sep 2011 21:33:05 +0000 (17:33 -0400)
gui/apitrace.cpp
gui/apitrace.h
gui/apitracecall.cpp
gui/apitracecall.h
gui/mainwindow.cpp
gui/mainwindow.h
gui/traceloader.cpp
gui/traceloader.h

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"
index 8f5785e092a39ff7bab3d33b026fdd6973f71815..0cb78b651bd1ad6eca8774f42f7816a1ea01a8d3 100644 (file)
@@ -75,6 +75,7 @@ public slots:
                   Qt::CaseSensitivity sensitivity);
     void findFrameStart(ApiTraceFrame *frame);
     void findFrameEnd(ApiTraceFrame *frame);
+    void findCallIndex(int index);
 
 
 signals:
@@ -98,7 +99,7 @@ signals:
     void endLoadingFrame(ApiTraceFrame *frame);
     void foundFrameStart(ApiTraceFrame *frame);
     void foundFrameEnd(ApiTraceFrame *frame);
-
+    void foundCallIndex(ApiTraceCall *call);
 
 signals:
     void loaderSearchNext(int startFrame,
@@ -109,6 +110,7 @@ signals:
                           Qt::CaseSensitivity sensitivity);
     void loaderFindFrameStart(ApiTraceFrame *frame);
     void loaderFindFrameEnd(ApiTraceFrame *frame);
+    void loaderFindCallIndex(int index);
 
 private slots:
     void addFrames(const QList<ApiTraceFrame*> &frames);
@@ -122,6 +124,7 @@ private slots:
 
 private:
     void detectFrames();
+    int callInFrame(int callIdx) const;
 private:
     QString m_fileName;
     QString m_tempFileName;
index b26514dd3464851e22b8eb020295e05b462b6dfa..4063bf0c283cab627f1df0898c96bcf6955618f7 100644 (file)
@@ -1001,6 +1001,18 @@ ApiTraceCall * ApiTraceFrame::call(int idx) const
     return m_calls.value(idx);
 }
 
+
+ApiTraceCall * ApiTraceFrame::callWithIndex(int index) const
+{
+    QVector<ApiTraceCall*>::const_iterator itr;
+    for (itr = m_calls.constBegin(); itr != m_calls.constEnd(); ++itr) {
+        if ((*itr)->index() == index) {
+            return *itr;
+        }
+    }
+    return 0;
+}
+
 int ApiTraceFrame::callIndex(ApiTraceCall *call) const
 {
     return m_calls.indexOf(call);
index adfa1b051d0cb289b8ac3b227effdd5554d65f98..0ca49ba934e513d810e4ef2892d9141899da1e56 100644 (file)
@@ -304,6 +304,7 @@ public:
 
     int callIndex(ApiTraceCall *call) const;
     ApiTraceCall *call(int idx) const;
+    ApiTraceCall *callWithIndex(int index) const;
     void addCall(ApiTraceCall *call);
     QVector<ApiTraceCall*> calls() const;
     void setCalls(const QVector<ApiTraceCall*> &calls,
index 7d4cab8f7e064b5d9d6baa4476b2cdb19a345782..7644e0017f3abaf7ef438cae75d1ebd82006f589 100644 (file)
@@ -698,6 +698,8 @@ void MainWindow::initConnections()
             this, SLOT(slotFoundFrameStart(ApiTraceFrame*)));
     connect(m_trace, SIGNAL(foundFrameEnd(ApiTraceFrame*)),
             this, SLOT(slotFoundFrameEnd(ApiTraceFrame*)));
+    connect(m_trace, SIGNAL(foundCallIndex(ApiTraceCall*)),
+            this, SLOT(slotJumpToResult(ApiTraceCall*)));
 
     connect(m_retracer, SIGNAL(finished(const QString&)),
             this, SLOT(replayFinished(const QString&)));
@@ -808,10 +810,7 @@ void MainWindow::slotGoTo()
 
 void MainWindow::slotJumpTo(int callNum)
 {
-    QModelIndex index = m_proxyModel->callIndex(callNum);
-    if (index.isValid()) {
-        m_ui.callView->setCurrentIndex(index);
-    }
+    m_trace->findCallIndex(callNum);
 }
 
 void MainWindow::createdTrace(const QString &path)
@@ -1197,4 +1196,12 @@ void MainWindow::slotFoundFrameEnd(ApiTraceFrame *frame)
     } while (itr != calls.constBegin());
 }
 
+void MainWindow::slotJumpToResult(ApiTraceCall *call)
+{
+    QModelIndex index = m_proxyModel->indexForCall(call);
+    if (index.isValid()) {
+        m_ui.callView->setCurrentIndex(index);
+    }
+}
+
 #include "mainwindow.moc"
index 27e837adc44d94fdd185a08af767d63e792875d8..0e1b3a2038774c29eed725de72eee16866504264 100644 (file)
@@ -77,6 +77,7 @@ private slots:
                           ApiTraceCall *call);
     void slotFoundFrameStart(ApiTraceFrame *frame);
     void slotFoundFrameEnd(ApiTraceFrame *frame);
+    void slotJumpToResult(ApiTraceCall *call);
 
 private:
     void initObjects();
index ec392fb58467f5608d21e1ab5cd5f31d37b50f5a..7bd7dbd56a462614fe44d701fc597f036f5d6ab8 100644 (file)
@@ -466,4 +466,20 @@ void TraceLoader::findFrameEnd(ApiTraceFrame *frame)
     emit foundFrameEnd(frame);
 }
 
+void TraceLoader::findCallIndex(int index)
+{
+    int frameIdx = callInFrame(index);
+    ApiTraceFrame *frame = m_createdFrames[frameIdx];
+    QVector<ApiTraceCall*> calls = fetchFrameContents(frame);
+    QVector<ApiTraceCall*>::const_iterator itr;
+    ApiTraceCall *call = 0;
+    for (itr = calls.constBegin(); itr != calls.constEnd(); ++itr) {
+        if ((*itr)->index() == index) {
+            call = *itr;
+        }
+    }
+    Q_ASSERT(call);
+    emit foundCallIndex(call);
+}
+
 #include "traceloader.moc"
index 929317ca14f5bc38322a098a3076d3808b9a7588..4b88ec605041527e2c9464e1aabbc9ee9cd484da 100644 (file)
@@ -36,6 +36,7 @@ public slots:
                     Qt::CaseSensitivity sensitivity);
     void findFrameStart(ApiTraceFrame *frame);
     void findFrameEnd(ApiTraceFrame *frame);
+    void findCallIndex(int index);
 
 signals:
     void startedParsing();
@@ -50,6 +51,7 @@ signals:
     void searchResult(ApiTrace::SearchResult result, ApiTraceCall *call);
     void foundFrameStart(ApiTraceFrame *frame);
     void foundFrameEnd(ApiTraceFrame *frame);
+    void foundCallIndex(ApiTraceCall *call);
 private:
     struct FrameBookmark {
         FrameBookmark()