File indexing completed on 2024-05-12 05:17:28

0001 /*
0002     SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "standarditemmodelhelper.h"
0008 
0009 #include <QMetaProperty>
0010 #include <QSequentialIterable>
0011 #include <QStandardItem>
0012 
0013 void StandardItemModelHelper::clearContent(QStandardItemModel *model)
0014 {
0015     model->removeRows(0, model->rowCount());
0016 }
0017 
0018 QStandardItem* StandardItemModelHelper::addEntry(const QString &key, const QString &value, QStandardItem *parent)
0019 {
0020     auto item1 = new QStandardItem;
0021     item1->setText(key);
0022     item1->setFlags(item1->flags() & ~Qt::ItemIsEditable);
0023     auto item2 = new QStandardItem;
0024     item2->setText(value);
0025     parent->appendRow({item1, item2});
0026     return item1;
0027 }
0028 
0029 void StandardItemModelHelper::fillFromGadget(const QVariant &value, QStandardItem *parent)
0030 {
0031     fillFromGadget(QMetaType(value.userType()).metaObject(), value.constData(), parent);
0032 }
0033 
0034 static bool isListType(const QVariant &value)
0035 {
0036     return value.canConvert<QVariantList>() && value.typeId() != QMetaType::QString && value.typeId() != QMetaType::QByteArray;
0037 }
0038 
0039 void StandardItemModelHelper::fillFromGadget(const QMetaObject *mo, const void *gadget, QStandardItem *parent)
0040 {
0041     if (!gadget || !mo) {
0042         return;
0043     }
0044     for (auto i = 0; i < mo->propertyCount(); ++i) {
0045         const auto prop = mo->property(i);
0046         if (!prop.isStored()) {
0047             continue;
0048         }
0049         const auto value = prop.readOnGadget(gadget);
0050         QString valueString;
0051         if (isListType(value)) {
0052             valueString = QString::fromUtf8(value.typeName());
0053         } else if (prop.isEnumType()) {
0054             valueString = QString::fromUtf8(prop.enumerator().valueToKey(value.toInt()));
0055         } else {
0056             valueString = value.toString();
0057         }
0058         auto item = addEntry(QString::fromUtf8(prop.name()), valueString, parent);
0059         if (const auto childMo = QMetaType(value.typeId()).metaObject()) {
0060             fillFromGadget(childMo, value.constData(), item);
0061         } else if (isListType(value)) {
0062             auto iterable = value.value<QSequentialIterable>();
0063             int idx = 0;
0064             for (const QVariant &v : iterable) {
0065                 auto arrayItem = addEntry(QString::number(idx++), v.toString(), item);
0066                 if (const auto childMo = QMetaType(v.typeId()).metaObject()) {
0067                     fillFromGadget(childMo, v.constData(), arrayItem);
0068                 }
0069             }
0070         }
0071     }
0072 }
0073 
0074 QString StandardItemModelHelper::dataToHex(const uint8_t *data, int size, int offset)
0075 {
0076     return QString::fromUtf8(QByteArray((const char*)data + offset, size - offset).toHex());
0077 }