io/fileview: handle deserialization to list<T> properties

This commit is contained in:
outfoxxed 2026-04-04 13:05:33 -07:00
parent 9b98d10178
commit 49d4f46cf1
No known key found for this signature in database
GPG key ID: 4C88A185FB89301E

View file

@ -7,6 +7,7 @@
#include <qjsonobject.h> #include <qjsonobject.h>
#include <qjsonvalue.h> #include <qjsonvalue.h>
#include <qjsvalue.h> #include <qjsvalue.h>
#include <qmetacontainer.h>
#include <qmetaobject.h> #include <qmetaobject.h>
#include <qnamespace.h> #include <qnamespace.h>
#include <qobject.h> #include <qobject.h>
@ -260,12 +261,35 @@ void JsonAdapter::deserializeRec(const QJsonObject& json, QObject* obj, const QM
} }
} else { } else {
auto variant = jval.toVariant(); auto variant = jval.toVariant();
auto convVariant = variant;
if (variant.convert(prop.metaType())) { if (convVariant.convert(prop.metaType())) {
prop.write(obj, variant); prop.write(obj, convVariant);
} else {
auto pval = prop.read(obj);
if (variant.canConvert<QSequentialIterable>() && pval.canView<QSequentialIterable>()) {
auto targetv = QVariant(pval.metaType());
auto target = targetv.view<QSequentialIterable>().metaContainer();
auto valueType = target.valueMetaType();
auto i = 0;
for (QVariant item: variant.value<QSequentialIterable>()) {
if (item.convert(valueType)) {
target.addValueAtEnd(targetv.data(), item.constData());
} else {
qmlWarning(this) << "Failed to deserialize list member " << i << " of property "
<< prop.name() << ": expected " << valueType.name() << " but got "
<< item.typeName();
}
++i;
}
prop.write(obj, targetv);
} else { } else {
qmlWarning(this) << "Failed to deserialize property " << prop.name() << ": expected " qmlWarning(this) << "Failed to deserialize property " << prop.name() << ": expected "
<< prop.metaType().name() << " but got " << jval.toVariant().typeName(); << prop.metaType().name() << " but got "
<< jval.toVariant().typeName();
}
} }
} }
} }