diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h index a741f53b6932867c0cd574e31b2b13da834e363d..d0a6a9071b981c260a59dd7b68b9bc4d7d027bb8 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstance.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstance.h @@ -120,6 +120,8 @@ public: QVariant defaultValue(const QString &name) const; QString instanceType(const QString &name) const; + bool hasBindingForProperty(const QString &name) const; + bool isValid() const; void makeInvalid(); bool hasContent() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h index e04c8fffff60e7a9f482e879f23073400cd315e3..93009814400e1b8ae826fc8716ad88905130de4b 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h @@ -67,6 +67,7 @@ public: bool hasProperty(const QString &name) const; bool hasBindingProperty(const QString &name) const; + bool instanceHasBinding(const QString &name) const; bool propertyAffectedByCurrentState(const QString &name) const; QVariant modelValue(const QString &name) const; QString expression(const QString &name) const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index 09a4ee7bc3fbd95e548dbdfff7a5c9945fc8ecb4..d65fb2feac7c83dff5f6ea9a8e521b7e6098521c 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -418,6 +418,11 @@ QVariant NodeInstance::property(const QString &name) const return m_nodeInstance->property(name); } +bool NodeInstance::hasBindingForProperty(const QString &name) const +{ + return m_nodeInstance->hasBindingForProperty(name); +} + /*! \brief Returns the property default value of the property of this NodeInstance. \returns QVariant default value which is the reset value to diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp index fe43cdd5b97a65b36fe044fd851a3e981d456732..5326c7945064db2c68e0a8a6bd2b2528ec374162 100644 --- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp @@ -548,6 +548,13 @@ void ObjectNodeInstance::refreshProperty(const QString &name) property.write(oldValue); } +bool ObjectNodeInstance::hasBindingForProperty(const QString &name) const +{ + QDeclarativeProperty property(object(), name, context()); + + return QDeclarativePropertyPrivate::binding(property); +} + void ObjectNodeInstance::doResetProperty(const QString &propertyName) { m_modelAbstractPropertyHash.remove(propertyName); diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h index 982292fb3cadb5adcf083147a583dad4342a52a2..aaa0d6a9ceb4f8db6b6a35acd6b4b3d8117218c7 100644 --- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h @@ -163,6 +163,8 @@ public: virtual bool hasContent() const; + bool hasBindingForProperty(const QString &name) const; + QDeclarativeContext *context() const; virtual bool updateStateVariant(const NodeInstance &target, const QString &propertyName, const QVariant &value); diff --git a/src/plugins/qmldesigner/designercore/instances/qmlpropertychangesnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/qmlpropertychangesnodeinstance.cpp index a427a09c961fe85cfe4b6fe0925665aa322b0137..372a0cfd7d923c4d61d60f2ef6610429c1cfe2da 100644 --- a/src/plugins/qmldesigner/designercore/instances/qmlpropertychangesnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/qmlpropertychangesnodeinstance.cpp @@ -229,7 +229,11 @@ void QmlPropertyChangesNodeInstance::resetProperty(const QString &name) void QmlPropertyChangesNodeInstance::reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty) { + changesObject()->detachFromState(); + ObjectNodeInstance::reparent(oldParentInstance, oldParentProperty, newParentInstance, newParentProperty); + + changesObject()->attachToState(); } //QDeclarativeState *QmlPropertyChangesObject::state() const diff --git a/src/plugins/qmldesigner/designercore/instances/qmlstatenodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/qmlstatenodeinstance.cpp index 2abb34501b7a4a8c553d09a9a19fa750ab83768c..5a6da6ff110b3de0321a06aada85e59afc38a1d7 100644 --- a/src/plugins/qmldesigner/designercore/instances/qmlstatenodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/qmlstatenodeinstance.cpp @@ -100,9 +100,7 @@ QDeclarativeStateGroup *QmlStateNodeInstance::stateGroup() const bool QmlStateNodeInstance::isStateActive() const { - Q_ASSERT(stateObject()); - Q_ASSERT(stateGroup()); - return (stateGroup()->state() == property("name")); + return stateObject() && stateGroup() && stateGroup()->state() == property("name"); } void QmlStateNodeInstance::setPropertyVariant(const QString &name, const QVariant &value) @@ -137,7 +135,7 @@ bool QmlStateNodeInstance::updateStateBinding(const NodeInstance &target, const bool QmlStateNodeInstance::resetStateProperty(const NodeInstance &target, const QString &propertyName, const QVariant &resetValue) { - return stateObject()->removeEntryInRevertList(target.internalObject(), propertyName.toLatin1()); + return stateObject()->removeEntryFromRevertList(target.internalObject(), propertyName.toLatin1()); } } // namespace Internal diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 85127ce0823177d97de0621ebe83e618b6f142fa..41ff3507249fa6409ed3e6bb3d627d2800608fac 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -47,7 +47,7 @@ void QmlObjectNode::setVariantProperty(const QString &name, const QVariant &valu throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); if (isInBaseState()) { - modelNode().variantProperty(name) = value; //basestate + modelNode().variantProperty(name).setValue(value); //basestate } else { modelNode().validId(); @@ -95,7 +95,7 @@ instanciated instance of this object. */ QVariant QmlObjectNode::instanceValue(const QString &name) const { - return instanceValue(modelNode(), name); + return nodeInstance().property(name); } @@ -392,6 +392,15 @@ QString QmlObjectNode::instanceType(const QString &name) const return nodeInstance().instanceType(name); } +bool QmlObjectNode::instanceHasBinding(const QString &name) const +{ + QmlModelView *modelView = qobject_cast<QmlModelView*>(modelNode().view()); + if (!modelView) + throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); + + return nodeInstance().hasBindingForProperty(name); +} + NodeInstance QmlObjectNode::nodeInstance() const { return qmlModelView()->nodeInstanceView()->instanceForNode(modelNode()); diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp index fa2ac1b7684e216ccdd05bed6890f066ab1cb3d5..c5e6905b1ecea3262caf5ee7a4f39ddd7ab22c31 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp @@ -4794,6 +4794,7 @@ void tst_TestCore::testInstancesBindingsInStatesStress() } QmlItemNode(node3).setBindingProperty("width", "parent.x + 30"); + QVERIFY(QmlItemNode(node3).instanceHasBinding("width")); QCOMPARE(QmlItemNode(node3).instanceValue("width").toInt(), 130); view->setCurrentState(view->baseState());