]> git.cworth.org Git - apitrace/blobdiff - gui/mainwindow.cpp
Don't clear the trace when the file selection has been cancelled.
[apitrace] / gui / mainwindow.cpp
index 9a50510ccbfaaeb5ac4bf0e6f6275001b33b795e..877c93d41b5fc1259882cc2d70d80e7966be9032 100644 (file)
@@ -74,9 +74,9 @@ void MainWindow::openTrace()
             QDir::homePath(),
             tr("Trace Files (*.trace)"));
 
-    qDebug()<< "File name : " <<fileName;
-
-    newTraceFile(fileName);
+    if (!fileName.isEmpty() && QFile::exists(fileName)) {
+        newTraceFile(fileName);
+    }
 }
 
 void MainWindow::loadTrace(const QString &fileName)
@@ -86,9 +86,7 @@ void MainWindow::loadTrace(const QString &fileName)
                              tr("File '%1' doesn't exist.").arg(fileName));
         return;
     }
-    qDebug()<< "Loading  : " <<fileName;
 
-    m_progressBar->setValue(0);
     newTraceFile(fileName);
 }
 
@@ -177,6 +175,9 @@ void MainWindow::replayStop()
 
 void MainWindow::newTraceFile(const QString &fileName)
 {
+    qDebug()<< "Loading  : " <<fileName;
+
+    m_progressBar->setValue(0);
     m_trace->setFileName(fileName);
 
     if (fileName.isEmpty()) {
@@ -260,12 +261,12 @@ void MainWindow::replayTrace(bool dumpState)
         } else if (m_selectedEvent->type() == ApiTraceEvent::Frame) {
             ApiTraceFrame *frame =
                 static_cast<ApiTraceFrame*>(m_selectedEvent);
-            if (frame->calls.isEmpty()) {
+            if (frame->isEmpty()) {
                 //XXX i guess we could still get the current state
                 qDebug()<<"tried to get a state for an empty frame";
                 return;
             }
-            index = frame->calls.first()->index();
+            index = frame->calls().first()->index();
         } else {
             qDebug()<<"Unknown event type";
             return;
@@ -306,6 +307,11 @@ void MainWindow::lookupState()
 
 MainWindow::~MainWindow()
 {
+    delete m_trace;
+    m_trace = 0;
+
+    delete m_proxyModel;
+    delete m_model;
 }
 
 static void
@@ -564,6 +570,16 @@ void MainWindow::showSelectedSurface()
     QVariant var = item->data(0, Qt::UserRole);
     QImage img = var.value<QImage>();
     ImageViewer *viewer = new ImageViewer(this);
+
+    QString title;
+    if (currentCall()) {
+        title = tr("QApiTrace - Surface at %1 (%2)")
+                .arg(currentCall()->name())
+                .arg(currentCall()->index());
+    } else {
+        title = tr("QApiTrace - Surface Viewer");
+    }
+    viewer->setWindowTitle(title);
     viewer->setAttribute(Qt::WA_DeleteOnClose, true);
     viewer->setImage(img);
     QRect screenRect = QApplication::desktop()->availableGeometry();
@@ -602,7 +618,8 @@ void MainWindow::initObjects()
     m_proxyModel = new ApiTraceFilter();
     m_proxyModel->setSourceModel(m_model);
     m_ui.callView->setModel(m_proxyModel);
-    m_ui.callView->setItemDelegate(new ApiCallDelegate);
+    m_ui.callView->setItemDelegate(
+        new ApiCallDelegate(m_ui.callView));
     m_ui.callView->resizeColumnToContents(0);
     m_ui.callView->header()->swapSections(0, 1);
     m_ui.callView->setColumnWidth(1, 42);
@@ -785,7 +802,8 @@ void MainWindow::slotSearch()
     m_searchWidget->show();
 }
 
-void MainWindow::slotSearchNext(const QString &str, Qt::CaseSensitivity sensitivity)
+void MainWindow::slotSearchNext(const QString &str,
+                                Qt::CaseSensitivity sensitivity)
 {
     QModelIndex index = m_ui.callView->currentIndex();
     ApiTraceEvent *event = 0;
@@ -808,7 +826,7 @@ void MainWindow::slotSearchNext(const QString &str, Qt::CaseSensitivity sensitiv
     else {
         Q_ASSERT(event->type() == ApiTraceCall::Frame);
         ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
-        call = frame->calls.value(0);
+        call = frame->call(0);
     }
 
     if (!call) {
@@ -820,12 +838,12 @@ void MainWindow::slotSearchNext(const QString &str, Qt::CaseSensitivity sensitiv
 
     for (int i = callNum + 1; i < calls.count(); ++i) {
         ApiTraceCall *testCall = calls[i];
-        QString txt = testCall->filterText();
-        if (txt.contains(str, sensitivity)) {
-            QModelIndex index = m_proxyModel->indexForCall(testCall);
-            /* if it's not valid it means that the proxy model has already
-             * filtered it out */
-            if (index.isValid()) {
+        QModelIndex index = m_proxyModel->indexForCall(testCall);
+        /* if it's not valid it means that the proxy model has already
+         * filtered it out */
+        if (index.isValid()) {
+            QString txt = testCall->filterText();
+            if (txt.contains(str, sensitivity)) {
                 m_ui.callView->setCurrentIndex(index);
                 m_searchWidget->setFound(true);
                 return;
@@ -835,7 +853,8 @@ void MainWindow::slotSearchNext(const QString &str, Qt::CaseSensitivity sensitiv
     m_searchWidget->setFound(false);
 }
 
-void MainWindow::slotSearchPrev(const QString &str, Qt::CaseSensitivity sensitivity)
+void MainWindow::slotSearchPrev(const QString &str,
+                                Qt::CaseSensitivity sensitivity)
 {
     QModelIndex index = m_ui.callView->currentIndex();
     ApiTraceEvent *event = 0;
@@ -858,7 +877,7 @@ void MainWindow::slotSearchPrev(const QString &str, Qt::CaseSensitivity sensitiv
     else {
         Q_ASSERT(event->type() == ApiTraceCall::Frame);
         ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(event);
-        call = frame->calls.value(0);
+        call = frame->call(0);
     }
 
     if (!call) {
@@ -870,12 +889,12 @@ void MainWindow::slotSearchPrev(const QString &str, Qt::CaseSensitivity sensitiv
 
     for (int i = callNum - 1; i >= 0; --i) {
         ApiTraceCall *testCall = calls[i];
-        QString txt = testCall->filterText();
-        if (txt.contains(str, sensitivity)) {
-            QModelIndex index = m_proxyModel->indexForCall(testCall);
-            /* if it's not valid it means that the proxy model has already
-             * filtered it out */
-            if (index.isValid()) {
+        QModelIndex index = m_proxyModel->indexForCall(testCall);
+        /* if it's not valid it means that the proxy model has already
+         * filtered it out */
+        if (index.isValid()) {
+            QString txt = testCall->filterText();
+            if (txt.contains(str, sensitivity)) {
                 m_ui.callView->setCurrentIndex(index);
                 m_searchWidget->setFound(true);
                 return;
@@ -964,14 +983,15 @@ void MainWindow::slotSaved()
 void MainWindow::slotGoFrameStart()
 {
     ApiTraceFrame *frame = currentFrame();
-    if (!frame || frame->calls.isEmpty()) {
+    if (!frame || frame->isEmpty()) {
         return;
     }
 
     QList<ApiTraceCall*>::const_iterator itr;
+    QList<ApiTraceCall*> calls = frame->calls();
 
-    itr = frame->calls.constBegin();
-    while (itr != frame->calls.constEnd()) {
+    itr = calls.constBegin();
+    while (itr != calls.constEnd()) {
         ApiTraceCall *call = *itr;
         QModelIndex idx = m_proxyModel->indexForCall(call);
         if (idx.isValid()) {
@@ -985,12 +1005,13 @@ void MainWindow::slotGoFrameStart()
 void MainWindow::slotGoFrameEnd()
 {
     ApiTraceFrame *frame = currentFrame();
-    if (!frame || frame->calls.isEmpty()) {
+    if (!frame || frame->isEmpty()) {
         return;
     }
     QList<ApiTraceCall*>::const_iterator itr;
+    QList<ApiTraceCall*> calls = frame->calls();
 
-    itr = frame->calls.constEnd();
+    itr = calls.constEnd();
     do {
         --itr;
         ApiTraceCall *call = *itr;
@@ -999,7 +1020,7 @@ void MainWindow::slotGoFrameEnd()
             m_ui.callView->setCurrentIndex(idx);
             break;
         }
-    } while (itr != frame->calls.constBegin());
+    } while (itr != calls.constBegin());
 }
 
 ApiTraceFrame * MainWindow::currentFrame() const
@@ -1060,4 +1081,13 @@ void MainWindow::slotErrorSelected(QTreeWidgetItem *current)
     }
 }
 
+ApiTraceCall * MainWindow::currentCall() const
+{
+    if (m_selectedEvent &&
+        m_selectedEvent->type() == ApiTraceEvent::Call) {
+        return static_cast<ApiTraceCall*>(m_selectedEvent);
+    }
+    return NULL;
+}
+
 #include "mainwindow.moc"