]> git.cworth.org Git - apitrace/commitdiff
Implement goto start of the frame and goto end of the frame.
authorZack Rusin <zack@kde.org>
Tue, 13 Sep 2011 06:23:39 +0000 (02:23 -0400)
committerZack Rusin <zack@kde.org>
Tue, 13 Sep 2011 06:23:39 +0000 (02:23 -0400)
gui/apitrace.cpp
gui/apitrace.h
gui/mainwindow.cpp
gui/mainwindow.h
gui/traceloader.cpp
gui/traceloader.h

index 51520c5e85df38cb2305914b7e798e714355cadc..c8cb0860bc87ce710da0be504cae706b9ae7538b 100644 (file)
@@ -33,6 +33,14 @@ 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(m_loader, SIGNAL(startedParsing()),
@@ -418,4 +426,22 @@ 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);
+    }
+}
+
 #include "apitrace.moc"
index 3edffef700d573c87a5b2386b860b834bc04fd3a..8f5785e092a39ff7bab3d33b026fdd6973f71815 100644 (file)
@@ -73,6 +73,8 @@ public slots:
                   ApiTraceCall *call,
                   const QString &str,
                   Qt::CaseSensitivity sensitivity);
+    void findFrameStart(ApiTraceFrame *frame);
+    void findFrameEnd(ApiTraceFrame *frame);
 
 
 signals:
@@ -94,6 +96,8 @@ signals:
     void callsAdded(int oldCount, int numAdded);
     void beginLoadingFrame(ApiTraceFrame *frame, int numAdded);
     void endLoadingFrame(ApiTraceFrame *frame);
+    void foundFrameStart(ApiTraceFrame *frame);
+    void foundFrameEnd(ApiTraceFrame *frame);
 
 
 signals:
@@ -103,6 +107,8 @@ signals:
     void loaderSearchPrev(int startFrame,
                           const QString &str,
                           Qt::CaseSensitivity sensitivity);
+    void loaderFindFrameStart(ApiTraceFrame *frame);
+    void loaderFindFrameEnd(ApiTraceFrame *frame);
 
 private slots:
     void addFrames(const QList<ApiTraceFrame*> &frames);
index 9dc530dbf822385f31a8304fd69a8725a38770c1..7d4cab8f7e064b5d9d6baa4476b2cdb19a345782 100644 (file)
@@ -694,6 +694,10 @@ void MainWindow::initConnections()
             this, SLOT(slotTraceChanged(ApiTraceCall*)));
     connect(m_trace, SIGNAL(findResult(ApiTrace::SearchResult,ApiTraceCall*)),
             this, SLOT(slotSearchResult(ApiTrace::SearchResult,ApiTraceCall*)));
+    connect(m_trace, SIGNAL(foundFrameStart(ApiTraceFrame*)),
+            this, SLOT(slotFoundFrameStart(ApiTraceFrame*)));
+    connect(m_trace, SIGNAL(foundFrameEnd(ApiTraceFrame*)),
+            this, SLOT(slotFoundFrameEnd(ApiTraceFrame*)));
 
     connect(m_retracer, SIGNAL(finished(const QString&)),
             this, SLOT(replayFinished(const QString&)));
