glvdebug_xgl: qgroupframesproxymodel now supports displaying additional columns.
authorPeter Lohrmann <peterl@valvesofware.com>
Mon, 26 Jan 2015 20:48:26 +0000 (12:48 -0800)
committerJon Ashburn <jon@lunarg.com>
Thu, 12 Feb 2015 15:08:26 +0000 (08:08 -0700)
* Now that the table has an 'Index' column, pausing the replay will highlight the correct row. HOWEVER, the treeview is not scrolling to the line as expected.
* Currently rows are not hidden when a proxy model is being used.

tools/glave/src/glv_extensions/glvdebug_xgl/glvdebug_xgl_qgroupframesproxymodel.h
tools/glave/src/glvdebug/glvdebug.cpp
tools/glave/src/glvdebug/glvdebug_QTraceFileModel.h

index 4d26516..676cabb 100644 (file)
@@ -31,6 +31,8 @@
 #include <QAbstractProxyModel>
 #include <QStandardItem>
 
+#include <QDebug>
+
 struct FrameInfo
 {
     int frameIndex;
@@ -110,21 +112,55 @@ public:
             return QVariant();
         }
 
-        if (index.column() == 1)
+        if (!isFrame(index))
         {
-            return QVariant(QString("%1").arg(1));
+            if (index.column() == 0)
+            {
+                return mapToSource(index).data(role);
+            }
+            else
+            {
+                if (role == Qt::DisplayRole)
+                {
+                    QModelIndex firstResult = mapToSource(index);
+                    if (firstResult.isValid())
+                    {
+                        return firstResult.data(role);
+                    }
+                    //else
+                    //{
+                    //    // All of the below code is to figure out why the call above is not working correctly!
+                    //    qDebug() << QString("Searching for: %1 %2 %3").arg(index.row()).arg(index.column()).arg((qintptr)index.internalPointer());
+
+                    //    QMap<QPersistentModelIndex, QPersistentModelIndex> map = m_mapProxyToSrc[index.column()];
+                    //    QList<QPersistentModelIndex> keys = map.keys();
+                    //    for (int i = 0; i < keys.count() && i < 25; i++)
+                    //    {
+                    //        //if (keys[i].row() == 0 && keys[i].column() == 1)
+                    //        {
+                    //            qDebug() << QString("%1 %2 %3").arg(keys[i].row()).arg(keys[i].column()).arg((qintptr)keys[i].internalPointer());
+                    //        }
+                    //    }
+
+                    //    QModelIndex result = map.value(index);
+                    //    return QVariant(QString("%1 %2 %3").arg(result.row()).arg(result.column()).arg((qintptr)result.internalPointer()));
+                    //}
+                }
+            }
+
+            return mapToSource(index).data(role);
         }
 
-        if (isFrame(index))
+        if (role == Qt::DisplayRole)
         {
-            if (role == Qt::DisplayRole)
+            if (index.column() == 0)
             {
                 return QVariant(QString("Frame %1").arg(m_frameList[index.row()].frameIndex));
             }
-        }
-        else
-        {
-            return mapToSource(index).data(role);
+            else
+            {
+                return QVariant(QString(""));
+            }
         }
 
         return QVariant();
@@ -139,7 +175,7 @@ public:
     //---------------------------------------------------------------------------------------------
     virtual int columnCount(const QModelIndex &parent) const
     {
-        return 1;
+        return sourceModel()->columnCount();
     }
 
     //---------------------------------------------------------------------------------------------
