]> git.cworth.org Git - vogl/blobdiff - src/vogleditor/vogleditor_qapicalltreemodel.cpp
UI: Fix issue #20: Search in the editor really slow
[vogl] / src / vogleditor / vogleditor_qapicalltreemodel.cpp
index c89e1589c24d425f37a88ef11c249ee2a3e44149..e661f1cdd8fd217e0b5397711dfea99e49643c96 100644 (file)
@@ -72,8 +72,6 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
 
    m_trace_ctypes.init(pTrace_reader->get_sof_packet().m_pointer_sizes);
 
-   vogl_trace_packet trace_packet(&m_trace_ctypes);
-
    for ( ; ; )
    {
       vogl_trace_file_reader::trace_file_reader_status_t read_status = pTrace_reader->read_next_packet();
@@ -97,7 +95,9 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
 
       if (pTrace_reader->get_packet_type() == cTSPTGLEntrypoint)
       {
-         if (!trace_packet.deserialize(pTrace_reader->get_packet_buf().get_ptr(), pTrace_reader->get_packet_buf().size(), false))
+         vogl_trace_packet* pTrace_packet = vogl_new(vogl_trace_packet, &m_trace_ctypes);
+
+         if (!pTrace_packet->deserialize(pTrace_reader->get_packet_buf().get_ptr(), pTrace_reader->get_packet_buf().size(), false))
          {
             console::error("%s: Failed parsing GL entrypoint packet\n", VOGL_FUNCTION_NAME);
             break;
@@ -111,12 +111,12 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
             // Check if this is a state snapshot.
             // This is entirely optional since the client is designed to dynamically get new snapshots
             // if they don't exist.
-            GLuint cmd = trace_packet.get_param_value<GLuint>(0);
-            GLuint size = trace_packet.get_param_value<GLuint>(1); VOGL_NOTE_UNUSED(size);
+            GLuint cmd = pTrace_packet->get_param_value<GLuint>(0);
+            GLuint size = pTrace_packet->get_param_value<GLuint>(1); VOGL_NOTE_UNUSED(size);
 
             if (cmd == cITCRKeyValueMap)
             {
-               key_value_map &kvm = trace_packet.get_key_value_map();
+               key_value_map &kvm = pTrace_packet->get_key_value_map();
 
                dynamic_string cmd_type(kvm.get_string("command_type"));
                if (cmd_type == "state_snapshot")
@@ -172,23 +172,23 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
          // format parameters
          funcCall.append("( ");
          dynamic_string paramStr;
-         for (uint param_index = 0; param_index < trace_packet.total_params(); param_index++)
+         for (uint param_index = 0; param_index < pTrace_packet->total_params(); param_index++)
          {
             if (param_index != 0)
                funcCall.append(", ");
 
             paramStr.clear();
-            trace_packet.pretty_print_param(paramStr, param_index, false);
+            pTrace_packet->pretty_print_param(paramStr, param_index, false);
 
             funcCall.append(paramStr.c_str());
          }
          funcCall.append(" )");
 
-         if (trace_packet.has_return_value())
+         if (pTrace_packet->has_return_value())
          {
             funcCall.append(" = ");
             paramStr.clear();
-            trace_packet.pretty_print_return_value(paramStr, false);
+            pTrace_packet->pretty_print_return_value(paramStr, false);
             funcCall.append(paramStr.c_str());
          }
 
@@ -197,7 +197,7 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
          if (pCurFrame == NULL)
          {
             pCurFrame = new vogleditor_frameItem(total_swaps);
-            vogleditor_apiCallTreeItem* pNewFrameNode = new vogleditor_apiCallTreeItem(pCurFrame, pCurParent);
+            vogleditor_apiCallTreeItem* pNewFrameNode = vogl_new(vogleditor_apiCallTreeItem, pCurFrame, pCurParent);
             pCurParent->appendChild(pNewFrameNode);
             m_itemList.append(pNewFrameNode);
 
@@ -212,7 +212,7 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
          }
 
          // make item and node for the api call
-         vogleditor_apiCallItem* pCallItem = new vogleditor_apiCallItem(pCurFrame, trace_packet, *pGL_packet);
+         vogleditor_apiCallItem* pCallItem = vogl_new(vogleditor_apiCallItem, pCurFrame, pTrace_packet, *pGL_packet);
          pCurFrame->appendCall(pCallItem);
 
          if (pPendingSnapshot != NULL)
@@ -221,7 +221,7 @@ void vogleditor_QApiCallTreeModel::setupModelData(vogl_trace_file_reader* pTrace
             pPendingSnapshot = NULL;
          }
 
-         vogleditor_apiCallTreeItem* item = new vogleditor_apiCallTreeItem(funcCall, pCallItem, pCurParent);
+         vogleditor_apiCallTreeItem* item = vogl_new(vogleditor_apiCallTreeItem, funcCall, pCallItem, pCurParent);
          pCurParent->appendChild(item);
          m_itemList.append(item);
 
@@ -312,9 +312,23 @@ QVariant vogleditor_QApiCallTreeModel::data(const QModelIndex &index, int role)
     if (!index.isValid())
         return QVariant();
 
-    vogleditor_apiCallTreeItem *item = static_cast<vogleditor_apiCallTreeItem*>(index.internalPointer());
+    vogleditor_apiCallTreeItem* pItem = static_cast<vogleditor_apiCallTreeItem*>(index.internalPointer());
+
+    // highlight the API call cell if it has a substring which matches the searchString
+    if (role == Qt::BackgroundRole && index.column() == VOGL_ACTC_APICALL)
+    {
+        if (!m_searchString.isEmpty())
+        {
+            QVariant data = pItem->columnData(VOGL_ACTC_APICALL, Qt::DisplayRole);
+            QString string = data.toString();
+            if (string.contains(m_searchString, Qt::CaseInsensitive))
+            {
+                return QColor(Qt::yellow);
+            }
+        }
+    }
 
-    return item->columnData(index.column(), role);
+    return pItem->columnData(index.column(), role);
 }
 
 Qt::ItemFlags vogleditor_QApiCallTreeModel::flags(const QModelIndex &index) const
@@ -334,44 +348,35 @@ QVariant vogleditor_QApiCallTreeModel::headerData(int section, Qt::Orientation o
     return QVariant();
 }
 
-QModelIndexList vogleditor_QApiCallTreeModel::find_search_matches(const QString searchText)
+void vogleditor_QApiCallTreeModel::set_highlight_search_string(const QString searchString)
+{
+    m_searchString = searchString;
+}
+
+QModelIndex vogleditor_QApiCallTreeModel::find_prev_search_result(vogleditor_apiCallTreeItem* start, const QString searchText)
 {
     QLinkedListIterator<vogleditor_apiCallTreeItem*> iter(m_itemList);
 
-    QModelIndexList matches;
-    // iterate through all items and find matching text
-    while (iter.hasNext())
+    if (start != NULL)
     {
-        vogleditor_apiCallTreeItem* pItem = iter.peekNext();
-        QVariant data = pItem->columnData(VOGL_ACTC_APICALL, Qt::DisplayRole);
-        QString string = data.toString();
-        if (string.contains(searchText, Qt::CaseInsensitive))
+        if (iter.findNext(start) == false)
         {
-            matches.push_back(indexOf(pItem));
+            // the object wasn't found in the list, so return a default (invalid) item
+            return QModelIndex();
         }
 
-        iter.next();
+        // need to back up past the current item
+        iter.previous();
     }
-
-    return matches;
-}
-
-QModelIndex vogleditor_QApiCallTreeModel::find_prev_search_result(vogleditor_apiCallTreeItem* start, const QString searchText)
-{
-    QLinkedListIterator<vogleditor_apiCallTreeItem*> iter(m_itemList);
-
-    if (iter.findNext(start) == false)
+    else
     {
-        // the object wasn't found in the list, so just return the same item
-        return indexOf(start);
+        // set the iterator to the back so that searching starts from the end of the list
+        iter.toBack();
     }
 
-    // need to back up past the current item
-    iter.previous();
-
     // now the iterator is pointing to the desired start object in the list,
     // continually check the prev item and find one with a snapshot
-    vogleditor_apiCallTreeItem* pFound = start;
+    vogleditor_apiCallTreeItem* pFound = NULL;
     while (iter.hasPrevious())
     {
         vogleditor_apiCallTreeItem* pItem = iter.peekPrevious();
@@ -391,18 +396,20 @@ QModelIndex vogleditor_QApiCallTreeModel::find_prev_search_result(vogleditor_api
 
 QModelIndex vogleditor_QApiCallTreeModel::find_next_search_result(vogleditor_apiCallTreeItem* start, const QString searchText)
 {
-
     QLinkedListIterator<vogleditor_apiCallTreeItem*> iter(m_itemList);
 
-    if (iter.findNext(start) == false)
+    if (start != NULL)
     {
-        // the object wasn't found in the list, so just return the same item
-        return indexOf(start);
+        if (iter.findNext(start) == false)
+        {
+            // the object wasn't found in the list, so return a default (invalid) item
+            return QModelIndex();
+        }
     }
 
     // now the iterator is pointing to the desired start object in the list,
     // continually check the next item and find one with a snapshot
-    vogleditor_apiCallTreeItem* pFound = start;
+    vogleditor_apiCallTreeItem* pFound = NULL;
     while (iter.hasNext())
     {
         vogleditor_apiCallTreeItem* pItem = iter.peekNext();
@@ -424,18 +431,26 @@ vogleditor_apiCallTreeItem* vogleditor_QApiCallTreeModel::find_prev_snapshot(vog
 {
     QLinkedListIterator<vogleditor_apiCallTreeItem*> iter(m_itemList);
 
-    if (iter.findNext(start) == false)
+    if (start != NULL)
     {
-        // the object wasn't found in the list, so just return the same item
-        return start;
-    }
+        if (iter.findNext(start) == false)
+        {
+            // the object wasn't found in the list
+            return NULL;
+        }
 
-    // need to back up past the current item
-    iter.previous();
+        // need to back up past the current item
+        iter.previous();
+    }
+    else
+    {
+        // set the iterator to the back so that searching starts from the end of the list
+        iter.toBack();
+    }
 
     // now the iterator is pointing to the desired start object in the list,
     // continually check the prev item and find one with a snapshot
-    vogleditor_apiCallTreeItem* pFound = start;
+    vogleditor_apiCallTreeItem* pFound = NULL;
     while (iter.hasPrevious())
     {
         if (iter.peekPrevious()->has_snapshot())
@@ -454,15 +469,19 @@ vogleditor_apiCallTreeItem* vogleditor_QApiCallTreeModel::find_next_snapshot(vog
 {
     QLinkedListIterator<vogleditor_apiCallTreeItem*> iter(m_itemList);
 
-    if (iter.findNext(start) == false)
+    // if start is NULL, then search will begin from top, otherwise it will begin from the start item and search onwards
+    if (start != NULL)
     {
-        // the object wasn't found in the list, so just return the same item
-        return start;
+        if (iter.findNext(start) == false)
+        {
+            // the object wasn't found in the list
+            return NULL;
+        }
     }
 
     // now the iterator is pointing to the desired start object in the list,
     // continually check the next item and find one with a snapshot
-    vogleditor_apiCallTreeItem* pFound = start;
+    vogleditor_apiCallTreeItem* pFound = NULL;
     while (iter.hasNext())
     {
         if (iter.peekNext()->has_snapshot())
@@ -482,18 +501,26 @@ vogleditor_apiCallTreeItem *vogleditor_QApiCallTreeModel::find_prev_drawcall(vog
 {
     QLinkedListIterator<vogleditor_apiCallTreeItem*> iter(m_itemList);
 
-    if (iter.findNext(start) == false)
+    if (start != NULL)
     {
-        // the object wasn't found in the list, so just return the same item
-        return start;
-    }
+        if (iter.findNext(start) == false)
+        {
+            // the object wasn't found in the list
+            return NULL;
+        }
 
-    // need to back up past the current item
-    iter.previous();
+        // need to back up past the current item
+        iter.previous();
+    }
+    else
+    {
+        // set the iterator to the back so that searching starts from the end of the list
+        iter.toBack();
+    }
 
     // now the iterator is pointing to the desired start object in the list,
     // continually check the prev item and find one with a snapshot
-    vogleditor_apiCallTreeItem* pFound = start;
+    vogleditor_apiCallTreeItem* pFound = NULL;
     while (iter.hasPrevious())
     {
         vogleditor_apiCallTreeItem* pItem = iter.peekPrevious();
@@ -520,13 +547,13 @@ vogleditor_apiCallTreeItem *vogleditor_QApiCallTreeModel::find_next_drawcall(vog
 
     if (iter.findNext(start) == false)
     {
-        // the object wasn't found in the list, so just return the same item
-        return start;
+        // the object wasn't found in the list
+        return NULL;
     }
 
     // now the iterator is pointing to the desired start object in the list,
     // continually check the next item and find one with a snapshot
-    vogleditor_apiCallTreeItem* pFound = start;
+    vogleditor_apiCallTreeItem* pFound = NULL;
     while (iter.hasNext())
     {
         vogleditor_apiCallTreeItem* pItem = iter.peekNext();
@@ -546,3 +573,49 @@ vogleditor_apiCallTreeItem *vogleditor_QApiCallTreeModel::find_next_drawcall(vog
 
     return pFound;
 }
+
+vogleditor_apiCallTreeItem* vogleditor_QApiCallTreeModel::find_call_number(uint64_t callNumber)
+{
+    QLinkedListIterator<vogleditor_apiCallTreeItem*> iter(m_itemList);
+
+    vogleditor_apiCallTreeItem* pFound = NULL;
+    while (iter.hasNext())
+    {
+        vogleditor_apiCallTreeItem* pItem = iter.peekNext();
+        if (pItem->apiCallItem() != NULL)
+        {
+            if (pItem->apiCallItem()->globalCallIndex() == callNumber)
+            {
+                pFound = iter.peekNext();
+                break;
+            }
+        }
+
+        iter.next();
+    }
+
+    return pFound;
+}
+
+vogleditor_apiCallTreeItem* vogleditor_QApiCallTreeModel::find_frame_number(uint64_t frameNumber)
+{
+    QLinkedListIterator<vogleditor_apiCallTreeItem*> iter(m_itemList);
+
+    vogleditor_apiCallTreeItem* pFound = NULL;
+    while (iter.hasNext())
+    {
+        vogleditor_apiCallTreeItem* pItem = iter.peekNext();
+        if (pItem->frameItem() != NULL)
+        {
+            if (pItem->frameItem()->frameNumber() == frameNumber)
+            {
+                pFound = iter.peekNext();
+                break;
+            }
+        }
+
+        iter.next();
+    }
+
+    return pFound;
+}