Play-/Source/ui_qt/DebugSupport/FrameDebugger/GsPacketListModel.cpp

139 lines
3.6 KiB
C++
Raw Normal View History

2020-02-02 19:46:03 +00:00
#include "GsPacketListModel.h"
#include "GsPacketData.h"
#include "string_format.h"
#include <QStringList>
2020-02-06 12:39:36 +00:00
PacketTreeModel::PacketTreeModel(QWidget* parent)
2020-02-02 19:46:03 +00:00
: QAbstractItemModel(parent)
2020-02-06 14:06:28 +00:00
, m_rootItem(new GsPacketData("Packets", 0))
2020-02-02 19:46:03 +00:00
{
}
PacketTreeModel::~PacketTreeModel()
{
2020-02-06 14:06:28 +00:00
delete m_rootItem;
2020-02-02 19:46:03 +00:00
}
2020-02-06 12:39:36 +00:00
int PacketTreeModel::columnCount(const QModelIndex& parent) const
2020-02-02 19:46:03 +00:00
{
return 1;
}
2020-02-06 12:39:36 +00:00
QVariant PacketTreeModel::data(const QModelIndex& index, int role) const
2020-02-02 19:46:03 +00:00
{
2020-02-06 12:39:36 +00:00
if(!index.isValid())
2020-02-02 19:46:03 +00:00
return QVariant();
2020-02-06 12:39:36 +00:00
if(role != Qt::DisplayRole)
2020-02-02 19:46:03 +00:00
return QVariant();
2020-02-06 12:39:36 +00:00
GsPacketData* item = static_cast<GsPacketData*>(index.internalPointer());
2020-02-02 19:46:03 +00:00
return item->data(index.column());
}
2020-02-06 12:39:36 +00:00
Qt::ItemFlags PacketTreeModel::flags(const QModelIndex& index) const
2020-02-02 19:46:03 +00:00
{
2020-02-06 12:39:36 +00:00
if(!index.isValid())
2020-02-02 19:46:03 +00:00
return Qt::NoItemFlags;
return QAbstractItemModel::flags(index);
}
QVariant PacketTreeModel::headerData(int section, Qt::Orientation orientation, int role) const
{
2020-02-06 12:39:36 +00:00
if(orientation == Qt::Horizontal && role == Qt::DisplayRole)
2020-02-06 14:06:28 +00:00
return m_rootItem->data(section);
2020-02-02 19:46:03 +00:00
return QVariant();
}
2020-02-06 12:39:36 +00:00
QModelIndex PacketTreeModel::index(int row, int column, const QModelIndex& parent) const
2020-02-02 19:46:03 +00:00
{
2020-02-06 12:39:36 +00:00
if(!hasIndex(row, column, parent))
2020-02-02 19:46:03 +00:00
return QModelIndex();
2020-02-06 12:39:36 +00:00
GsPacketData* parentItem;
2020-02-02 19:46:03 +00:00
2020-02-06 12:39:36 +00:00
if(!parent.isValid())
2020-02-06 14:06:28 +00:00
parentItem = m_rootItem;
2020-02-02 19:46:03 +00:00
else
parentItem = static_cast<GsPacketData*>(parent.internalPointer());
2020-02-06 12:39:36 +00:00
GsPacketData* childItem = parentItem->child(row);
if(childItem)
2020-02-02 19:46:03 +00:00
return createIndex(row, column, childItem);
return QModelIndex();
}
2020-02-06 12:39:36 +00:00
QModelIndex PacketTreeModel::parent(const QModelIndex& index) const
2020-02-02 19:46:03 +00:00
{
2020-02-06 12:39:36 +00:00
if(!index.isValid())
2020-02-02 19:46:03 +00:00
return QModelIndex();
2020-02-06 12:39:36 +00:00
GsPacketData* childItem = static_cast<GsPacketData*>(index.internalPointer());
GsPacketData* parentItem = childItem->parent();
2020-02-02 19:46:03 +00:00
2020-02-06 14:06:28 +00:00
if(parentItem == m_rootItem)
2020-02-02 19:46:03 +00:00
return QModelIndex();
return createIndex(parentItem->row(), 0, parentItem);
}
2020-02-06 12:39:36 +00:00
int PacketTreeModel::rowCount(const QModelIndex& parent) const
2020-02-02 19:46:03 +00:00
{
2020-02-06 12:39:36 +00:00
GsPacketData* parentItem;
if(parent.column() > 0)
2020-02-02 19:46:03 +00:00
return 0;
2020-02-06 12:39:36 +00:00
if(!parent.isValid())
2020-02-06 14:06:28 +00:00
parentItem = m_rootItem;
2020-02-02 19:46:03 +00:00
else
parentItem = static_cast<GsPacketData*>(parent.internalPointer());
return parentItem->childCount();
}
void PacketTreeModel::setupModelData(CFrameDump& m_frameDump)
{
uint32 packetIndex = 0, cmdIndex = 0;
const auto& drawingKicks = m_frameDump.GetDrawingKicks();
for(const auto& packet : m_frameDump.GetPackets())
{
bool isRegisterPacket = packet.imageData.empty();
auto lowerBoundIterator = drawingKicks.upper_bound(cmdIndex);
auto upperBoundIterator = drawingKicks.lower_bound(cmdIndex + packet.registerWrites.size());
int kickCount = static_cast<int>(std::distance(lowerBoundIterator, upperBoundIterator));
std::string packetDescription;
if(isRegisterPacket)
{
packetDescription = string_format("%d: Register Packet (Write Count: %d, Draw Count: %d, Path: %d)",
packetIndex, packet.registerWrites.size(), kickCount, packet.metadata.pathIndex);
}
else
{
packetDescription = string_format("%d: Image Packet (Size: 0x%08X)", packetIndex, packet.imageData.size());
}
2020-02-06 14:06:28 +00:00
auto parent = new GsPacketData(packetDescription.c_str(), cmdIndex, m_rootItem);
m_rootItem->appendChild(parent);
2020-02-02 19:46:03 +00:00
QVector<QVariant> columnData;
columnData.reserve(packet.registerWrites.size());
auto cmdIndexStart = cmdIndex;
for(const auto& registerWrite : packet.registerWrites)
{
auto packetWriteDescription = CGSHandler::DisassembleWrite(registerWrite.first, registerWrite.second);
auto GsPacketDataText = string_format("%04X: %s", cmdIndex - cmdIndexStart, packetWriteDescription.c_str());
parent->appendChild(new GsPacketData(GsPacketDataText.c_str(), cmdIndex, parent));
++cmdIndex;
}
++packetIndex;
}
}