summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qmlvmemetaobject.cpp
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2009-10-23 06:32:05 (GMT)
committerMichael Brasser <michael.brasser@nokia.com>2009-10-23 06:34:19 (GMT)
commit603c2a0475888928462679562e9b10acefaec629 (patch)
tree20f2a91c918b1522f9f75f9dbf0ce46b9a1fb8ce /src/declarative/qml/qmlvmemetaobject.cpp
parent14b352dc58aa9790c8d1c2af0e546be975ef315c (diff)
downloadQt-603c2a0475888928462679562e9b10acefaec629.zip
Qt-603c2a0475888928462679562e9b10acefaec629.tar.gz
Qt-603c2a0475888928462679562e9b10acefaec629.tar.bz2
Fix Behavior support for value type properties.
Diffstat (limited to 'src/declarative/qml/qmlvmemetaobject.cpp')
-rw-r--r--src/declarative/qml/qmlvmemetaobject.cpp33
1 files changed, 26 insertions, 7 deletions
diff --git a/src/declarative/qml/qmlvmemetaobject.cpp b/src/declarative/qml/qmlvmemetaobject.cpp
index 05a6f58..a627bf9 100644
--- a/src/declarative/qml/qmlvmemetaobject.cpp
+++ b/src/declarative/qml/qmlvmemetaobject.cpp
@@ -105,16 +105,35 @@ int QmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
if (!(flags & QmlMetaProperty::BypassInterceptor)
&& !aInterceptors.isEmpty()
&& aInterceptors.testBit(id)) {
- QmlPropertyValueInterceptor *vi = interceptors.value(id);
+ QPair<int, QmlPropertyValueInterceptor*> pair = interceptors.value(id);
+ int valueIndex = pair.first;
+ QmlPropertyValueInterceptor *vi = pair.second;
+ QVariant::Type type = QVariant::Invalid;
if (id >= propOffset) {
id -= propOffset;
if (id < metaData->propertyCount) {
- vi->write(QVariant(data[id].type(), a[0]));
- return -1;
+ type = data[id].type();
}
} else {
- vi->write(QVariant(property(id).type(), a[0]));
- return -1;
+ type = property(id).type();
+ }
+
+ if (type != QVariant::Invalid) {
+ if (valueIndex != -1) {
+ QmlEnginePrivate *ep = ctxt?QmlEnginePrivate::get(ctxt->engine()):0;
+ QmlValueType *valueType = 0;
+ if (ep) valueType = ep->valueTypes[type];
+ else valueType = QmlValueTypeFactory::valueType(type);
+ Q_ASSERT(valueType);
+
+ valueType->setValue(QVariant(type, a[0]));
+ QMetaProperty valueProp = valueType->metaObject()->property(valueIndex);
+ vi->write(valueProp.read(valueType));
+ return -1;
+ } else {
+ vi->write(QVariant(type, a[0]));
+ return -1;
+ }
}
}
}
@@ -280,12 +299,12 @@ void QmlVMEMetaObject::listChanged(int id)
activate(object, methodOffset + id, 0);
}
-void QmlVMEMetaObject::registerInterceptor(int index, QmlPropertyValueInterceptor *interceptor)
+void QmlVMEMetaObject::registerInterceptor(int index, int valueIndex, QmlPropertyValueInterceptor *interceptor)
{
if (aInterceptors.isEmpty())
aInterceptors.resize(propertyCount() + metaData->propertyCount);
aInterceptors.setBit(index);
- interceptors.insert(index, interceptor);
+ interceptors.insert(index, qMakePair(valueIndex, interceptor));
}