diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.cpp index f28a8768ab565281018ca0a809fc62fb76326119..d47bf05fe373d5050f39dfe6784848e7d85d4617 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.cpp @@ -26,10 +26,16 @@ void NodeInstanceSignalSpy::setObjectNodeInstance(const ObjectNodeInstance::Poin void NodeInstanceSignalSpy::registerObject(QObject *spiedObject, const QString &prefix) { + if (registeredObjectList.contains(spiedObject)) // prevent cycles + return; + + registeredObjectList.append(spiedObject); for (int index = QObject::staticMetaObject.propertyOffset(); index < spiedObject->metaObject()->propertyCount(); index++) { QMetaProperty metaProperty = spiedObject->metaObject()->property(index); + + // handle dot properties and connect the signals to the object if (metaProperty.isReadable() && !metaProperty.isWritable() && QDeclarativeMetaType::isQObject(metaProperty.userType())) { @@ -43,6 +49,28 @@ void NodeInstanceSignalSpy::registerObject(QObject *spiedObject, const QString & m_indexPropertyHash.insert(methodeOffset, prefix + metaProperty.name()); methodeOffset++; } + + // search recursive in objects + if (metaProperty.isReadable() + && metaProperty.isWritable() + && QDeclarativeMetaType::isQObject(metaProperty.userType())) { + QObject *propertyObject = QDeclarativeMetaType::toQObject(metaProperty.read(spiedObject)); + if (propertyObject) + registerObject(propertyObject, prefix + metaProperty.name() + "/"); + } + + // search recursive in objects list + if (metaProperty.isReadable() + && QDeclarativeMetaType::isList(metaProperty.userType())) { + QDeclarativeListReference list(spiedObject, metaProperty.name()); + if (list.canCount() && list.canAt()) { + for (int i = 0; i < list.count(); i++) { + QObject *propertyObject = list.at(i); + if (propertyObject) + registerObject(propertyObject, prefix + metaProperty.name() + "/"); + } + } + } } } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.h index ff33b8cdbef6a038ec211d419612aa5ef17c7e32..94cef6d2321c8c0090f21a9bda030751a853e606 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.h @@ -27,6 +27,7 @@ protected: private: int methodeOffset; QHash<int, QString> m_indexPropertyHash; + QObjectList registeredObjectList; ObjectNodeInstanceWeakPointer m_objectNodeInstance; };