diff options
author | Kevin Ottens <kevin.ottens@kdab.com> | 2017-07-12 14:01:31 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-08-02 17:34:30 +0000 |
commit | 50775424beb886e1fa0c32982a46642a8e1fa888 (patch) | |
tree | 4563ea0ae5f361c165b2bd168defd33443a66806 /src/gui/util/qshadernodesloader.cpp | |
parent | 3786411f7f8770f28ba2a97cb646a0eb7a5eaa99 (diff) | |
download | qtbase-50775424beb886e1fa0c32982a46642a8e1fa888.tar.gz |
Extend the parameter support in QShaderNodeLoader for richer types
In particular, go through QMetaType/QMetaEnum to deal with enums.
Change-Id: Idbe16c913c1d471a4a91d219f77876e498c192d9
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/gui/util/qshadernodesloader.cpp')
-rw-r--r-- | src/gui/util/qshadernodesloader.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/gui/util/qshadernodesloader.cpp b/src/gui/util/qshadernodesloader.cpp index 390518596d..db34b6d44d 100644 --- a/src/gui/util/qshadernodesloader.cpp +++ b/src/gui/util/qshadernodesloader.cpp @@ -44,6 +44,7 @@ #include <QtCore/qjsonarray.h> #include <QtCore/qjsondocument.h> #include <QtCore/qjsonobject.h> +#include <QtCore/qmetaobject.h> QT_BEGIN_NAMESPACE @@ -151,7 +152,30 @@ void QShaderNodesLoader::load() if (parametersValue.isObject()) { const auto parametersObject = parametersValue.toObject(); for (const auto ¶meterName : parametersObject.keys()) { - node.setParameter(parameterName, parametersObject.value(parameterName).toVariant()); + const auto parameterValue = parametersObject.value(parameterName); + if (parameterValue.isObject()) { + const auto parameterObject = parameterValue.toObject(); + const auto type = parameterObject.value(QStringLiteral("type")).toString(); + const auto typeId = QMetaType::type(type.toUtf8()); + + const auto value = parameterObject.value(QStringLiteral("value")).toString(); + auto variant = QVariant(value); + + if (QMetaType::typeFlags(typeId) & QMetaType::IsEnumeration) { + const auto metaObject = QMetaType::metaObjectForType(typeId); + const auto className = metaObject->className(); + const auto enumName = type.mid(static_cast<int>(qstrlen(className)) + 2).toUtf8(); + const auto metaEnum = metaObject->enumerator(metaObject->indexOfEnumerator(enumName)); + const auto enumValue = metaEnum.keyToValue(value.toUtf8()); + variant = QVariant(enumValue); + variant.convert(typeId); + } else { + variant.convert(typeId); + } + node.setParameter(parameterName, variant); + } else { + node.setParameter(parameterName, parameterValue.toVariant()); + } } } |