aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlproperty.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2015-04-15 10:24:39 +0200
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2015-04-26 16:33:56 +0000
commit01c0c0963794f4dd8c3601e8340cc3dc4dec41bd (patch)
tree91dc7d0bc38d8f03ddf6a2aff97754c1e9183f33 /src/qml/qml/qqmlproperty.cpp
parentf65f0d4e1da39a5f5fa92e0b8d9ba4ad346d78ef (diff)
Get rid of QQmlBinding::retargetBinding()
Instead call setTarget directly and properly resolve the required QQmlPropertyData. Saves some memory for bindings to value types. Change-Id: I542b456685955add7d395764ff85cb3098b3f208 Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/qml/qqmlproperty.cpp')
-rw-r--r--src/qml/qml/qqmlproperty.cpp36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp
index 25be1b05c2..8ee4a2d98e 100644
--- a/src/qml/qml/qqmlproperty.cpp
+++ b/src/qml/qml/qqmlproperty.cpp
@@ -869,8 +869,22 @@ QQmlPropertyPrivate::setBinding(QObject *object, int coreIndex, int valueTypeInd
}
if (newBinding) {
- if (newBinding->targetPropertyIndex() != index || newBinding->targetObject() != object)
- newBinding->retargetBinding(object, index);
+ 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<QQmlBinding *>(newBinding)->setTarget(object, propertyData);
+ }
+ }
Q_ASSERT(newBinding->targetPropertyIndex() == index);
Q_ASSERT(newBinding->targetObject() == object);
@@ -931,8 +945,22 @@ QQmlPropertyPrivate::setBindingNoEnable(QObject *object, int coreIndex, int valu
binding->removeFromObject();
if (newBinding) {
- if (newBinding->targetPropertyIndex() != index || newBinding->targetObject() != object)
- newBinding->retargetBinding(object, index);
+ 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<QQmlBinding *>(newBinding)->setTarget(object, propertyData);
+ }
+ }
Q_ASSERT(newBinding->targetPropertyIndex() == index);
Q_ASSERT(newBinding->targetObject() == object);