aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/v4
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2012-05-02 11:47:55 +1000
committerQt by Nokia <qt-info@nokia.com>2012-05-10 02:49:46 +0200
commit527b700f73c3bc114ba092418ee48626e95014a3 (patch)
tree6a8fb41652cb604d7f88430e84b7f27bb14cb9cd /src/qml/qml/v4
parent319007117a8fafe9a72230bbc13fb18833ff4a16 (diff)
Allow V4 bindings to be assigned to aliases
V4 bindings must be able to be retargetted for them to be assignable to aliases. Change-Id: I4d3addd0fdc90b9bf472c781d316f7f406eaf1d7 Reviewed-by: Chris Adams <christopher.adams@nokia.com>
Diffstat (limited to 'src/qml/qml/v4')
-rw-r--r--src/qml/qml/v4/qv4bindings.cpp26
-rw-r--r--src/qml/qml/v4/qv4bindings_p.h9
2 files changed, 25 insertions, 10 deletions
diff --git a/src/qml/qml/v4/qv4bindings.cpp b/src/qml/qml/v4/qv4bindings.cpp
index 944d4de210..e19d74370c 100644
--- a/src/qml/qml/v4/qv4bindings.cpp
+++ b/src/qml/qml/v4/qv4bindings.cpp
@@ -319,13 +319,21 @@ void QV4Bindings::Binding::destroy()
int QV4Bindings::Binding::propertyIndex() const
{
+ if (target.hasValue()) return target.constValue()->targetProperty;
//mask out the type information set for value types
- return property & 0xFF00FFFF;
+ else return property & 0xFF00FFFF;
}
QObject *QV4Bindings::Binding::object() const
{
- return target;
+ if (target.hasValue()) return target.constValue()->target;
+ return *target;
+}
+
+void QV4Bindings::Binding::retargetBinding(QObject *t, int i)
+{
+ target.value().target = t;
+ target.value().targetProperty = i;
}
void QV4Bindings::Subscription::subscriptionCallback(QQmlNotifierEndpoint *e, void **)
@@ -359,7 +367,7 @@ void QV4Bindings::run(Binding *binding, QQmlPropertyPrivate::WriteFlags flags)
return;
// Check that the target has not been deleted
- if (QQmlData::wasDeleted(binding->target))
+ if (QQmlData::wasDeleted(*binding->target))
return;
QQmlTrace trace("V4 Binding Update");
@@ -383,7 +391,7 @@ void QV4Bindings::run(Binding *binding, QQmlPropertyPrivate::WriteFlags flags)
} else {
name = QLatin1String(binding->target->metaObject()->property(binding->property).name());
}
- qmlInfo(binding->target) << tr("Binding loop detected for property \"%1\"").arg(name);
+ qmlInfo(*binding->target) << tr("Binding loop detected for property \"%1\"").arg(name);
return;
}
@@ -393,14 +401,14 @@ void QV4Bindings::run(Binding *binding, QQmlPropertyPrivate::WriteFlags flags)
QQmlValueType *vt = ep->valueTypes[(binding->property >> 16) & 0xFF];
Q_ASSERT(vt);
- vt->read(binding->target, binding->property & 0xFFFF);
+ vt->read(*binding->target, binding->property & 0xFFFF);
QObject *target = vt;
run(binding->index, binding->executedBlocks, context, binding, binding->scope, target, flags);
- vt->write(binding->target, binding->property & 0xFFFF, flags);
+ vt->write(*binding->target, binding->property & 0xFFFF, flags);
} else {
- QQmlData *data = QQmlData::get(binding->target);
+ QQmlData *data = QQmlData::get(*binding->target);
QQmlPropertyData *propertyData = (data && data->propertyCache ? data->propertyCache->property(binding->property) : 0);
if (propertyData && propertyData->isVMEProperty()) {
@@ -408,9 +416,9 @@ void QV4Bindings::run(Binding *binding, QQmlPropertyPrivate::WriteFlags flags)
v8::HandleScope handle_scope;
v8::Context::Scope context_scope(QQmlEnginePrivate::get(context->engine)->v8engine()->context());
- run(binding->index, binding->executedBlocks, context, binding, binding->scope, binding->target, flags);
+ run(binding->index, binding->executedBlocks, context, binding, binding->scope, *binding->target, flags);
} else {
- run(binding->index, binding->executedBlocks, context, binding, binding->scope, binding->target, flags);
+ run(binding->index, binding->executedBlocks, context, binding, binding->scope, *binding->target, flags);
}
}
binding->updating = false;
diff --git a/src/qml/qml/v4/qv4bindings_p.h b/src/qml/qml/v4/qv4bindings_p.h
index 78a3f9bab3..8ceccbb731 100644
--- a/src/qml/qml/v4/qv4bindings_p.h
+++ b/src/qml/qml/v4/qv4bindings_p.h
@@ -56,6 +56,7 @@
#include "private/qqmlexpression_p.h"
#include "private/qqmlbinding_p.h"
#include "private/qv4instruction_p.h"
+#include "private/qpointervaluepair_p.h"
QT_BEGIN_HEADER
@@ -91,8 +92,14 @@ private:
virtual void update(QQmlPropertyPrivate::WriteFlags flags);
virtual void destroy();
virtual int propertyIndex() const;
+ virtual void retargetBinding(QObject *, int);
virtual QObject *object() const;
+ struct Retarget {
+ QObject *target;
+ int targetProperty;
+ };
+
int index:30;
bool enabled:1;
bool updating:1;
@@ -102,7 +109,7 @@ private:
QObject *scope;
int line;
int column;
- QObject *target;
+ QPointerValuePair<QObject, Retarget> target;
quint32 executedBlocks;
QV4Bindings *parent;