QmlPuppet: Remove dependency on ObjectNodeInstance in MetaInfo

MetaInfo cannot depend on ObjectNodeInstance.
I forward the QObject and the QmlEngine all the way through.
The commented code in metainfo.cpp is about defining a context
for the root item. The feature is basically unused, but we can bring
it back using a callback later.

Change-Id: I8f099b06c848e2faeaafc011ac6bd313192a64bd
Reviewed-by: Alessandro Portale <alessandro.portale@theqtcompany.com>
This commit is contained in:
Thomas Hartmann
2015-05-20 20:45:48 +02:00
parent c9eb75e2f8
commit fa6d623dfa
6 changed files with 35 additions and 44 deletions

View File

@@ -842,12 +842,12 @@ void NodeInstanceServer::setInstancePropertyBinding(const PropertyBindingContain
bool stateBindingWasUpdated = activeStateInstance().updateStateBinding(instance, name, expression); bool stateBindingWasUpdated = activeStateInstance().updateStateBinding(instance, name, expression);
if (!stateBindingWasUpdated) { if (!stateBindingWasUpdated) {
if (bindingContainer.isDynamic()) if (bindingContainer.isDynamic())
Internal::QmlPrivateGate::createNewDynamicProperty(instance.internalInstance(), name); Internal::QmlPrivateGate::createNewDynamicProperty(instance.internalInstance()->object(), engine(), name);
instance.setPropertyBinding(name, expression); instance.setPropertyBinding(name, expression);
} }
} else { } else {
if (bindingContainer.isDynamic()) if (bindingContainer.isDynamic())
Internal::QmlPrivateGate::createNewDynamicProperty(instance.internalInstance(), name); Internal::QmlPrivateGate::createNewDynamicProperty(instance.internalInstance()->object(), engine(), name);
instance.setPropertyBinding(name, expression); instance.setPropertyBinding(name, expression);
} }
} }
@@ -874,12 +874,12 @@ void NodeInstanceServer::setInstancePropertyVariant(const PropertyValueContainer
bool stateValueWasUpdated = activeStateInstance().updateStateVariant(instance, name, value); bool stateValueWasUpdated = activeStateInstance().updateStateVariant(instance, name, value);
if (!stateValueWasUpdated) { if (!stateValueWasUpdated) {
if (valueContainer.isDynamic()) if (valueContainer.isDynamic())
Internal::QmlPrivateGate::createNewDynamicProperty(instance.internalInstance(), name); Internal::QmlPrivateGate::createNewDynamicProperty(instance.internalInstance()->object(), engine(), name);
instance.setPropertyVariant(name, value); instance.setPropertyVariant(name, value);
} }
} else { //base state } else { //base state
if (valueContainer.isDynamic()) if (valueContainer.isDynamic())
Internal::QmlPrivateGate::createNewDynamicProperty(instance.internalInstance(), name); Internal::QmlPrivateGate::createNewDynamicProperty(instance.internalInstance()->object(), engine(), name);
instance.setPropertyVariant(name, value); instance.setPropertyVariant(name, value);
} }

View File

@@ -133,7 +133,7 @@ void ObjectNodeInstance::initializePropertyWatcher(const ObjectNodeInstance::Poi
void ObjectNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance) void ObjectNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance)
{ {
initializePropertyWatcher(objectNodeInstance); initializePropertyWatcher(objectNodeInstance);
QmlPrivateGate::registerNodeInstanceMetaObject(objectNodeInstance); QmlPrivateGate::registerNodeInstanceMetaObject(objectNodeInstance->object(), objectNodeInstance->nodeInstanceServer()->engine());
} }
void ObjectNodeInstance::setId(const QString &id) void ObjectNodeInstance::setId(const QString &id)

View File

