Revision control
++ // Copyright (C) 2022 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++
++ #include "qquick3drenderstatspassesmodel_p.h"
++
++ #include <QtCore/QRegularExpression>
++
++ QT_BEGIN_NAMESPACE
++
++ QHash<int, QByteArray> QQuick3DRenderStatsPassesModel::roleNames() const
++ {
++ return { {Qt::DisplayRole, "display"} };
++ }
++
++ int QQuick3DRenderStatsPassesModel::rowCount(const QModelIndex &parent) const
++ {
++ Q_UNUSED(parent);
++ return m_data.count();
++ }
++
++ int QQuick3DRenderStatsPassesModel::columnCount(const QModelIndex &parent) const
++ {
++ Q_UNUSED(parent);
++ return 4;
++ }
++
++ QVariant QQuick3DRenderStatsPassesModel::data(const QModelIndex &index, int role) const
++ {
++ if (!index.isValid())
++ return QVariant();
++
++ const uint row = index.row();
++ const uint column = index.column();
++
++ if (role == Qt::DisplayRole) {
++ // Name 0
++ if (column == 0)
++ return m_data[row].name;
++ // Size 1
++ if (column == 1)
++ return m_data[row].size;
++ // Vertices 2
++ if (column == 2)
++ return m_data[row].vertices;
++ // DrawCalls 3
++ if (column == 3)
++ return m_data[row].drawCalls;
++ }
++
++ return QVariant();
++ }
++
++ QVariant QQuick3DRenderStatsPassesModel::headerData(int section, Qt::Orientation orientation, int role) const
++ {
++ if (role != Qt::DisplayRole || orientation != Qt::Horizontal || section > 4)
++ return QVariant();
++
++ switch (section) {
++ case 0:
++ return QStringLiteral("Name");
++ case 1:
++ return QStringLiteral("Size");
++ case 2:
++ return QStringLiteral("Vertices");
++ case 3:
++ return QStringLiteral("Draw Calls");
++ default:
++ Q_UNREACHABLE();
++ return QVariant();
++ }
++ }
++
++ const QString &QQuick3DRenderStatsPassesModel::passData() const
++ {
++ return m_passData;
++ }
++
++ void QQuick3DRenderStatsPassesModel::setPassData(const QString &newPassData)
++ {
++ if (m_passData == newPassData)
++ return;
++
++ m_passData = newPassData;
++ emit passDataChanged();
++
++ // newPassData is just a markdown table...
++ QVector<Data> newData;
++ if (!m_passData.isEmpty()) {
++ auto lines = m_passData.split(QRegularExpression(QStringLiteral("[\r\n]")), Qt::SkipEmptyParts);
++ if (lines.size() > 2) {
++ for (qsizetype i = 2; i < lines.size(); ++i) {
++ const auto &line = lines.at(i);
++ auto fields = line.split(QLatin1Char('|'), Qt::SkipEmptyParts);
++ if (fields.size() != 4)
++ continue;
++ Data data;
++ bool isUInt64 = false;
++ bool isUint32 = false;
++ data.name = fields[0];
++ data.size = fields[1];
++ data.vertices = fields[2].toULongLong(&isUInt64);
++ if (!isUInt64)
++ continue;
++ data.drawCalls = fields[3].toULong(&isUint32);
++ if (!isUint32)
++ continue;
++ newData.append(data);
++ }
++ }
++ }
++
++ // update the model
++ beginResetModel();
++ m_data = newData;
++ endResetModel();
++ }
++
++ QT_END_NAMESPACE
++