diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2015-04-15 12:43:24 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-04-26 18:42:16 +0000 |
commit | 629aa559b503aa1b18be35ceff1e20d1817042a3 (patch) | |
tree | ed86b3eee587ffc958caee75600eb0215ccc9738 /src/qml/qml/qqmlbinding.cpp | |
parent | 01c0c0963794f4dd8c3601e8340cc3dc4dec41bd (diff) |
Directly resolve property aliases in QQmlBinding::setTarget
Like this the target properties of the binding will always point
to the correct resolved object and property.
Change-Id: I400a265a17bc55de041c3df17f357e4b40f31c4d
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/qml/qqmlbinding.cpp')
-rw-r--r-- | src/qml/qml/qqmlbinding.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp index 33fea6bb54..8baebec16c 100644 --- a/src/qml/qml/qqmlbinding.cpp +++ b/src/qml/qml/qqmlbinding.cpp @@ -43,6 +43,7 @@ #include <private/qqmlscriptstring_p.h> #include <private/qqmlcontextwrapper_p.h> #include <private/qqmlbuiltinfunctions_p.h> +#include <private/qqmlvmemetaobject_p.h> #include <QVariant> #include <QtCore/qdebug.h> @@ -296,6 +297,42 @@ void QQmlBinding::setTarget(QObject *object, const QQmlPropertyData &core) { m_coreObject = object; m_core = core; + + while (m_core.isAlias()) { + int coreIndex = core.coreIndex; + int valueTypeIndex = core.getValueTypeCoreIndex(); + QQmlVMEMetaObject *vme = QQmlVMEMetaObject::getForProperty(object, coreIndex); + + int aValueTypeIndex; + if (!vme->aliasTarget(coreIndex, &object, &coreIndex, &aValueTypeIndex)) { + m_core.coreIndex = -1; + m_coreObject = 0; + return; + } + if (valueTypeIndex == -1) + valueTypeIndex = aValueTypeIndex; + + QQmlData *data = QQmlData::get(object, false); + if (!data || !data->propertyCache) { + m_core.coreIndex = -1; + m_coreObject = 0; + return; + } + QQmlPropertyData *propertyData = data->propertyCache->property(coreIndex); + Q_ASSERT(propertyData); + + m_coreObject = object; + m_core = *propertyData; + if (valueTypeIndex != -1) { + const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(m_core.propType); + Q_ASSERT(valueTypeMetaObject); + QMetaProperty vtProp = valueTypeMetaObject->property(valueTypeIndex); + m_core.setFlags(m_core.getFlags() | QQmlPropertyData::IsValueTypeVirtual); + m_core.valueTypeFlags = QQmlPropertyData::flagsForProperty(vtProp); + m_core.valueTypePropType = vtProp.userType(); + m_core.valueTypeCoreIndex = valueTypeIndex; + } + } } QQmlProperty QQmlBinding::property() const |