From ab3442ea7abc1664fcaa3780121d0eff2046d8f3 Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Fri, 7 May 2010 13:36:33 +0200
Subject: [PATCH] QmlDesigner.model extending QmlState

---
 .../designercore/include/qmlobjectnode.h         |  2 ++
 .../qmldesigner/designercore/include/qmlstate.h  |  2 ++
 .../designercore/model/qmlobjectnode.cpp         | 14 +++++++++++---
 .../qmldesigner/designercore/model/qmlstate.cpp  | 16 ++++++++++++++++
 4 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h
index 5dd0ca64488..63d6517924f 100644
--- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h
+++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h
@@ -89,6 +89,8 @@ public:
 
     bool isAncestorOf(const QmlObjectNode &objectNode) const;
 
+    static  QVariant instanceValue(const ModelNode &modelNode, const QString &name);
+
 protected:
     NodeInstance nodeInstance() const;
     QmlObjectNode nodeForInstance(const NodeInstance &instance) const;
diff --git a/src/plugins/qmldesigner/designercore/include/qmlstate.h b/src/plugins/qmldesigner/designercore/include/qmlstate.h
index e77e29c2bfe..017a0f370f3 100644
--- a/src/plugins/qmldesigner/designercore/include/qmlstate.h
+++ b/src/plugins/qmldesigner/designercore/include/qmlstate.h
@@ -38,6 +38,7 @@ namespace QmlDesigner {
 
 class QmlModelView;
 class QmlModelStateGroup;
+class QmlObjectNode;
 
 class CORESHARED_EXPORT QmlModelState : public QmlModelNodeFacade
 {
@@ -59,6 +60,7 @@ public:
     void removePropertyChanges(const ModelNode &node);
 
     bool affectsModelNode(const ModelNode &node) const;
+    QList<QmlObjectNode> allAffectedNodes() const;
     QString name() const;
     void setName(const QString &name);
     bool isValid() const;
diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp
index ef88ccfe01c..69a70cb8d99 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp
@@ -93,9 +93,8 @@ instanciated instance of this object.
 
 */
 QVariant  QmlObjectNode::instanceValue(const QString &name) const
-{
-    Q_ASSERT(qmlModelView()->hasInstanceForModelNode(modelNode()));
-    return qmlModelView()->instanceForModelNode(modelNode()).property(name);
+{    
+    return instanceValue(modelNode(), name);
 }
 
 
@@ -378,6 +377,15 @@ bool QmlObjectNode::isAncestorOf(const QmlObjectNode &objectNode) const
     return modelNode().isAncestorOf(objectNode.modelNode());
 }
 
+QVariant QmlObjectNode::instanceValue(const ModelNode &modelNode, const QString &name)
+{
+    QmlModelView *modelView = qobject_cast<QmlModelView*>(modelNode.view());
+    if (!modelView)
+        throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
+    Q_ASSERT(modelView->hasInstanceForModelNode(modelNode));
+    return modelView->instanceForModelNode(modelNode).property(name);
+}
+
 NodeInstance QmlObjectNode::nodeInstance() const
 {
     return qmlModelView()->nodeInstanceView()->instanceForNode(modelNode());
diff --git a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp
index 5b6109e232f..2c21384598d 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp
@@ -189,6 +189,9 @@ void QmlModelState::removePropertyChanges(const ModelNode &node)
 {
     //### exception if not valid
 
+    if (!isValid())
+        throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
+
     if (isBaseState())
         return;
 
@@ -211,6 +214,19 @@ bool QmlModelState::affectsModelNode(const ModelNode &node) const
     return !stateOperations(node).isEmpty();
 }
 
+QList<QmlObjectNode> QmlModelState::allAffectedNodes() const
+{
+    QList<QmlObjectNode> returnList;
+
+    foreach (const ModelNode &childNode, modelNode().nodeListProperty("changes").toModelNodeList()) {
+        //### exception if not valid QmlModelStateOperation
+        if (QmlModelStateOperation(childNode).isValid() &&
+            !returnList.contains(QmlModelStateOperation(childNode).target()))
+            returnList.append(QmlModelStateOperation(childNode).target());
+    }
+    return returnList;
+}
+
 QString QmlModelState::name() const
 {
     if (isBaseState())
-- 
GitLab