]> git.cworth.org Git - apitrace/blobdiff - gui/mainwindow.cpp
Highly optimize searching and fix a crash.
[apitrace] / gui / mainwindow.cpp
index 35c287ac2af78e10a2a4cc74db802f8e388899ee..ff51d956be5150c6aed258393ce2fc4bff4a3854 100644 (file)
@@ -650,8 +650,19 @@ void MainWindow::slotSearch()
 void MainWindow::slotSearchNext(const QString &str, Qt::CaseSensitivity sensitivity)
 {
     QModelIndex index = m_ui.callView->currentIndex();
-    ApiTraceEvent *event =
-        index.data(ApiTraceModel::EventRole).value<ApiTraceEvent*>();
+    ApiTraceEvent *event = 0;
+
+
+    if (!index.isValid()) {
+        index = m_proxyModel->index(0, 0, QModelIndex());
+        if (!index.isValid()) {
+            qDebug()<<"no currently valid index";
+            m_searchWidget->setFound(false);
+            return;
+        }
+    }
+
+    event = index.data(ApiTraceModel::EventRole).value<ApiTraceEvent*>();
     ApiTraceCall *call = 0;
 
     if (event->type() == ApiTraceCall::Call)
@@ -673,7 +684,7 @@ void MainWindow::slotSearchNext(const QString &str, Qt::CaseSensitivity sensitiv
         ApiTraceCall *testCall = calls[i];
         QString txt = testCall->filterText();
         if (txt.contains(str, sensitivity)) {
-            QModelIndex index = m_proxyModel->callIndex(testCall->index);
+            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()) {
@@ -689,8 +700,19 @@ void MainWindow::slotSearchNext(const QString &str, Qt::CaseSensitivity sensitiv
 void MainWindow::slotSearchPrev(const QString &str, Qt::CaseSensitivity sensitivity)
 {
     QModelIndex index = m_ui.callView->currentIndex();
-    ApiTraceEvent *event =
-        index.data(ApiTraceModel::EventRole).value<ApiTraceEvent*>();
+    ApiTraceEvent *event = 0;
+
+
+    if (!index.isValid()) {
+        index = m_proxyModel->index(0, 0, QModelIndex());
+        if (!index.isValid()) {
+            qDebug()<<"no currently valid index";
+            m_searchWidget->setFound(false);
+            return;
+        }
+    }
+
+    event = index.data(ApiTraceModel::EventRole).value<ApiTraceEvent*>();
     ApiTraceCall *call = 0;
 
     if (event->type() == ApiTraceCall::Call)
@@ -712,7 +734,7 @@ void MainWindow::slotSearchPrev(const QString &str, Qt::CaseSensitivity sensitiv
         ApiTraceCall *testCall = calls[i];
         QString txt = testCall->filterText();
         if (txt.contains(str, sensitivity)) {
-            QModelIndex index = m_proxyModel->callIndex(testCall->index);
+            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()) {