From: Zack Rusin Date: Tue, 13 Sep 2011 06:23:39 +0000 (-0400) Subject: Implement goto start of the frame and goto end of the frame. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=93e4d1569ac411912ddb2c15b9b130af0171f049;p=apitrace Implement goto start of the frame and goto end of the frame. --- diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index 51520c5..c8cb086 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -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" diff --git a/gui/apitrace.h b/gui/apitrace.h index 3edffef..8f5785e 100644 --- a/gui/apitrace.h +++ b/gui/apitrace.h @@ -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 &frames); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 9dc530d..7d4cab8 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -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::const_iterator itr; - QVector 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::const_iterator itr; - QVector 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::const_iterator itr; + QVector 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::const_iterator itr; + QVector 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" diff --git a/gui/mainwindow.h b/gui/mainwindow.h index e5b19b4..27e837a 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -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(); diff --git a/gui/traceloader.cpp b/gui/traceloader.cpp index 41d4a9b..ec392fb 100644 --- a/gui/traceloader.cpp +++ b/gui/traceloader.cpp @@ -454,4 +454,16 @@ TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame) return QVector(); } +void TraceLoader::findFrameStart(ApiTraceFrame *frame) +{ + loadFrame(frame); + emit foundFrameStart(frame); +} + +void TraceLoader::findFrameEnd(ApiTraceFrame *frame) +{ + loadFrame(frame); + emit foundFrameEnd(frame); +} + #include "traceloader.moc" diff --git a/gui/traceloader.h b/gui/traceloader.h index bcbc03b..929317c 100644 --- a/gui/traceloader.h +++ b/gui/traceloader.h @@ -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()