@@ -30,7 +30,6 @@
#include "metaobject.h" #include "metaobject.h"
#include <objectnodeinstance.h>
#include <QSharedPointer> #include <QSharedPointer>
#include <QMetaProperty> #include <QMetaProperty>
#include <qnumeric.h> #include <qnumeric.h>
@@ -114,16 +113,16 @@ static QQmlPropertyCache *cacheForObject(QObject *object, QQmlEngine *engine)
return QQmlEnginePrivate::get(engine)->cache(object); return QQmlEnginePrivate::get(engine)->cache(object);
} }
MetaObject* MetaObject::getNodeInstanceMetaObject(const ObjectNodeInstancePointer &nodeInstance) MetaObject* MetaObject::getNodeInstanceMetaObject(QObject *object, QQmlEngine *engine)
{ {
//Avoid setting up multiple NodeInstanceMetaObjects on the same QObject //Avoid setting up multiple MetaObjects on the same QObject
QObjectPrivate *op = QObjectPrivate::get(nodeInstance->object()); QObjectPrivate *op = QObjectPrivate::get(object);
QDynamicMetaObjectData *parent = op->metaObject; QDynamicMetaObjectData *parent = op->metaObject;
if (nodeInstanceMetaObjectList.contains(parent)) if (nodeInstanceMetaObjectList.contains(parent))
return static_cast<MetaObject *>(parent); return static_cast<MetaObject *>(parent);
// we just create one and the ownership goes automatically to the object in nodeinstance see init method // we just create one and the ownership goes automatically to the object in nodeinstance see init method
return new MetaObject(nodeInstance, nodeInstance->nodeInstanceServer()->engine()); return new MetaObject(object, engine);
} }
void MetaObject::init(QObject *object, QQmlEngine *engine) void MetaObject::init(QObject *object, QQmlEngine *engine)
@@ -150,16 +149,15 @@ void MetaObject::init(QObject *object, QQmlEngine *engine)
hasAssignedMetaObjectData = true; hasAssignedMetaObjectData = true;
} }
MetaObject::MetaObject(const ObjectNodeInstance::Pointer &nodeInstance, QQmlEngine *engine) MetaObject::MetaObject(QObject *object, QQmlEngine *engine)
: QQmlVMEMetaObject(nodeInstance->object(), cacheForObject(nodeInstance->object(), engine), vMEMetaDataForObject(nodeInstance->object())), : QQmlVMEMetaObject(object, cacheForObject(object, engine), vMEMetaDataForObject(object)),
m_nodeInstance(nodeInstance), m_context(engine->contextForObject(object)),
m_context(engine->contextForObject(nodeInstance->object())),
m_data(new MetaPropertyData), m_data(new MetaPropertyData),
m_cache(0) m_cache(0)
{ {
init(nodeInstance->object(), engine); init(object, engine);
QQmlData *ddata = QQmlData::get(nodeInstance->object(), false); QQmlData *ddata = QQmlData::get(object, false);
//Assign cache to object //Assign cache to object
if (ddata && ddata->propertyCache) { if (ddata && ddata->propertyCache) {
@@ -291,8 +289,6 @@ int MetaObject::metaCall(QMetaObject::Call call, int id, void **a)
oldValue = propertyById.read(myObject()); oldValue = propertyById.read(myObject());
} }
ObjectNodeInstance::Pointer objectNodeInstance = m_nodeInstance.toStrongRef();
QAbstractDynamicMetaObject *directParent = parent(); QAbstractDynamicMetaObject *directParent = parent();
if (directParent && id < directParent->propertyOffset()) { if (directParent && id < directParent->propertyOffset()) {
metaCallReturnValue = directParent->metaCall(call, id, a); metaCallReturnValue = directParent->metaCall(call, id, a);
@@ -300,6 +296,7 @@ int MetaObject::metaCall(QMetaObject::Call call, int id, void **a)
openMetaCall(call, id, a); openMetaCall(call, id, a);
} }
/*
if ((call == QMetaObject::WriteProperty || call == QMetaObject::ReadProperty) && metaCallReturnValue < 0) { if ((call == QMetaObject::WriteProperty || call == QMetaObject::ReadProperty) && metaCallReturnValue < 0) {
if (objectNodeInstance if (objectNodeInstance
&& objectNodeInstance->nodeInstanceServer() && objectNodeInstance->nodeInstanceServer()
@@ -313,6 +310,7 @@ int MetaObject::metaCall(QMetaObject::Call call, int id, void **a)
metaCallReturnValue = contextDummyObject->qt_metacall(call, properyIndex, a); metaCallReturnValue = contextDummyObject->qt_metacall(call, properyIndex, a);
} }
} }
*/
if (call == QMetaObject::WriteProperty if (call == QMetaObject::WriteProperty
&& !propertyById.hasNotifySignal() && !propertyById.hasNotifySignal()
@@ -324,10 +322,8 @@ int MetaObject::metaCall(QMetaObject::Call call, int id, void **a)
void MetaObject::notifyPropertyChange(int id) void MetaObject::notifyPropertyChange(int id)
{ {
ObjectNodeInstance::Pointer objectNodeInstance = m_nodeInstance.toStrongRef();
const QMetaProperty propertyById = property(id); const QMetaProperty propertyById = property(id);
if (objectNodeInstance && objectNodeInstance->nodeInstanceServer()) {
if (id < propertyOffset()) { if (id < propertyOffset()) {
if (notifyPropertyChangeCallBack) if (notifyPropertyChangeCallBack)
notifyPropertyChangeCallBack(myObject(), propertyById.name()); notifyPropertyChangeCallBack(myObject(), propertyById.name());
@@ -336,7 +332,6 @@ void MetaObject::notifyPropertyChange(int id)
notifyPropertyChangeCallBack(myObject(), name(id - propertyOffset())); notifyPropertyChangeCallBack(myObject(), name(id - propertyOffset()));
} }
} }
}
int MetaObject::count() const int MetaObject::count() const
{ {

View File

@@ -42,14 +42,10 @@ namespace QmlDesigner {
namespace Internal { namespace Internal {
class ObjectNodeInstance;
typedef QSharedPointer<ObjectNodeInstance> ObjectNodeInstancePointer;
typedef QWeakPointer<ObjectNodeInstance> ObjectNodeInstanceWeakPointer;
namespace QmlPrivateGate { namespace QmlPrivateGate {
void createNewDynamicProperty(const ObjectNodeInstancePointer &nodeInstance, const QString &name); void createNewDynamicProperty(QObject *object, QQmlEngine *engine, const QString &name);
void registerNodeInstanceMetaObject(const ObjectNodeInstancePointer &nodeInstance); void registerNodeInstanceMetaObject(QObject *object, QQmlEngine *engine);
struct MetaPropertyData; struct MetaPropertyData;
@@ -61,8 +57,8 @@ public:
static void registerNotifyPropertyChangeCallBack(void (*callback)(QObject*, const PropertyName &propertyName)); static void registerNotifyPropertyChangeCallBack(void (*callback)(QObject*, const PropertyName &propertyName));
protected: protected:
MetaObject(const ObjectNodeInstancePointer &nodeInstance, QQmlEngine *engine); MetaObject(QObject *object, QQmlEngine *engine);
static MetaObject* getNodeInstanceMetaObject(const ObjectNodeInstancePointer &nodeInstance); static MetaObject* getNodeInstanceMetaObject(QObject *object, QQmlEngine *engine);
void createNewDynamicProperty(const QString &name); void createNewDynamicProperty(const QString &name);
int openMetaCall(QMetaObject::Call _c, int _id, void **_a); int openMetaCall(QMetaObject::Call _c, int _id, void **_a);
@@ -88,15 +84,15 @@ protected:
private: private:
void init(QObject *, QQmlEngine *engine); void init(QObject *, QQmlEngine *engine);
ObjectNodeInstanceWeakPointer m_nodeInstance;
QPointer<QQmlContext> m_context; QPointer<QQmlContext> m_context;
QQmlOpenMetaObjectType *m_type; QQmlOpenMetaObjectType *m_type;
QScopedPointer<MetaPropertyData> m_data; QScopedPointer<MetaPropertyData> m_data;
//QAbstractDynamicMetaObject *m_parent; //QAbstractDynamicMetaObject *m_parent;
QQmlPropertyCache *m_cache; QQmlPropertyCache *m_cache;
friend void createNewDynamicProperty(const ObjectNodeInstancePointer &nodeInstance, const QString &name);
friend void registerNodeInstanceMetaObject(const ObjectNodeInstancePointer &nodeInstance); friend void createNewDynamicProperty(QObject *object, QQmlEngine *engine, const QString &name);
friend void registerNodeInstanceMetaObject(QObject *object, QQmlEngine *engine);
}; };
} // namespace QmlPrivateGate } // namespace QmlPrivateGate

View File

@@ -319,15 +319,15 @@ static bool isCrashingType(QQmlType *type)
return false; return false;
} }
void createNewDynamicProperty(const ObjectNodeInstancePointer &nodeInstance, const QString &name) void createNewDynamicProperty(QObject *object, QQmlEngine *engine, const QString &name)
{ {
MetaObject::getNodeInstanceMetaObject(nodeInstance)->createNewDynamicProperty(name); MetaObject::getNodeInstanceMetaObject(object, engine)->createNewDynamicProperty(name);
} }
void registerNodeInstanceMetaObject(const ObjectNodeInstancePointer &nodeInstance) void registerNodeInstanceMetaObject(QObject *object, QQmlEngine *engine)
{ {
// we just create one and the ownership goes automatically to the object in nodeinstance see init method // we just create one and the ownership goes automatically to the object in nodeinstance see init method
MetaObject::getNodeInstanceMetaObject(nodeInstance); MetaObject::getNodeInstanceMetaObject(object, engine);
} }
QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context) QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context)

View File

@@ -67,8 +67,8 @@ public:
#endif #endif
}; };
void createNewDynamicProperty(const ObjectNodeInstancePointer &nodeInstance, const QString &name); void createNewDynamicProperty(QObject *object, QQmlEngine *engine, const QString &name);
void registerNodeInstanceMetaObject(const ObjectNodeInstancePointer &nodeInstance); void registerNodeInstanceMetaObject(QObject *object, QQmlEngine *engine);
QVariant fixResourcePaths(const QVariant &value); QVariant fixResourcePaths(const QVariant &value);
QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context); QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context);
QObject *createComponent(const QUrl &componentUrl, QQmlContext *context); QObject *createComponent(const QUrl &componentUrl, QQmlContext *context);