From 629aa559b503aa1b18be35ceff1e20d1817042a3 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 15 Apr 2015 12:43:24 +0200 Subject: 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 --- src/qml/qml/qqmlbinding.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/qml/qml/qqmlproperty.cpp | 34 ---------------------------------- 2 files changed, 37 insertions(+), 34 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 #include #include +#include #include #include @@ -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 diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp index 8ee4a2d98e..f003bf8c3f 100644 --- a/src/qml/qml/qqmlproperty.cpp +++ b/src/qml/qml/qqmlproperty.cpp @@ -869,23 +869,6 @@ QQmlPropertyPrivate::setBinding(QObject *object, int coreIndex, int valueTypeInd } if (newBinding) { - if (newBinding->targetPropertyIndex() != index || newBinding->targetObject() != object) { - QQmlData *data = QQmlData::get(object, true); - if (data && data->propertyCache) { - QQmlPropertyData propertyData = *data->propertyCache->property(coreIndex); - if (valueTypeIndex != -1) { - const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(propertyData.propType); - Q_ASSERT(valueTypeMetaObject); - QMetaProperty vtProp = valueTypeMetaObject->property(valueTypeIndex); - propertyData.setFlags(propertyData.getFlags() | QQmlPropertyData::IsValueTypeVirtual); - propertyData.valueTypeFlags = QQmlPropertyData::flagsForProperty(vtProp); - propertyData.valueTypePropType = vtProp.userType(); - propertyData.valueTypeCoreIndex = valueTypeIndex; - } - static_cast(newBinding)->setTarget(object, propertyData); - } - } - Q_ASSERT(newBinding->targetPropertyIndex() == index); Q_ASSERT(newBinding->targetObject() == object); @@ -945,23 +928,6 @@ QQmlPropertyPrivate::setBindingNoEnable(QObject *object, int coreIndex, int valu binding->removeFromObject(); if (newBinding) { - if (newBinding->targetPropertyIndex() != index || newBinding->targetObject() != object) { - QQmlData *data = QQmlData::get(object, true); - if (data && data->propertyCache) { - QQmlPropertyData propertyData = *data->propertyCache->property(coreIndex); - if (valueTypeIndex != -1) { - const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(propertyData.propType); - Q_ASSERT(valueTypeMetaObject); - QMetaProperty vtProp = valueTypeMetaObject->property(valueTypeIndex); - propertyData.setFlags(propertyData.getFlags() | QQmlPropertyData::IsValueTypeVirtual); - propertyData.valueTypeFlags = QQmlPropertyData::flagsForProperty(vtProp); - propertyData.valueTypePropType = vtProp.userType(); - propertyData.valueTypeCoreIndex = valueTypeIndex; - } - static_cast(newBinding)->setTarget(object, propertyData); - } - } - Q_ASSERT(newBinding->targetPropertyIndex() == index); Q_ASSERT(newBinding->targetObject() == object); -- cgit v1.2.3