diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2009-10-23 06:32:05 (GMT) |
---|---|---|
committer | Michael Brasser <michael.brasser@nokia.com> | 2009-10-23 06:34:19 (GMT) |
commit | 603c2a0475888928462679562e9b10acefaec629 (patch) | |
tree | 20f2a91c918b1522f9f75f9dbf0ce46b9a1fb8ce /src/declarative/qml/qmlvmemetaobject.cpp | |
parent | 14b352dc58aa9790c8d1c2af0e546be975ef315c (diff) | |
download | Qt-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.cpp | 33 |
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)); } |