From: Zack Rusin Date: Tue, 13 Sep 2011 21:33:05 +0000 (-0400) Subject: Implement jump to. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=da7579b25c6bba1c6406d8b9382df126aca077f3;p=apitrace Implement jump to. --- diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index c8cb086..7a04756 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -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" diff --git a/gui/apitrace.h b/gui/apitrace.h index 8f5785e..0cb78b6 100644 --- a/gui/apitrace.h +++ b/gui/apitrace.h @@ -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 &frames); @@ -122,6 +124,7 @@ private slots: private: void detectFrames(); + int callInFrame(int callIdx) const; private: QString m_fileName; QString m_tempFileName; diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index b26514d..4063bf0 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -1001,6 +1001,18 @@ ApiTraceCall * ApiTraceFrame::call(int idx) const return m_calls.value(idx); } + +ApiTraceCall * ApiTraceFrame::callWithIndex(int index) const +{ + QVector::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); diff --git a/gui/apitracecall.h b/gui/apitracecall.h index adfa1b0..0ca49ba 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -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 calls() const; void setCalls(const QVector &calls, diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 7d4cab8..7644e00 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -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" diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 27e837a..0e1b3a2 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -77,6 +77,7 @@ private slots: ApiTraceCall *call); void slotFoundFrameStart(ApiTraceFrame *frame); void slotFoundFrameEnd(ApiTraceFrame *frame); + void slotJumpToResult(ApiTraceCall *call); private: void initObjects(); diff --git a/gui/traceloader.cpp b/gui/traceloader.cpp index ec392fb..7bd7dbd 100644 --- a/gui/traceloader.cpp +++ b/gui/traceloader.cpp @@ -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 calls = fetchFrameContents(frame); + QVector::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" diff --git a/gui/traceloader.h b/gui/traceloader.h index 929317c..4b88ec6 100644 --- a/gui/traceloader.h +++ b/gui/traceloader.h @@ -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()