@@ -930,45 +934,26 @@ void MainWindow::slotSaved()
 
 void MainWindow::slotGoFrameStart()
 {
-    ApiTraceFrame *frame = selectedFrame();
-    if (!frame || frame->isEmpty()) {
-        return;
-    }
-
-    QVector<ApiTraceCall*>::const_iterator itr;
-    QVector<ApiTraceCall*> calls = frame->calls();
+    ApiTraceFrame *frame = currentFrame();
+    ApiTraceCall *call = currentCall();
 
-    itr = calls.constBegin();
-    while (itr != calls.constEnd()) {
-        ApiTraceCall *call = *itr;
-        QModelIndex idx = m_proxyModel->indexForCall(call);
-        if (idx.isValid()) {
-            m_ui.callView->setCurrentIndex(idx);
-            break;
-        }
-        ++itr;
+    if (!frame && call) {
+        frame = call->parentFrame();
     }
+
+    m_trace->findFrameStart(frame);
 }
 
 void MainWindow::slotGoFrameEnd()
 {
-    ApiTraceFrame *frame = selectedFrame();
-    if (!frame || frame->isEmpty()) {
-        return;
+    ApiTraceFrame *frame = currentFrame();
+    ApiTraceCall *call = currentCall();
+
+    if (!frame && call) {
+        frame = call->parentFrame();
     }
-    QVector<ApiTraceCall*>::const_iterator itr;
-    QVector<ApiTraceCall*> calls = frame->calls();
 
-    itr = calls.constEnd();
-    do {
-        --itr;
-        ApiTraceCall *call = *itr;
-        QModelIndex idx = m_proxyModel->indexForCall(call);
-        if (idx.isValid()) {
-            m_ui.callView->setCurrentIndex(idx);
-            break;
-        }
-    } while (itr != calls.constBegin());
+    m_trace->findFrameEnd(frame);
 }
 
 ApiTraceFrame * MainWindow::selectedFrame() const
@@ -1169,4 +1154,47 @@ ApiTraceCall * MainWindow::currentCall() const
 
 }
 
+void MainWindow::slotFoundFrameStart(ApiTraceFrame *frame)
+{
+    Q_ASSERT(frame->loaded());
+    if (!frame || frame->isEmpty()) {
+        return;
+    }
+
+    QVector<ApiTraceCall*>::const_iterator itr;
+    QVector<ApiTraceCall*> calls = frame->calls();
+
+    itr = calls.constBegin();
+    while (itr != calls.constEnd()) {
+        ApiTraceCall *call = *itr;
+        QModelIndex idx = m_proxyModel->indexForCall(call);
+        if (idx.isValid()) {
+            m_ui.callView->setCurrentIndex(idx);
+            break;
+        }
+        ++itr;
+    }
+}
+
+void MainWindow::slotFoundFrameEnd(ApiTraceFrame *frame)
+{
+    Q_ASSERT(frame->loaded());
+    if (!frame || frame->isEmpty()) {
+        return;
+    }
+    QVector<ApiTraceCall*>::const_iterator itr;
+    QVector<ApiTraceCall*> calls = frame->calls();
+
+    itr = calls.constEnd();
+    do {
+        --itr;
+        ApiTraceCall *call = *itr;
+        QModelIndex idx = m_proxyModel->indexForCall(call);
+        if (idx.isValid()) {
+            m_ui.callView->setCurrentIndex(idx);
+            break;
+        }
+    } while (itr != calls.constBegin());
+}
+
 #include "mainwindow.moc"
index e5b19b44b14b68b90000a9f1e60ce1dff01756ac..27e837adc44d94fdd185a08af767d63e792875d8 100644 (file)
@@ -75,6 +75,8 @@ private slots:
     void slotErrorSelected(QTreeWidgetItem *current);
     void slotSearchResult(ApiTrace::SearchResult result,
                           ApiTraceCall *call);
+    void slotFoundFrameStart(ApiTraceFrame *frame);
+    void slotFoundFrameEnd(ApiTraceFrame *frame);
 
 private:
     void initObjects();
index 41d4a9bebe6b736ca5dd30039c365cbed60240c0..ec392fb58467f5608d21e1ab5cd5f31d37b50f5a 100644 (file)
@@ -454,4 +454,16 @@ TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame)
     return QVector<ApiTraceCall*>();
 }
 
+void TraceLoader::findFrameStart(ApiTraceFrame *frame)
+{
+    loadFrame(frame);
+    emit foundFrameStart(frame);
+}
+
+void TraceLoader::findFrameEnd(ApiTraceFrame *frame)
+{
+    loadFrame(frame);
+    emit foundFrameEnd(frame);
+}
+
 #include "traceloader.moc"
index bcbc03b90e990ffffb6cc5fa16ddc7ba9ce24f4b..929317ca14f5bc38322a098a3076d3808b9a7588 100644 (file)
@@ -34,6 +34,8 @@ public slots:
     void searchPrev(int startFrame,
                     const QString &str,
                     Qt::CaseSensitivity sensitivity);
+    void findFrameStart(ApiTraceFrame *frame);
+    void findFrameEnd(ApiTraceFrame *frame);
 
 signals:
     void startedParsing();
@@ -46,6 +48,8 @@ signals:
                              quint64 binaryDataSize);
 
     void searchResult(ApiTrace::SearchResult result, ApiTraceCall *call);
+    void foundFrameStart(ApiTraceFrame *frame);
+    void foundFrameEnd(ApiTraceFrame *frame);
 private:
     struct FrameBookmark {
         FrameBookmark()