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 "qquick3drenderstatstexturesmodel_p.h"
++
++ #include <QtCore/QRegularExpression>
++
++ QT_BEGIN_NAMESPACE
++
++ QHash<int, QByteArray> QQuick3DRenderStatsTexturesModel::roleNames() const
++ {
++ return { {Qt::DisplayRole, "display"} };
++ }
++
++ int QQuick3DRenderStatsTexturesModel::rowCount(const QModelIndex &parent) const
++ {
++ Q_UNUSED(parent);
++ return m_data.count();
++ }
++
++ int QQuick3DRenderStatsTexturesModel::columnCount(const QModelIndex &parent) const
++ {
++ Q_UNUSED(parent);
++ return 5;
++ }
++
++ QVariant QQuick3DRenderStatsTexturesModel::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;
++ // Format 2
++ if (column == 2)
++ return m_data[row].format;
++ // Mip Levels 3
++ if (column == 3)
++ return m_data[row].mipLevels;
++ // Flags 4
++ if (column == 4)
++ return m_data[row].flags;
++ }
++
++ return QVariant();
++ }
++
++ QVariant QQuick3DRenderStatsTexturesModel::headerData(int section, Qt::Orientation orientation, int role) const
++ {
++ if (role != Qt::DisplayRole || orientation != Qt::Horizontal || section > 5)
++ return QVariant();
++
++ switch (section) {
++ case 0:
++ return QStringLiteral("Name");
++ case 1:
++ return QStringLiteral("Size");
++ case 2:
++ return QStringLiteral("Format");
++ case 3:
++ return QStringLiteral("Mip Levels");
++ case 4:
++ return QStringLiteral("Flags");
++ default:
++ Q_UNREACHABLE();
++ return QVariant();
++ }
++ }
++
++ const QString &QQuick3DRenderStatsTexturesModel::textureData() const
++ {
++ return m_textureData;
++ }
++
++ void QQuick3DRenderStatsTexturesModel::setTextureData(const QString &newTextureData)
++ {
++ if (m_textureData == newTextureData)
++ return;
++
++ m_textureData = newTextureData;
++ emit textureDataChanged();
++
++ // newTextureData is just a markdown table...
++ QVector<Data> newData;
++ if (!m_textureData.isEmpty()) {
++ auto lines = m_textureData.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) // flags field can be empty
++ continue;
++ Data data;
++ bool isUInt32 = false;
++ data.name = fields[0];
++ data.size = fields[1];
++ data.format = fields[2];
++ data.mipLevels = fields[3].toULong(&isUInt32);
++ if (!isUInt32)
++ continue;
++ if (fields.size() == 5)
++ data.flags = fields[4];
++ newData.append(data);
++ }
++ }
++ }
++
++ // update the model
++ beginResetModel();
++ m_data = newData;
++ endResetModel();
++ }
++
++ QT_END_NAMESPACE