+void MainWindow::slotGoFrameStart()
+{
+ ApiTraceFrame *frame = currentFrame();
+ if (!frame || frame->calls.isEmpty()) {
+ return;
+ }
+
+ QList<ApiTraceCall*>::const_iterator itr;
+
+ itr = frame->calls.constBegin();
+ while (itr != frame->calls.constEnd()) {
+ ApiTraceCall *call = *itr;
+ QModelIndex idx = m_proxyModel->indexForCall(call);
+ if (idx.isValid()) {
+ m_ui.callView->setCurrentIndex(idx);
+ break;
+ }
+ ++itr;
+ }
+}
+
+void MainWindow::slotGoFrameEnd()
+{
+ ApiTraceFrame *frame = currentFrame();
+ if (!frame || frame->calls.isEmpty()) {
+ return;
+ }
+ QList<ApiTraceCall*>::const_iterator itr;
+
+ itr = frame->calls.constEnd();
+ do {
+ --itr;
+ ApiTraceCall *call = *itr;
+ QModelIndex idx = m_proxyModel->indexForCall(call);
+ if (idx.isValid()) {
+ m_ui.callView->setCurrentIndex(idx);
+ break;
+ }
+ } while (itr != frame->calls.constBegin());
+}
+
+ApiTraceFrame * MainWindow::currentFrame() const
+{
+ if (m_selectedEvent) {
+ if (m_selectedEvent->type() == ApiTraceEvent::Frame) {
+ return static_cast<ApiTraceFrame*>(m_selectedEvent);
+ } else {
+ Q_ASSERT(m_selectedEvent->type() == ApiTraceEvent::Call);
+ ApiTraceCall *call = static_cast<ApiTraceCall*>(m_selectedEvent);
+ return call->parentFrame();
+ }
+ }
+ return NULL;
+}
+