@@ -151,20 +187,32 @@ public:
     //---------------------------------------------------------------------------------------------
     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const
     {
-        if (!hasIndex(row, column, parent))
-            return QModelIndex();
-
         if (!parent.isValid())
         {
-            if (row < m_frameList.count())
+            // if parent is not valid, then this row and column is referencing Frame data
+            if (column == 0)
             {
                 return m_frameList[row].modelIndex;
             }
+            else
+            {
+                return createIndex(row, column, m_frameList[row].modelIndex.internalPointer());
+            }
             return QModelIndex();
         }
         else if (isFrame(parent))
         {
-            return m_frameList[parent.row()].children[row];
+            // the parent is a frame, so this row and column reference a source cell
+            if (column == 0)
+            {
+                // the column of
+                return m_frameList[parent.row()].children[row];
+            }
+            else
+            {
+                // TODO: Have I already created this modelIndex?
+                return createIndex(row, column, m_frameList[parent.row()].children[row].internalId());
+            }
         }
 
         return QModelIndex();
@@ -175,7 +223,20 @@ public:
     {
         if (child.isValid())
         {
-            return m_mapProxyToParent.value(child);
+            if (!isFrame(child))
+            {
+                QModelIndex result = m_mapProxyToParent[child.column()].value(child);
+                if (result.isValid())
+                {
+                    return result;
+                }
+                else
+                {
+                    // parent is a frame
+                    int frameIndex = (int)child.internalId();
+                    return createIndex(frameIndex, 0, (void*)&m_frameList[frameIndex]);
+                }
+            }
         }
 
         return QModelIndex();
@@ -187,7 +248,9 @@ public:
         if (!proxyIndex.isValid())
             return QModelIndex();
 
-        return m_mapProxyToSrc.value(proxyIndex);
+        QModelIndex result = m_mapProxyToSrc[proxyIndex.column()].value(proxyIndex);
+
+        return result;
     }
 
     //---------------------------------------------------------------------------------------------
@@ -195,6 +258,7 @@ public:
     {
         if (!sourceIndex.isValid())
             return QModelIndex();
+
         return m_mapping.value(sourceIndex);
     }
 
@@ -202,8 +266,11 @@ public:
 private:
     QList<FrameInfo> m_frameList;
     QMap<QPersistentModelIndex, QPersistentModelIndex> m_mapping;
-    QMap<QPersistentModelIndex, QPersistentModelIndex> m_mapProxyToSrc;
-    QMap<QPersistentModelIndex, QPersistentModelIndex> m_mapProxyToParent;
+
+    // column-based list of maps from proxy to source
+    QList< QMap<QPersistentModelIndex, QPersistentModelIndex> > m_mapProxyToSrc;
+
+    QList< QMap<QPersistentModelIndex, QPersistentModelIndex> > m_mapProxyToParent;
     int m_curFrameCount;
     FrameInfo* m_pCurFrame;
 
@@ -258,45 +325,56 @@ private:
 
         if (pTFM != NULL)
         {
+            // first reserve a few maps for each column in the table;
+            m_mapProxyToSrc.reserve(pTFM->columnCount());
+            m_mapProxyToParent.reserve(pTFM->columnCount());
+            for (int column = 0; column < pTFM->columnCount(); column++)
+            {
+                // a new map to store our model indexes
+                QMap<QPersistentModelIndex, QPersistentModelIndex> tmpSource;
+                m_mapProxyToSrc.append(tmpSource);
+                QMap<QPersistentModelIndex, QPersistentModelIndex> tmpParents;
+                m_mapProxyToParent.append(tmpParents);
+            }
+
+            // now do scanline-like remapping of source cells to proxy cells
+
             this->addNewFrame();
             for (int row = 0; row < pTFM->rowCount(); row++)
             {
-                int column = 0;
+                int proxyRow = m_pCurFrame->children.count();
+                //int column = 0;
+                for (int column = 0; column < pTFM->columnCount(); column++)
                 {
+                    int proxyColumn = column;
                     QPersistentModelIndex source = sourceModel()->index(row, column);
-                    QPersistentModelIndex sourceParent;
 
-                    // make a proxy for this source index
-                    QPersistentModelIndex proxySrc = createIndex(m_pCurFrame->children.count(), column, m_curFrameCount-1);
 
-                    // add proxy index to current frame
-                    m_pCurFrame->children.append(proxySrc);
+                    // make a proxy for this source index
+                    QPersistentModelIndex proxySrc = createIndex(proxyRow, proxyColumn, m_curFrameCount-1);
 
                     // update other references
-                    if (source.parent().isValid())
-                    {
-                        sourceParent = source.parent();
-                    }
                     m_mapping.insert(source, proxySrc);
-                    m_mapProxyToSrc.insert(proxySrc, source);
-                    m_mapProxyToParent.insert(proxySrc, m_pCurFrame->modelIndex);
+                    m_mapProxyToSrc[proxyColumn].insert(proxySrc, source);
+                    m_mapProxyToParent[proxyColumn].insert(proxySrc, m_pCurFrame->modelIndex);
 
                     if (column == 0)
                     {
-                        // If source data is a frame boundary make a new frame
-                        glv_trace_packet_header* pHeader = (glv_trace_packet_header*)source.internalPointer();
-                        if (pHeader != NULL && pHeader->tracer_id == GLV_TID_XGL && pHeader->packet_id == GLV_TPI_XGL_xglWsiX11QueuePresent)
-                        {
-                            m_mapProxyToSrc.insert(m_pCurFrame->modelIndex, source.parent());
-                            this->addNewFrame();
-                        }
-                    }
-                    else
-                    {
-                        m_mapProxyToSrc.insert(m_pCurFrame->modelIndex, source.parent());
+                        // only add the first column as a child to the current frame
+                        m_pCurFrame->children.append(proxySrc);
                     }
+                } // end for each source column
+
+                // Should a new frame be started based on the API call in the previous row?
+                // If source data is a frame boundary make a new frame
+                QModelIndex tmpIndex = sourceModel()->index(row, 0);
+                assert(tmpIndex.isValid());
+                glv_trace_packet_header* pHeader = (glv_trace_packet_header*)tmpIndex.internalPointer();
+                if (pHeader != NULL && pHeader->tracer_id == GLV_TID_XGL && pHeader->packet_id == GLV_TPI_XGL_xglWsiX11QueuePresent)
+                {
+                    this->addNewFrame();
                 }
-            }
+            } // end for each source row
         }
     }
 };
index 9b2be7e..3bbc682 100755 (executable)
@@ -204,13 +204,27 @@ void glvdebug::add_calltree_contextmenu_item(QAction* pAction)
     ui->treeView->addAction(pAction);\r
 }\r
 \r
+int indexOfColumn(QAbstractItemModel* pModel, const QString &text)\r
+{\r
+    for (int i = 0; i < pModel->columnCount(); i++)\r
+    {\r
+        if (pModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString() == text)\r
+        {\r
+            return i;\r
+        }\r
+    }\r
+    return -1;\r
+}\r
+\r
 void glvdebug::select_call_at_packet_index(unsigned long long packetIndex)\r
 {\r
     if (m_pTraceFileModel != NULL)\r
     {\r
         QApplication::setOverrideCursor(Qt::WaitCursor);\r
+\r
         QModelIndex start = m_pTraceFileModel->index(0, glvdebug_QTraceFileModel::Column_PacketIndex);\r
-        QModelIndexList matches = m_pTraceFileModel->match(start, Qt::DisplayRole, QVariant(packetIndex), 1);\r
+\r
+        QModelIndexList matches = ui->treeView->model()->match(start, Qt::DisplayRole, QVariant(packetIndex), 1, Qt::MatchFixedString | Qt::MatchRecursive | Qt::MatchWrap);\r
         if (matches.count() > 0)\r
         {\r
             selectApicallModelIndex(matches[0], true, true);\r
@@ -245,13 +259,15 @@ unsigned long long glvdebug::get_current_packet_index()
     if (index.isValid())\r
     {\r
         glv_trace_packet_header* pHeader = (glv_trace_packet_header*)index.internalPointer();\r
-        assert(pHeader != NULL);\r
-        packetIndex = pHeader->global_packet_index;\r
+        if (pHeader != NULL)\r
+        {\r
+            assert(pHeader != NULL);\r
+            packetIndex = pHeader->global_packet_index;\r
+        }\r
     }\r
     return packetIndex;\r
 }\r
 \r
-\r
 void glvdebug::reset_view()\r
 {\r
     while (ui->stateTabWidget->count() > 0)\r
index 9209ee3..5dbcdd6 100644 (file)
@@ -185,6 +185,11 @@ public:
             return createIndex(row, column);
         }
 
+        if ((uint64_t)row >= m_pTraceFileInfo->packetCount)
+        {
+            return QModelIndex();
+        }
+
         glv_trace_packet_header* pHeader = m_pTraceFileInfo->pPacketOffsets[row].pHeader;
         void* pData = NULL;
         switch (column)