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 }