diff --git a/share/qtcreator/qml/qmlpuppet/commands/commands.pri b/share/qtcreator/qml/qmlpuppet/commands/commands.pri index c6c9282d1b802dac811b649a1ed8922bfbb8860c..5ae623cf3f2781707c8216eb8384dcefc8c2477c 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/commands.pri +++ b/share/qtcreator/qml/qmlpuppet/commands/commands.pri @@ -1,6 +1,7 @@ INCLUDEPATH += $$PWD/ HEADERS += $$PWD/synchronizecommand.h +HEADERS += $$PWD/tokencommand.h HEADERS += $$PWD/componentcompletedcommand.h HEADERS += $$PWD/completecomponentcommand.h HEADERS += $$PWD/statepreviewimagechangedcommand.h @@ -24,6 +25,7 @@ HEADERS += $$PWD/changeauxiliarycommand.h SOURCES += $$PWD/synchronizecommand.cpp +SOURCES += $$PWD/tokencommand.cpp SOURCES += $$PWD/componentcompletedcommand.cpp SOURCES += $$PWD/completecomponentcommand.cpp SOURCES += $$PWD/statepreviewimagechangedcommand.cpp diff --git a/share/qtcreator/qml/qmlpuppet/commands/tokencommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/tokencommand.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bb8279a9711d3c9cf9f87d7b34173db69adf33ac --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/commands/tokencommand.cpp @@ -0,0 +1,114 @@ +/************************************************************************** + +** + +** This file is part of Qt Creator + +** + +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). + +** + +** Contact: Nokia Corporation (qt-info@nokia.com) + +** + +** No Commercial Usage + +** + +** This file contains pre-release code and may not be distributed. + +** You may use this file in accordance with the terms and conditions + +** contained in the Technology Preview License Agreement accompanying + +** this package. + +** + +** GNU Lesser General Public License Usage + +** + +** Alternatively, this file may be used under the terms of the GNU Lesser + +** General Public License version 2.1 as published by the Free Software + +** Foundation and appearing in the file LICENSE.LGPL included in the + +** packaging of this file. Please review the following information to + +** ensure the GNU Lesser General Public License version 2.1 requirements + +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + +** + +** In addition, as a special exception, Nokia gives you certain additional + +** rights. These rights are described in the Nokia Qt LGPL Exception + +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. + +** + +** If you have questions regarding the use of this file, please contact + +** Nokia at qt-info@nokia.com. + +** + +**************************************************************************/ + +#include "tokencommand.h" + +namespace QmlDesigner { + +TokenCommand::TokenCommand() + : m_tokenNumber(-1) +{ +} + +TokenCommand::TokenCommand(const QString &tokenName, qint32 tokenNumber, const QVector<qint32> &instanceIdVector) + : m_tokenName(tokenName), + m_tokenNumber(tokenNumber), + m_instanceIdVector(instanceIdVector) +{ +} + +QString TokenCommand::tokenName() const +{ + return m_tokenName; +} + +qint32 TokenCommand::tokenNumber() const +{ + return m_tokenNumber; +} + +QVector<qint32> TokenCommand::instances() const +{ + return m_instanceIdVector; +} + +QDataStream &operator<<(QDataStream &out, const TokenCommand &command) +{ + out << command.tokenName(); + out << command.tokenNumber(); + out << command.instances(); + return out; +} + +QDataStream &operator>>(QDataStream &in, TokenCommand &command) +{ + in >> command.m_tokenName; + in >> command.m_tokenNumber; + in >> command.m_instanceIdVector; + + return in; +} + + +} // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/commands/tokencommand.h b/share/qtcreator/qml/qmlpuppet/commands/tokencommand.h new file mode 100644 index 0000000000000000000000000000000000000000..ef4325a8d71b373660795ca46533917baaf26785 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/commands/tokencommand.h @@ -0,0 +1,100 @@ +/************************************************************************** + +** + +** This file is part of Qt Creator + +** + +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). + +** + +** Contact: Nokia Corporation (qt-info@nokia.com) + +** + +** No Commercial Usage + +** + +** This file contains pre-release code and may not be distributed. + +** You may use this file in accordance with the terms and conditions + +** contained in the Technology Preview License Agreement accompanying + +** this package. + +** + +** GNU Lesser General Public License Usage + +** + +** Alternatively, this file may be used under the terms of the GNU Lesser + +** General Public License version 2.1 as published by the Free Software + +** Foundation and appearing in the file LICENSE.LGPL included in the + +** packaging of this file. Please review the following information to + +** ensure the GNU Lesser General Public License version 2.1 requirements + +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + +** + +** In addition, as a special exception, Nokia gives you certain additional + +** rights. These rights are described in the Nokia Qt LGPL Exception + +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. + +** + +** If you have questions regarding the use of this file, please contact + +** Nokia at qt-info@nokia.com. + +** + +**************************************************************************/ + +#ifndef QMLDESIGNER_TOKENCOMMAND_H +#define QMLDESIGNER_TOKENCOMMAND_H + + +#include <QMetaType> +#include <QVector> + +namespace QmlDesigner { + +class TokenCommand +{ + friend QDataStream &operator>>(QDataStream &in, TokenCommand &command); + +public: + TokenCommand(); + TokenCommand(const QString &tokenName, qint32 tokenNumber, const QVector<qint32> &instances); + + QString tokenName() const; + qint32 tokenNumber() const; + QVector<qint32> instances() const; + +private: + QString m_tokenName; + qint32 m_tokenNumber; + QVector<qint32> m_instanceIdVector; +}; + +QDataStream &operator<<(QDataStream &out, const TokenCommand &command); +QDataStream &operator>>(QDataStream &in, TokenCommand &command); + +} // namespace QmlDesigner + +Q_DECLARE_METATYPE(QmlDesigner::TokenCommand) + + +#endif // QMLDESIGNER_TOKENCOMMAND_H diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp index ad10cdc57ca0a4b449c5f386115a6d260d760e4e..bdefc54d91c34ab75b5c935850d61619c54faf29 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp @@ -57,6 +57,7 @@ #include "changestatecommand.h" #include "completecomponentcommand.h" #include "synchronizecommand.h" +#include "tokencommand.h" #include "informationchangedcommand.h" #include "pixmapchangedcommand.h" @@ -133,6 +134,11 @@ void NodeInstanceClientProxy::componentCompleted(const ComponentCompletedCommand writeCommand(QVariant::fromValue(command)); } +void NodeInstanceClientProxy::token(const TokenCommand &command) +{ + writeCommand(QVariant::fromValue(command)); +} + void NodeInstanceClientProxy::flush() { } @@ -267,6 +273,10 @@ void NodeInstanceClientProxy::changeNodeSource(const ChangeNodeSourceCommand &co { nodeInstanceServer()->changeNodeSource(command); } +void NodeInstanceClientProxy::redirectToken(const TokenCommand &command) +{ + nodeInstanceServer()->token(command); +} void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) { @@ -285,6 +295,7 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) static const int completeComponentCommandType = QMetaType::type("CompleteComponentCommand"); static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand"); static const int changeNodeSourceCommandType = QMetaType::type("ChangeNodeSourceCommand"); + static const int tokenCommandType = QMetaType::type("TokenCommand"); if (command.userType() == createInstancesCommandType) { createInstances(command.value<CreateInstancesCommand>()); @@ -314,6 +325,8 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) completeComponent(command.value<CompleteComponentCommand>()); else if (command.userType() == changeNodeSourceCommandType) changeNodeSource(command.value<ChangeNodeSourceCommand>()); + else if (command.userType() == tokenCommandType) + redirectToken(command.value<TokenCommand>()); else if (command.userType() == synchronizeCommandType) { SynchronizeCommand synchronizeCommand = command.value<SynchronizeCommand>(); m_synchronizeId = synchronizeCommand.synchronizeId(); diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h index 0ee07bf354a113fd12385466a61999cd8dd400d8..ba429123f0a9f6a7f0484413e0af08ef878b6790 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h @@ -75,6 +75,7 @@ public: void childrenChanged(const ChildrenChangedCommand &command); void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command); void componentCompleted(const ComponentCompletedCommand &command); + void token(const TokenCommand &command); void flush(); void synchronizeWithClientProcess(); @@ -101,6 +102,7 @@ protected: void changeState(const ChangeStateCommand &command); void completeComponent(const CompleteComponentCommand &command); void changeNodeSource(const ChangeNodeSourceCommand &command); + void redirectToken(const TokenCommand &command); private slots: void readDataStream(); diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp index 84f7d8fcd2836117e88876c7378f8fdbbba7edba..5acbc7fcf8e32c356b0b03a86ac7ba840bb1e088 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp @@ -74,6 +74,7 @@ #include "componentcompletedcommand.h" #include "createscenecommand.h" #include "changenodesourcecommand.h" +#include "tokencommand.h" #include "dummycontextobject.h" @@ -338,6 +339,11 @@ void NodeInstanceServer::changeNodeSource(const ChangeNodeSourceCommand &command startRenderTimer(); } +void NodeInstanceServer::token(const TokenCommand &/*command*/) +{ + +} + void NodeInstanceServer::setupImports(const QVector<AddImportContainer> &containerVector) { foreach (const AddImportContainer &container, containerVector) { diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.h index bd45ec484923e24db2363f62db329397ac231fb3..ea24316fda11338d0362463485cfb3bfdaa23bdd 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.h @@ -92,6 +92,7 @@ public: void changeState(const ChangeStateCommand &command); void completeComponent(const CompleteComponentCommand &command); void changeNodeSource(const ChangeNodeSourceCommand &command); + void token(const TokenCommand &command); ServerNodeInstance instanceForId(qint32 id) const; bool hasInstanceForId(qint32 id) const; @@ -152,7 +153,6 @@ protected: virtual void collectItemChangesAndSendChangeCommands() = 0; - ValuesChangedCommand createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const; ValuesChangedCommand createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const; PixmapChangedCommand createPixmapChangedCommand(const QList<ServerNodeInstance> &instanceList) const; diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h index 77bf3355efcaf8a4d2143034f13e5cf2ae568e09..46f45e794e69b9d00aeae9c98220cce65a30a9d9 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h @@ -43,6 +43,7 @@ class InformationChangedCommand; class ChildrenChangedCommand; class StatePreviewImageChangedCommand; class ComponentCompletedCommand; +class TokenCommand; class NodeInstanceClientInterface { @@ -53,6 +54,7 @@ public: virtual void childrenChanged(const ChildrenChangedCommand &command) = 0; virtual void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command) = 0; virtual void componentCompleted(const ComponentCompletedCommand &command) = 0; + virtual void token(const TokenCommand &command) = 0; virtual void flush() {}; virtual void synchronizeWithClientProcess() {} diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp index ce2bb0104275f4cb5b7af01b443cd4ae7bb472df..c047308ab5684bb96cded25c8585b94a7001cd19 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp @@ -61,6 +61,7 @@ #include "statepreviewimagechangedcommand.h" #include "componentcompletedcommand.h" #include "synchronizecommand.h" +#include "tokencommand.h" namespace QmlDesigner { @@ -169,6 +170,9 @@ void NodeInstanceServerInterface::registerCommands() qRegisterMetaType<ChangeAuxiliaryCommand>("ChangeAuxiliaryCommand"); qRegisterMetaTypeStreamOperators<ChangeAuxiliaryCommand>("ChangeAuxiliaryCommand"); + + qRegisterMetaType<TokenCommand>("TokenCommand"); + qRegisterMetaTypeStreamOperators<TokenCommand>("TokenCommand"); } } diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h index 98d1fe38656fd50e98511e9aee53603a0922495c..3ba659746008ad5103a7028168cfe91430504267 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h @@ -55,6 +55,7 @@ class RemovePropertiesCommand; class ChangeStateCommand; class CompleteComponentCommand; class ChangeNodeSourceCommand; +class TokenCommand; class NodeInstanceServerInterface : public QObject { @@ -81,6 +82,7 @@ public: virtual void changeState(const ChangeStateCommand &command) = 0; virtual void completeComponent(const CompleteComponentCommand &command) = 0; virtual void changeNodeSource(const ChangeNodeSourceCommand &command) = 0; + virtual void token(const TokenCommand &command) = 0; static void registerCommands(); }; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 0997e125d01cefb17def415159176186f7257bc7..c0dd079a9fc1f913bddf0517fab7e4137849f211 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -60,6 +60,7 @@ #include "completecomponentcommand.h" #include "componentcompletedcommand.h" #include "createscenecommand.h" +#include "tokencommand.h" #include "dummycontextobject.h" @@ -72,6 +73,20 @@ Qt5InformationNodeInstanceServer::Qt5InformationNodeInstanceServer(NodeInstanceC { } +void Qt5InformationNodeInstanceServer::sendTokenBack() +{ + foreach (const TokenCommand &command, m_tokenList) + nodeInstanceClient()->token(command); + + m_tokenList.clear(); +} + +void Qt5InformationNodeInstanceServer::token(const TokenCommand &command) +{ + m_tokenList.append(command); + startRenderTimer(); +} + void Qt5InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands() { static bool inFunction = false; @@ -125,6 +140,8 @@ void Qt5InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands() resetAllItems(); clearChangedPropertyList(); + sendTokenBack(); + if (!informationChangedInstanceSet.isEmpty()) nodeInstanceClient()->informationChanged(createAllInformationChangedCommand(informationChangedInstanceSet.toList())); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index e97e2c25d5d38d49b0b208750d25238eedba02de..7e969428d6a0204f32af7edc0d0b8fafd5b29673 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -34,6 +34,7 @@ #define QMLDESIGNER_QT5INFORMATIONNODEINSTANCESERVER_H #include "qt5nodeinstanceserver.h" +#include "tokencommand.h" namespace QmlDesigner { @@ -47,14 +48,18 @@ public: void clearScene(const ClearSceneCommand &command); void createScene(const CreateSceneCommand &command); void completeComponent(const CompleteComponentCommand &command); + void token(const TokenCommand &command); protected: void collectItemChangesAndSendChangeCommands(); void sendChildrenChangedCommand(const QList<ServerNodeInstance> childList); + void sendTokenBack(); + private: QSet<ServerNodeInstance> m_parentChangedSet; QList<ServerNodeInstance> m_completedComponentList; + QList<TokenCommand> m_tokenList; }; } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp index 9c23b88fbb8f8b47372f417259dccde4754f4861..48ab73adf9bd9fe2c650e40d60ddf0597aa5abf5 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp @@ -75,6 +75,8 @@ #include "completecomponentcommand.h" #include "componentcompletedcommand.h" #include "createscenecommand.h" +#include "tokencommand.h" + #include "dummycontextobject.h" @@ -85,6 +87,20 @@ Qt4InformationNodeInstanceServer::Qt4InformationNodeInstanceServer(NodeInstanceC { } +void Qt4InformationNodeInstanceServer::sendTokenBack() +{ + foreach (const TokenCommand &command, m_tokenList) + nodeInstanceClient()->token(command); + + m_tokenList.clear(); +} + +void Qt4InformationNodeInstanceServer::token(const TokenCommand &command) +{ + m_tokenList.append(command); + startRenderTimer(); +} + void Qt4InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands() { static bool inFunction = false; @@ -143,10 +159,7 @@ void Qt4InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands() clearChangedPropertyList(); resetAllItems(); - if (!m_parentChangedSet.isEmpty()) { - sendChildrenChangedCommand(m_parentChangedSet.toList()); - m_parentChangedSet.clear(); - } + sendTokenBack(); if (!informationChangedInstanceSet.isEmpty()) nodeInstanceClient()->informationChanged(createAllInformationChangedCommand(informationChangedInstanceSet.toList())); @@ -154,6 +167,11 @@ void Qt4InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands() if (!propertyChangedList.isEmpty()) nodeInstanceClient()->valuesChanged(createValuesChangedCommand(propertyChangedList)); + if (!m_parentChangedSet.isEmpty()) { + sendChildrenChangedCommand(m_parentChangedSet.toList()); + m_parentChangedSet.clear(); + } + if (adjustSceneRect) { QRectF boundingRect = rootNodeInstance().boundingRect(); if (boundingRect.isValid()) { diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.h index 1390827ff56a5229eb77962d1f9c048cf5ab39ab..04f3064b6d399ad0e5fb213d476f6eab2926f873 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.h @@ -34,6 +34,7 @@ #define INFORMATIONNODEINSTANCESERVER_H #include "qt4nodeinstanceserver.h" +#include "tokencommand.h" namespace QmlDesigner { @@ -47,14 +48,17 @@ public: void clearScene(const ClearSceneCommand &command); void createScene(const CreateSceneCommand &command); void completeComponent(const CompleteComponentCommand &command); + void token(const TokenCommand &command); protected: void collectItemChangesAndSendChangeCommands(); void sendChildrenChangedCommand(const QList<ServerNodeInstance> childList); + void sendTokenBack(); private: QSet<ServerNodeInstance> m_parentChangedSet; QList<ServerNodeInstance> m_completedComponentList; + QList<TokenCommand> m_tokenList; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 3cc5865564165c1072daae881ac505e6181bb711..473f6b2ebf1853e35fb1a64fb1977f3765e0f827 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -490,6 +490,10 @@ void FormEditorView::instancesPreviewImageChanged(const QVector<ModelNode> &/*no } +void FormEditorView::instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector) +{ +} + void FormEditorView::instancesChildrenChanged(const QVector<ModelNode> &nodeList) { QList<FormEditorItem*> itemNodeList; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index 44ff565aedc639259207737c9e842c1345d2be01..b723c4bcef324fd76ff13e8572a490306bde37d2 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -109,6 +109,7 @@ public: void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList); void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); + void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector); void rewriterBeginTransaction(); void rewriterEndTransaction(); diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp index c673e74130899618f90cf2e758cd3bdccca0f47f..91926dc5dfda62d5f697aae23a2cc791f4715097 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp @@ -88,22 +88,33 @@ void MoveManipulator::setItems(const QList<FormEditorItem*> &itemList) } } -void MoveManipulator::synchronizeInstanceParent(const QList<FormEditorItem*> &itemList) +void MoveManipulator::synchronizeParent(const QList<FormEditorItem*> &itemList, const ModelNode &parentNode) { - if (m_view->model()) { - foreach (FormEditorItem *item, itemList) { - if (m_itemList.contains(item)) { - QmlItemNode parentItemNode = QmlItemNode(item->qmlItemNode().instanceParent()); - if (parentItemNode.isValid()) { + bool snapperUpdated = false; + + foreach (FormEditorItem *item, itemList) { + if (m_itemList.contains(item)) { + QmlItemNode parentItemNode = QmlItemNode(parentNode); + if (parentItemNode.isValid()) { + if (snapperUpdated == false && m_snapper.containerFormEditorItem() != m_view->scene()->itemForQmlItemNode(parentItemNode)) { m_snapper.setContainerFormEditorItem(m_view->scene()->itemForQmlItemNode(parentItemNode)); m_snapper.setTransformtionSpaceFormEditorItem(m_snapper.containerFormEditorItem()); m_snapper.updateSnappingLines(m_itemList); updateHashes(); - break; + snapperUpdated = true; } } } } + + update(m_lastPosition, NoSnapping, UseBaseState); +} + +void MoveManipulator::synchronizeInstanceParent(const QList<FormEditorItem*> &itemList) +{ + if (m_view->model() && !m_itemList.isEmpty()) + synchronizeParent(itemList, m_itemList.first()->qmlItemNode().instanceParent()); + } void MoveManipulator::updateHashes() @@ -257,6 +268,7 @@ QHash<FormEditorItem*, QRectF> MoveManipulator::tanslatedBoundingRects(const QHa */ void MoveManipulator::update(const QPointF& updatePoint, Snapping useSnapping, State stateToBeManipulated) { + m_lastPosition = updatePoint; deleteSnapLines(); //Since they position is changed and the item is moved the snapping lines are //are obsolete. The new updated snapping lines (color and visibility) will be //calculated in snapPoint() called in moveNode() later @@ -329,6 +341,7 @@ void MoveManipulator::clear() m_beginPositionHash.clear(); m_beginPositionInSceneSpaceHash.clear(); m_itemList.clear(); + m_lastPosition = QPointF(); m_rewriterTransaction.commit(); @@ -350,17 +363,30 @@ void MoveManipulator::reparentTo(FormEditorItem *newParent) if (!itemsCanReparented()) return; - foreach (FormEditorItem* item, m_itemList) { - if (!item || !item->qmlItemNode().isValid()) - continue; + QVector<ModelNode> nodeReparentVector; + NodeAbstractProperty parentProperty; + + QmlItemNode parent(newParent->qmlItemNode()); + if (parent.isValid()) { + if (parent.hasDefaultProperty()) { + parentProperty = parent.nodeAbstractProperty(parent.defaultProperty()); + } else { + parentProperty = parent.nodeAbstractProperty("data"); + } + + foreach (FormEditorItem* item, m_itemList) { + if (!item || !item->qmlItemNode().isValid()) + continue; + + if (parentProperty != item->qmlItemNode().modelNode().parentProperty()) + nodeReparentVector.append(item->qmlItemNode().modelNode()); - QmlItemNode parent(newParent->qmlItemNode()); - if (parent.isValid()) { - if (parent.hasDefaultProperty()) - item->qmlItemNode().setParentProperty(parent.nodeAbstractProperty(parent.defaultProperty())); - else - item->qmlItemNode().setParentProperty(parent.nodeAbstractProperty("data")); } + + foreach (const ModelNode &nodeToReparented, nodeReparentVector) + parentProperty.reparentHere(nodeToReparented); + + synchronizeParent(m_itemList, parentProperty.parentModelNode()); } } diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.h b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h index a755e62613c840bbeee11767d18229693ac6d719..671feef0388f72034760914fc5836b243c0345ba 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.h +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h @@ -70,7 +70,7 @@ public: void setItems(const QList<FormEditorItem*> &itemList); void setItem(FormEditorItem* item); void synchronizeInstanceParent(const QList<FormEditorItem*> &itemList); - + void synchronizeParent(const QList<FormEditorItem*> &itemList, const ModelNode &parentNode); void begin(const QPointF& beginPoint); void update(const QPointF& updatePoint, Snapping useSnapping, State stateToBeManipulated = UseActualState); void reparentTo(FormEditorItem *newParent); @@ -123,6 +123,7 @@ private: QList<QGraphicsItem*> m_graphicsLineList; bool m_isActive; RewriterTransaction m_rewriterTransaction; + QPointF m_lastPosition; }; } diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp index a2d818d4dd260ecc2021290bfce2634518bb2fb0..539c57578d4d5b7d04f6b2392be7fc205b6acb71 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.cpp +++ b/src/plugins/qmldesigner/components/integration/componentview.cpp @@ -212,6 +212,8 @@ void ComponentView::instanceInformationsChange(const QMultiHash<ModelNode, Infor void ComponentView::instancesRenderImageChanged(const QVector<ModelNode> &/*nodeList*/) {} void ComponentView::instancesPreviewImageChanged(const QVector<ModelNode> &/*nodeList*/) {} void ComponentView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeList*/) {} +void ComponentView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/) {} + void ComponentView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) {} void ComponentView::rewriterBeginTransaction() {} diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h index fef34556b511b714afe8dcfe7d22170ac53d288b..3541fbc7602748f141d98a1a6ae94d3c132404f4 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.h +++ b/src/plugins/qmldesigner/components/integration/componentview.h @@ -81,6 +81,8 @@ public: void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList); + void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp index ead2ab44a1df169ac3a66833ed18a5c6ebfbfe58..41c0e819cca54e73f00e398185d2fbf07da4917a 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp @@ -92,6 +92,11 @@ void DesignDocumentControllerView::instancesChildrenChanged(const QVector<ModelN } +void DesignDocumentControllerView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/) +{ + +} + void DesignDocumentControllerView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) { diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h index a915eeb4cd97a82da356aed627ffb74464dc72b5..6725ab4ea44c793434d451e61f3877e113c82aaa 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h @@ -68,6 +68,8 @@ public: void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList); + void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 611257b27f0fabb7daf9e1fa93fd34b6e9d8d3c8..27133cffde8d684df072bbfc7c1519c147b8a2bf 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -172,6 +172,11 @@ void ItemLibraryView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeL } +void ItemLibraryView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/) +{ + +} + void ItemLibraryView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) { diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h index 3c61139efe3b5ae498a5be5dc3297d8c3c8863eb..576de2254629273f0b519908b33e6ed738e75111 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h @@ -84,6 +84,8 @@ public: void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList); + void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 88fc9204c9cd165066068cb1f4a563272f2a80a6..45b2a064d67f492fb2d2d64e3674c7904b63cd7b 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -121,8 +121,11 @@ public: void emitInstancesChildrenChanged(const QVector<ModelNode> &nodeList); 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); + virtual void modelAttached(Model *model); virtual void modelAboutToBeDetached(Model *model); @@ -144,6 +147,8 @@ public: virtual void instancesRenderImageChanged(const QVector<ModelNode> &nodeList) = 0; virtual void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList) = 0; virtual void instancesChildrenChanged(const QVector<ModelNode> &nodeList) = 0; + virtual void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector) = 0; + virtual void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource) = 0; virtual void rewriterBeginTransaction() = 0; diff --git a/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h b/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h index 6260a3461c38555455c8ec4a812ed9907507992a..9e69201688d8101110fd9fb25b96d7ec64007de2 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h @@ -47,6 +47,11 @@ class NodeAbstractProperty : public AbstractProperty friend class QmlDesigner::ModelNode; friend class QmlDesigner::Internal::ModelPrivate; friend class QmlDesigner::AbstractProperty; + + friend CORESHARED_EXPORT bool operator ==(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2); + friend CORESHARED_EXPORT bool operator !=(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2); + friend CORESHARED_EXPORT uint qHash(const NodeAbstractProperty& property); + public: NodeAbstractProperty(); NodeAbstractProperty(const NodeAbstractProperty &property, AbstractView *view); @@ -63,6 +68,13 @@ protected: void reparentHere(const ModelNode &modelNode, bool isNodeList); }; + +CORESHARED_EXPORT bool operator ==(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2); +CORESHARED_EXPORT bool operator !=(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2); +CORESHARED_EXPORT uint qHash(const NodeAbstractProperty& property); +CORESHARED_EXPORT QTextStream& operator<<(QTextStream &stream, const NodeAbstractProperty &property); +CORESHARED_EXPORT QDebug operator<<(QDebug debug, const NodeAbstractProperty &property); + } // namespace QmlDesigner #endif // NODEABSTRACTPROPERTY_H diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 5d3ef307d42942ebc80813df3e536d9e757c4a72..053da698e22307923cb5b1b20086e9b1c266a468 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -70,6 +70,7 @@ class RemoveInstancesCommand; class RemovePropertiesCommand; class CompleteComponentCommand; class InformationContainer; +class TokenCommand; class CORESHARED_EXPORT NodeInstanceView : public AbstractView, public NodeInstanceClientInterface { @@ -107,10 +108,12 @@ public: void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList); + void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector); void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data); void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); + void rewriterBeginTransaction(); void rewriterEndTransaction(); @@ -136,11 +139,14 @@ public: void childrenChanged(const ChildrenChangedCommand &command); void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command); void componentCompleted(const ComponentCompletedCommand &command); + void token(const TokenCommand &command); QImage statePreviewImage(const ModelNode &stateNode) const; void setPathToQt(const QString &pathToQt); + void sendToken(const QString &token, int number, const QVector<ModelNode> &nodeVector); + signals: void qmlPuppetCrashed(); diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h index 4b72f12481b9438f3780fa28e6b2ac12e21e56c0..d77bfbb6cb3e8396eda8771af54519d5e1ba17a6 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h +++ b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h @@ -98,6 +98,7 @@ public: void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList); + void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector); void rewriterBeginTransaction(); void rewriterEndTransaction(); diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 2f3bf35e5c7d50b509422988e7621006c2015a0f..e78b6e733a9873a32bf97352487de8686a775ee7 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -143,6 +143,8 @@ public: void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList); + void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 3af5c4f0ba1ef1d758eb634c3c40270ae7cd9c41..8c8f1bef42a360bab8c6b37787f0fbc34f92c8fd 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -65,6 +65,7 @@ #include "imagecontainer.h" #include "statepreviewimagechangedcommand.h" #include "componentcompletedcommand.h" +#include "tokencommand.h" #include "synchronizecommand.h" @@ -241,6 +242,7 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command) static const int statePreviewImageChangedCommandType = QMetaType::type("StatePreviewImageChangedCommand"); static const int componentCompletedCommandType = QMetaType::type("ComponentCompletedCommand"); static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand"); + static const int tokenCommandType = QMetaType::type("TokenCommand"); if (command.userType() == informationChangedCommandType) nodeInstanceClient()->informationChanged(command.value<InformationChangedCommand>()); @@ -254,6 +256,8 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command) nodeInstanceClient()->statePreviewImagesChanged(command.value<StatePreviewImageChangedCommand>()); else if (command.userType() == componentCompletedCommandType) nodeInstanceClient()->componentCompleted(command.value<ComponentCompletedCommand>()); + else if (command.userType() == tokenCommandType) + nodeInstanceClient()->token(command.value<TokenCommand>()); else if (command.userType() == synchronizeCommandType) { SynchronizeCommand synchronizeCommand = command.value<SynchronizeCommand>(); m_synchronizeId = synchronizeCommand.synchronizeId(); @@ -523,4 +527,9 @@ void NodeInstanceServerProxy::changeNodeSource(const ChangeNodeSourceCommand &co writeCommand(QVariant::fromValue(command)); } +void NodeInstanceServerProxy::token(const TokenCommand &command) +{ + writeCommand(QVariant::fromValue(command)); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h index 6197694df0e588f567ec1a4871f9116c4c733191..42bf3e95ce680581bd818905ffdd2bca41caf9e8 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h @@ -71,6 +71,7 @@ public: void changeState(const ChangeStateCommand &command); void completeComponent(const CompleteComponentCommand &command); void changeNodeSource(const ChangeNodeSourceCommand &command); + void token(const TokenCommand &command); protected: void writeCommand(const QVariant &command); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index eca58fa321bf615f43627879f4dfbf169003fb03..b21add18e2bb9c9c763b535e4355f07ecd9a54d2 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -80,6 +80,7 @@ #include "statepreviewimagechangedcommand.h" #include "completecomponentcommand.h" #include "componentcompletedcommand.h" +#include "tokencommand.h" #include "nodeinstanceserverproxy.h" @@ -483,6 +484,11 @@ void NodeInstanceView::instancesChildrenChanged(const QVector<ModelNode> &/*node } +void NodeInstanceView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/) +{ + +} + void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data) { if (node.isRootNode() && (name == "width" || name == "height")) { @@ -1165,4 +1171,30 @@ void NodeInstanceView::childrenChanged(const ChildrenChangedCommand &command) emitInstancesChildrenChanged(childNodeVector); } +void NodeInstanceView::token(const TokenCommand &command) +{ + if (!model()) + return; + + QVector<ModelNode> nodeVector; + + foreach (const qint32 &instanceId, command.instances()) { + if (hasModelNodeForInternalId(instanceId)) { + nodeVector.append(modelNodeForInternalId(instanceId)); + } + } + + + emitInstanceToken(command.tokenName(), command.tokenNumber(), nodeVector); +} + +void NodeInstanceView::sendToken(const QString &token, int number, const QVector<ModelNode> &nodeVector) +{ + QVector<qint32> instanceIdVector; + foreach (const ModelNode &node, nodeVector) + instanceIdVector.append(node.internalId()); + + nodeInstanceServer()->token(TokenCommand(token, number, instanceIdVector)); +} + } diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 4117986b1ea65eaf366d54b9a6ee4e7c68c2be31..b8f589b6694e064a8543de97b73f9c5c588274a1 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -429,6 +429,18 @@ void AbstractView::emitRewriterBeginTransaction() model()->m_d->notifyRewriterBeginTransaction(); } +void AbstractView::sendTokenToInstances(const QString &token, int number, const QVector<ModelNode> &nodeVector) +{ + if (nodeInstanceView()) + nodeInstanceView()->sendToken(token, number, nodeVector); +} + +void AbstractView::emitInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector) +{ + if (nodeInstanceView()) + model()->m_d->notifyInstanceToken(token, number, nodeVector); +} + void AbstractView::emitRewriterEndTransaction() { if (model()) diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 0e01f9c550f9c48ece78a1cf9aee6490cae54bd5..938026c3f9f42093dd4627910bc62c119f01b15e 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -681,6 +681,36 @@ void ModelPrivate::notifyRewriterEndTransaction() } } +void ModelPrivate::notifyInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector) +{ + bool resetModel = false; + QString description; + + QVector<Internal::InternalNode::Pointer> internalVector(toInternalNodeVector(nodeVector)); + + + try { + if (rewriterView()) + rewriterView()->instancesToken(token, number, toModelNodeVector(internalVector, rewriterView())); + } catch (RewritingException &e) { + description = e.description(); + resetModel = true; + } + + foreach (const QWeakPointer<AbstractView> &view, m_viewList) { + Q_ASSERT(view != 0); + view->instancesToken(token, number, toModelNodeVector(internalVector, view.data())); + } + + if (nodeInstanceView()) { + nodeInstanceView()->instancesToken(token, number, toModelNodeVector(internalVector, nodeInstanceView())); + } + + if (resetModel) { + resetModelByRewriter(description); + } +} + void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data) { bool resetModel = false; diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index c806b1b82ae7e27f7117c1488bbce33333ae1fa2..bc6ff14564e2def5c7505810903501cd5781043c 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -156,12 +156,13 @@ public: void notifyInstancesRenderImageChanged(const QVector<ModelNode> &nodeList); void notifyInstancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void notifyInstancesChildrenChanged(const QVector<ModelNode> &nodeList); + void notifyInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector); + void notifyActualStateChanged(const ModelNode &node); void notifyRewriterBeginTransaction(); void notifyRewriterEndTransaction(); - void setSelectedNodes(const QList<InternalNodePointer> &selectedNodeList); void clearSelectedNodes(); QList<InternalNodePointer> selectedNodes() const; diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp index 530269f22a36ad69eb5fb0e47d633c9587abc2d6..8ebd1d4a7e06eeb83884df02d8f025ea60744fd0 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp @@ -141,4 +141,36 @@ QList<ModelNode> NodeAbstractProperty::allSubNodes() return toModelNodeList(property->allSubNodes(), view()); } +/*! + \brief Returns if the the two property handles reference the same property in the same node +*/ +bool operator ==(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2) +{ + return AbstractProperty(property1) == AbstractProperty(property2); +} + +/*! + \brief Returns if the the two property handles do not reference the same property in the same node + */ +bool operator !=(const NodeAbstractProperty &property1, const NodeAbstractProperty &property2) +{ + return !(property1 == property2); +} + +uint qHash(const NodeAbstractProperty &property) +{ + return qHash(AbstractProperty(property)); +} + +QDebug operator<<(QDebug debug, const NodeAbstractProperty &property) +{ + return debug.nospace() << "NodeAbstractProperty(" << (property.isValid() ? property.name() : QLatin1String("invalid")) << ')'; +} + +QTextStream& operator<<(QTextStream &stream, const NodeAbstractProperty &property) +{ + stream << "NodeAbstractProperty(" << property.name() << ')'; + + return stream; +} } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index 028f028677e4873b8c3ba3dd84eac7460cd53a33..ceec3fbd2125f7cf68809eb4ad0aa30550224fdf 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -414,6 +414,11 @@ void QmlModelView::importsChanged(const QList<Import> &/*addedImports*/, const Q } +void QmlModelView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/) +{ + +} + void QmlModelView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) { diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 6b1d820012c6e691b7e3152ba021b9b995501426..a2ce780006bc346ba10b19db670ac161b70d3df2 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -407,6 +407,11 @@ void RewriterView::instancesChildrenChanged(const QVector<ModelNode> & /*nodeLis } +void RewriterView::instancesToken(const QString &/*tokenName*/, int /*tokenNumber*/, const QVector<ModelNode> &/*nodeVector*/) +{ + +} + void RewriterView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) { diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp index b49a2358a9520f9f495224534e8ed3696815b146..2bb3e4eadc882a900ad893a97fa0b96a486f5757 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp @@ -260,6 +260,13 @@ void ViewLogger::instancesChildrenChanged(const QVector<ModelNode> &nodeList) m_output << time() << indent("node: ") << node << endl; } +void ViewLogger::instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector) +{ + m_output << time() << indent("instancesToken:") << tokenName << tokenNumber << endl; + foreach (const ModelNode &node, nodeVector) + m_output << time() << indent("node: ") << node << endl; +} + void ViewLogger::nodeSourceChanged(const ModelNode &node, const QString & /*newNodeSource*/) { m_output << time() << indent("nodeSourceChanged:") << endl; diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.h b/src/plugins/qmldesigner/designercore/model/viewlogger.h index 01fc89ca25e80614e95c0c04ffd9a756897eac4a..2ca8ffa5e7eb7f5c40bb4162cfb8770d4100c7fc 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.h +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.h @@ -81,6 +81,8 @@ public: void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList); + void instancesToken(const QString &tokenName, int tokenNumber, const QVector<ModelNode> &nodeVector); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction();