+ menu.exec(QCursor::pos());
+}
+
+void MainWindow::editCall()
+{
+ if (m_selectedEvent && m_selectedEvent->type() == ApiTraceEvent::Call) {
+ ApiTraceCall *call = static_cast<ApiTraceCall*>(m_selectedEvent);
+ m_argsEditor->setCall(call);
+ m_argsEditor->show();
+ }
+}
+
+void MainWindow::slotStartedSaving()
+{
+ m_progressBar->show();
+ statusBar()->showMessage(
+ tr("Saving to %1").arg(m_trace->fileName()));
+}
+
+void MainWindow::slotSaved()
+{
+ statusBar()->showMessage(
+ tr("Saved to %1").arg(m_trace->fileName()), 2000);
+ m_progressBar->hide();
+}
+
+void MainWindow::slotGoFrameStart()
+{
+ ApiTraceFrame *frame = currentFrame();
+ ApiTraceCall *call = currentCall();
+
+ if (!frame && call) {
+ frame = call->parentFrame();
+ }
+
+ m_trace->findFrameStart(frame);
+}
+
+void MainWindow::slotGoFrameEnd()
+{
+ ApiTraceFrame *frame = currentFrame();
+ ApiTraceCall *call = currentCall();
+
+ if (!frame && call) {
+ frame = call->parentFrame();
+ }
+
+ m_trace->findFrameEnd(frame);
+}
+
+ApiTraceFrame * MainWindow::selectedFrame() 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;
+}
+
+void MainWindow::slotTraceChanged(ApiTraceEvent *event)
+{
+ Q_ASSERT(event);
+ if (event == m_selectedEvent) {
+ if (event->type() == ApiTraceEvent::Call) {
+ ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
+ m_ui.detailsWebView->setHtml(call->toHtml());
+ }
+ }
+}
+
+void MainWindow::slotRetraceErrors(const QList<ApiTraceError> &errors)
+{
+ m_ui.errorsTreeWidget->clear();
+
+ foreach(ApiTraceError error, errors) {
+ m_trace->setCallError(error);
+
+ QTreeWidgetItem *item =
+ new QTreeWidgetItem(m_ui.errorsTreeWidget);
+ item->setData(0, Qt::DisplayRole, error.callIndex);
+ item->setData(0, Qt::UserRole, error.callIndex);
+ QString type = error.type;
+ type[0] = type[0].toUpper();
+ item->setData(1, Qt::DisplayRole, type);
+ item->setData(2, Qt::DisplayRole, error.message);
+ }
+}
+
+void MainWindow::slotErrorSelected(QTreeWidgetItem *current)
+{
+ if (current) {
+ int callIndex =
+ current->data(0, Qt::UserRole).toInt();
+ m_trace->findCallIndex(callIndex);
+ }
+}
+
+ApiTraceCall * MainWindow::selectedCall() const
+{
+ if (m_selectedEvent &&
+ m_selectedEvent->type() == ApiTraceEvent::Call) {
+ return static_cast<ApiTraceCall*>(m_selectedEvent);
+ }
+ return NULL;
+}
+
+void MainWindow::saveSelectedSurface()
+{
+ QTreeWidgetItem *item =
+ m_ui.surfacesTreeWidget->currentItem();
+
+ if (!item || !m_trace) {