summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@nokia.com>2011-07-13 17:53:14 +0200
committerMarco Bubke <marco.bubke@nokia.com>2011-07-13 18:42:47 +0200
commit01eece3d8474ebaa898812876cbb8fad4a7ae3da (patch)
tree363fc9934be6dc0eb8b17dc49eb045b0285c16d9
parent086e3ad37306d6849826d66a0c00421e1559f8d9 (diff)
downloadqt-creator-01eece3d8474ebaa898812876cbb8fad4a7ae3da.tar.gz
QmlDesigner: Fix state switching
Task-number: QTCREATORBUG-4062 Change-Id: I2a04c5a04ef40390772fe46f587bc60c02a4bab1 Reviewed-on: http://codereview.qt.nokia.com/1605 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
-rw-r--r--share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp8
-rw-r--r--share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.h1
-rw-r--r--src/plugins/qmldesigner/designercore/include/abstractview.h4
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstanceview.h5
-rw-r--r--src/plugins/qmldesigner/designercore/include/qmlstate.h2
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp33
-rw-r--r--src/plugins/qmldesigner/designercore/model/abstractview.cpp8
-rw-r--r--src/plugins/qmldesigner/designercore/model/model.cpp7
-rw-r--r--src/plugins/qmldesigner/designercore/model/model_p.h4
-rw-r--r--src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp34
-rw-r--r--src/plugins/qmldesigner/designercore/model/qmlstate.cpp10
11 files changed, 64 insertions, 52 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp
index 12a7a5d1d6..b6661ef331 100644
--- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp
@@ -187,5 +187,13 @@ void Qt4RenderNodeInstanceServer::completeComponent(const CompleteComponentComma
nodeInstanceClient()->pixmapChanged(createPixmapChangedCommand(instanceList));
}
+void Qt4RenderNodeInstanceServer::changeState(const ChangeStateCommand &command)
+{
+ Qt4NodeInstanceServer::changeState(command);
+ foreach (QGraphicsItem *item, declarativeView()->items()) {
+ item->update();
+ QGraphicsItemPrivate::get(item)->notifyBoundingRectChanged = 1;
+ }
+}
} // namespace QmlDesigner
diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.h
index dde4056a65..98a6d83a1d 100644
--- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.h
+++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.h
@@ -46,6 +46,7 @@ public:
void createScene(const CreateSceneCommand &command);
void clearScene(const ClearSceneCommand &command);
void completeComponent(const CompleteComponentCommand &command);
+ void changeState(const ChangeStateCommand &command);
protected:
void collectItemChangesAndSendChangeCommands();
diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h
index 45b2a064d6..27c2b06af3 100644
--- a/src/plugins/qmldesigner/designercore/include/abstractview.h
+++ b/src/plugins/qmldesigner/designercore/include/abstractview.h
@@ -122,7 +122,6 @@ public:
void emitRewriterBeginTransaction();
void emitRewriterEndTransaction();
void emitInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector);
- void emitActualStateChanged(const ModelNode &node);
void sendTokenToInstances(const QString &token, int number, const QVector<ModelNode> &nodeVector);
@@ -178,6 +177,9 @@ public:
NodeInstanceView *nodeInstanceView() const;
RewriterView *rewriterView() const;
+ void setAcutalStateNode(const ModelNode &node);
+ ModelNode actualStateNode() const;
+
void resetView();
protected:
diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
index 053da698e2..e4b1ba6e8b 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
@@ -130,8 +130,6 @@ public:
NodeInstance activeStateInstance() const;
- void activateState(const NodeInstance &instance);
- void activateBaseState();
void valuesChanged(const ValuesChangedCommand &command);
void pixmapChanged(const PixmapChangedCommand &command);
@@ -151,6 +149,9 @@ signals:
void qmlPuppetCrashed();
private: // functions
+ void activateState(const NodeInstance &instance);
+ void activateBaseState();
+
NodeInstance rootNodeInstance() const;
NodeInstance loadNode(const ModelNode &node);
diff --git a/src/plugins/qmldesigner/designercore/include/qmlstate.h b/src/plugins/qmldesigner/designercore/include/qmlstate.h
index 897fa61ebf..ea8226ec9e 100644
--- a/src/plugins/qmldesigner/designercore/include/qmlstate.h
+++ b/src/plugins/qmldesigner/designercore/include/qmlstate.h
@@ -77,8 +77,6 @@ protected:
void addChangeSetIfNotExists(const ModelNode &node);
static QmlModelState createBaseState(const QmlModelView *view);
-private:
- bool m_isBaseState;
};
} //QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
index b21add18e2..241663e708 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
@@ -172,6 +172,13 @@ void NodeInstanceView::modelAttached(Model *model)
if (!isSkippedRootNode(rootModelNode()))
nodeInstanceServer()->createScene(createCreateSceneCommand());
+
+ ModelNode stateNode = actualStateNode();
+ if (stateNode.isValid() && stateNode.metaInfo().isSubclassOf("QtQuick.State", 1, 0)) {
+ NodeInstance newStateInstance = instanceForNode(stateNode);
+ activateState(newStateInstance);
+ }
+
}
void NodeInstanceView::modelAboutToBeDetached(Model * model)
@@ -210,6 +217,12 @@ void NodeInstanceView::restartProcess()
if (!isSkippedRootNode(rootModelNode()))
nodeInstanceServer()->createScene(createCreateSceneCommand());
+
+ ModelNode stateNode = actualStateNode();
+ if (stateNode.isValid() && stateNode.metaInfo().isSubclassOf("QtQuick.State", 1, 0)) {
+ NodeInstance newStateInstance = instanceForNode(stateNode);
+ activateState(newStateInstance);
+ }
}
}
@@ -539,8 +552,15 @@ void NodeInstanceView::rewriterEndTransaction()
}
-void NodeInstanceView::actualStateChanged(const ModelNode &/*node*/)
+void NodeInstanceView::actualStateChanged(const ModelNode &node)
{
+ NodeInstance newStateInstance = instanceForNode(node);
+
+ if (newStateInstance.isValid() && node.metaInfo().isSubclassOf("QtQuick.State", 1, 0)) {
+ nodeInstanceView()->activateState(newStateInstance);
+ } else {
+ nodeInstanceView()->activateBaseState();
+ }
}
@@ -693,16 +713,11 @@ NodeInstance NodeInstanceView::loadNode(const ModelNode &node)
void NodeInstanceView::activateState(const NodeInstance &instance)
{
nodeInstanceServer()->changeState(ChangeStateCommand(instance.instanceId()));
-// activateBaseState();
-// NodeInstance stateInstance(instance);
-// stateInstance.activateState();
}
void NodeInstanceView::activateBaseState()
{
nodeInstanceServer()->changeState(ChangeStateCommand(-1));
-// if (activeStateInstance().isValid())
-// activeStateInstance().deactivateState();
}
void NodeInstanceView::removeRecursiveChildRelationship(const ModelNode &removedNode)
@@ -1103,8 +1118,10 @@ QImage NodeInstanceView::statePreviewImage(const ModelNode &stateNode) const
void NodeInstanceView::setPathToQt(const QString &pathToQt)
{
- m_pathToQt = pathToQt;
- restartProcess();
+ if (m_pathToQt != pathToQt) {
+ m_pathToQt = pathToQt;
+ restartProcess();
+ }
}
void NodeInstanceView::statePreviewImagesChanged(const StatePreviewImageChangedCommand &command)
diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
index b8f589b669..1c3cd7be18 100644
--- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
@@ -447,8 +447,9 @@ void AbstractView::emitRewriterEndTransaction()
model()->m_d->notifyRewriterEndTransaction();
}
-void AbstractView::emitActualStateChanged(const ModelNode &node)
+void AbstractView::setAcutalStateNode(const ModelNode &node)
{
+ Internal::WriteLocker locker(m_model.data());
if (model())
model()->m_d->notifyActualStateChanged(node);
}
@@ -460,4 +461,9 @@ void AbstractView::changeRootNodeType(const QString &type, int majorVersion, int
m_model.data()->m_d->changeRootNodeType(type, majorVersion, minorVersion);
}
+ModelNode AbstractView::actualStateNode() const
+{
+ return ModelNode(m_model.data()->m_d->actualStateNode(), m_model.data(), const_cast<AbstractView*>(this));
+}
+
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp
index 938026c3f9..72e8585f7d 100644
--- a/src/plugins/qmldesigner/designercore/model/model.cpp
+++ b/src/plugins/qmldesigner/designercore/model/model.cpp
@@ -605,6 +605,8 @@ void ModelPrivate::notifyActualStateChanged(const ModelNode &node)
bool resetModel = false;
QString description;
+ m_acutalStateNode = node.internalNode();
+
try {
if (rewriterView())
rewriterView()->actualStateChanged(ModelNode(node.internalNode(), model(), rewriterView()));
@@ -1638,6 +1640,11 @@ bool ModelPrivate::isWriteLocked() const
return m_writeLock;
}
+InternalNode::Pointer ModelPrivate::actualStateNode() const
+{
+ return m_acutalStateNode;
+}
+
WriteLocker::WriteLocker(ModelPrivate *model)
: m_model(model)
diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h
index bc6ff14564..c0f49cc427 100644
--- a/src/plugins/qmldesigner/designercore/model/model_p.h
+++ b/src/plugins/qmldesigner/designercore/model/model_p.h
@@ -218,6 +218,8 @@ public:
void setNodeInstanceView(NodeInstanceView *nodeInstanceView);
NodeInstanceView *nodeInstanceView() const;
+ InternalNodePointer actualStateNode() const;
+
private: //functions
void removePropertyWithoutNotification(const InternalPropertyPointer &property);
void removeAllSubNodes(const InternalNodePointer &node);
@@ -237,6 +239,8 @@ private:
QHash<QString,InternalNodePointer> m_idNodeHash;
QHash<qint32, InternalNodePointer> m_internalIdNodeHash;
QSet<InternalNodePointer> m_nodeSet;
+ InternalNodePointer m_acutalStateNode;
+
InternalNodePointer m_rootInternalNode;
diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
index a6d3a934d3..97f1047615 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
@@ -63,12 +63,12 @@ void QmlModelView::setCurrentState(const QmlModelState &state)
if (!state.isValid())
return;
- emitActualStateChanged(state.modelNode());
+ setAcutalStateNode(state.modelNode());
}
QmlModelState QmlModelView::currentState() const
{
- return m_state;
+ return QmlModelState(actualStateNode());
}
QmlModelState QmlModelView::baseState() const
@@ -334,14 +334,10 @@ bool QmlModelView::hasInstanceForModelNode(const ModelNode &modelNode)
void QmlModelView::modelAttached(Model *model)
{
AbstractView::modelAttached(model);
- m_state = QmlModelState();
- m_state = baseState();
- Q_ASSERT(m_state.isBaseState());
}
void QmlModelView::modelAboutToBeDetached(Model *model)
{
- m_state = QmlModelState();
AbstractView::modelAboutToBeDetached(model);
}
@@ -452,10 +448,6 @@ void QmlModelView::actualStateChanged(const ModelNode &node)
if (!newState.isValid())
newState = baseState();
- activateState(newState);
-
- m_state = newState;
-
if (newState != oldState)
stateChanged(newState, oldState);
@@ -476,28 +468,6 @@ void QmlModelView::nodeInstancePropertyChanged(const ModelNode &node, const QStr
otherPropertyChanged(qmlObjectNode, propertyName);
}
-void QmlModelView::activateState(const QmlModelState &state)
-{
- if (!state.isValid())
- return;
-
- if (m_state == state)
- return;
-
- m_state = state; //This is hacky. m_state should be controlled by the instances
- //### todo: If the state thumbnail code gets refactored.
- // this is not necessary anymore.
-
-
- NodeInstance newStateInstance = instanceForModelNode(state.modelNode());
-
- if (state.isBaseState()) {
- nodeInstanceView()->activateBaseState();
- } else {
- nodeInstanceView()->activateState(newStateInstance);
- }
-}
-
void QmlModelView::transformChanged(const QmlObjectNode &/*qmlObjectNode*/, const QString &/*propertyName*/)
{
}
diff --git a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp
index 51d79cdd02..94e0ca22e8 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp
@@ -42,14 +42,12 @@
namespace QmlDesigner {
QmlModelState::QmlModelState()
- : QmlModelNodeFacade(),
- m_isBaseState(false)
+ : QmlModelNodeFacade()
{
}
QmlModelState::QmlModelState(const ModelNode &modelNode)
- : QmlModelNodeFacade(modelNode),
- m_isBaseState(false)
+ : QmlModelNodeFacade(modelNode)
{
}
@@ -268,7 +266,7 @@ void QmlModelState::destroy()
bool QmlModelState::isBaseState() const
{
- return m_isBaseState && modelNode().isRootNode();
+ return !modelNode().isValid() || modelNode().isRootNode();
}
QmlModelState QmlModelState::duplicate(const QString &name) const
@@ -308,7 +306,7 @@ QmlModelStateGroup QmlModelState::stateGroup() const
QmlModelState QmlModelState::createBaseState(const QmlModelView *view)
{
QmlModelState fxState(view->rootModelNode());
- fxState.m_isBaseState = true;
+
return fxState;
}