aboutsummaryrefslogtreecommitdiffstats
path: root/src/ivicore/qiviqmlconversion_helper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ivicore/qiviqmlconversion_helper.cpp')
-rw-r--r--src/ivicore/qiviqmlconversion_helper.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/ivicore/qiviqmlconversion_helper.cpp b/src/ivicore/qiviqmlconversion_helper.cpp
index 66381b9..0372b6b 100644
--- a/src/ivicore/qiviqmlconversion_helper.cpp
+++ b/src/ivicore/qiviqmlconversion_helper.cpp
@@ -49,6 +49,13 @@
QT_BEGIN_NAMESPACE
+namespace qtivi_helper {
+ static const QString valueLiteral = QStringLiteral("value");
+ static const QString typeLiteral = QStringLiteral("type");
+}
+
+using namespace qtivi_helper;
+
void qtivi_qmlOrCppWarning(const QObject *obj, const char *errorString)
{
qtivi_qmlOrCppWarning(obj, QLatin1String(errorString));
@@ -84,4 +91,67 @@ void qtivi_qmlOrCppWarning(const QObject *obj, const QString &errorString)
v4->throwError(errorString);
}
+QVariant convertFromJSON(const QVariant &val)
+{
+ QVariant value = val;
+ // First try to convert the values to a Map or a List
+ // This is needed as it could also store a QStringList or a Hash
+ if (value.canConvert(QVariant::Map))
+ value.convert(QVariant::Map);
+ if (value.canConvert(QVariant::List))
+ value.convert(QVariant::List);
+
+ if (value.type() == QVariant::Map) {
+ const QVariantMap map = value.toMap();
+ if (map.contains(typeLiteral) && map.contains(valueLiteral)) {
+ const QString type = map.value(typeLiteral).toString();
+ const QVariant value = map.value(valueLiteral);
+
+ if (type == QStringLiteral("enum")) {
+ QString enumValue = value.toString();
+ const int lastIndex = enumValue.lastIndexOf(QStringLiteral("::"));
+ const QString className = enumValue.left(lastIndex - 1 );
+ enumValue = enumValue.right(enumValue.count() - lastIndex - 2);
+ const QMetaObject *mo = QMetaType::metaObjectForType(QMetaType::type(className.toLatin1()));
+ if (!mo)
+ return QVariant();
+
+ for (int i = mo->enumeratorOffset(); i < mo->enumeratorCount(); ++i) {
+ QMetaEnum me = mo->enumerator(i);
+ bool ok = false;
+ int value = me.keysToValue(enumValue.toLatin1(), &ok);
+ if (ok)
+ return value;
+ }
+ qWarning() << "Couldn't parse the enum definition" << map;
+ return QVariant();
+ } else {
+ int typeId = QMetaType::type(type.toLatin1());
+ const QMetaObject *mo = QMetaType::metaObjectForType(typeId);
+ if (!mo)
+ return QVariant();
+
+ QVariantList values = value.toList();
+ for (auto i = values.begin(); i != values.end(); ++i)
+ *i = convertFromJSON(*i);
+
+ void *gadget = mo->newInstance(Q_ARG(QVariant, QVariant(values)));
+ return QVariant(typeId, gadget);
+ }
+ }
+
+ QVariantMap convertedValues;
+ for (auto i = map.constBegin(); i != map.constEnd(); ++i)
+ convertedValues.insert(i.key(), convertFromJSON(i.value()));
+ return convertedValues;
+ } else if (value.type() == QVariant::List) {
+ QVariantList values = value.toList();
+ for (auto i = values.begin(); i != values.end(); ++i)
+ *i = convertFromJSON(*i);
+ return values;
+ }
+
+ return value;
+}
+
QT_END_NAMESPACE