diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2012-05-02 11:47:55 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-10 02:49:46 +0200 |
commit | 527b700f73c3bc114ba092418ee48626e95014a3 (patch) | |
tree | 6a8fb41652cb604d7f88430e84b7f27bb14cb9cd /src/qml/qml/v4 | |
parent | 319007117a8fafe9a72230bbc13fb18833ff4a16 (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.cpp | 26 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4bindings_p.h | 9 |
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; |