diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index b3b96890085..b5ca681a9fe 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -94,6 +94,8 @@ static bool isPropertyBlackListed(const QmlDesigner::PropertyName &propertyName) namespace QmlDesigner { namespace Internal { +QHash ObjectNodeInstance::m_enumationValueHash; + ObjectNodeInstance::ObjectNodeInstance(QObject *object) : m_object(object), m_metaObject(0), @@ -477,7 +479,7 @@ void ObjectNodeInstance::setPropertyVariant(const PropertyName &name, const QVar QVariant fixedValue = fixResourcePaths(value); if (value.canConvert()) - fixedValue = QVariant::fromValue(value.value().nameToString()); + fixedValue = enumationValue(value.value()); QVariant oldValue = property.read(); if (oldValue.type() == QVariant::Url) { @@ -1325,6 +1327,39 @@ void ObjectNodeInstance::doComponentCompleteRecursive(QObject *object, NodeInsta } } +static QHash enumationValuesFromMetaEnum(const QMetaEnum &metaEnum) +{ + QHash enumationValues; + for (int index = 0; index < metaEnum.keyCount(); index++) { + EnumerationName enumerationName = EnumerationName(metaEnum.scope()) + "." + metaEnum.key(index); + enumationValues.insert(enumerationName, metaEnum.value(index)); + } + + return enumationValues; +} + +static QHash collectEnumationValues(const Enumeration &enumeration) +{ + QHash enumationValues; + EnumerationName enumerationScope = enumeration.scope(); + const QMetaObject *metaObject = QMetaType::metaObjectForType(QMetaType::type(enumerationScope.data())); + if (metaObject) { + int enumeratorCount = metaObject->enumeratorOffset() + metaObject->enumeratorCount(); + for (int index = metaObject->enumeratorOffset(); index < enumeratorCount; index++) + enumationValues.unite(enumationValuesFromMetaEnum(metaObject->enumerator(index))); + } + return enumationValues; +} + +QVariant ObjectNodeInstance::enumationValue(const Enumeration &enumeration) +{ + EnumerationName enumerationName = enumeration.toEnumerationName(); + if (!m_enumationValueHash.contains(enumerationName)) + m_enumationValueHash.unite(collectEnumationValues(enumeration)); + + return QVariant::fromValue(m_enumationValueHash.value(enumerationName)); +} + ObjectNodeInstance::Pointer ObjectNodeInstance::parentInstance() const { QObject *parentHolder = parent(); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h index 1f178f51c19..2d4635b372f 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h @@ -38,6 +38,8 @@ #include #include +#include "enumeration.h" + QT_BEGIN_NAMESPACE class QGraphicsItem; class QQmlContext; @@ -200,6 +202,7 @@ protected: QVariant convertSpecialCharacter(const QVariant& value) const; static QObject *parentObject(QObject *object); static void doComponentCompleteRecursive(QObject *object, NodeInstanceServer *nodeInstanceServer); + static QVariant enumationValue(const Enumeration &enumeration); private: QHash m_resetValueHash; @@ -217,6 +220,7 @@ private: qint32 m_instanceId; bool m_deleteHeldInstance; bool m_isInLayoutable; + static QHash m_enumationValueHash; }; } // namespace Internal