diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp index a2ac1cd62b4fca129fdf4142f5544f867744591e..8c27ebaf63c14323feba1f3fd7e25648ea08da41 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.cpp +++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include @@ -185,6 +186,19 @@ void DebugView::bindingPropertiesChanged(const QList &propertyL } } +void DebugView::signalHandlerPropertiesChanged(const QVector &propertyList, AbstractView::PropertyChangeFlags propertyChange) +{ + if (isDebugViewEnabled()) { + QTextStream message; + QString string; + message.setString(&string); + foreach (const SignalHandlerProperty &property, propertyList) { + message << property; + } + log(tr("SignalHandlerProperties changed:"), string); + } +} + void DebugView::rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) { if (isDebugViewEnabled()) { diff --git a/src/plugins/qmldesigner/components/debugview/debugview.h b/src/plugins/qmldesigner/components/debugview/debugview.h index 92088f1a496d48be45f2b12a3acc5f7ed7572f9b..d0ca29c2d834b545781b928c8f8f46e156ddc869 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.h +++ b/src/plugins/qmldesigner/components/debugview/debugview.h @@ -60,6 +60,7 @@ public: void propertiesAboutToBeRemoved(const QList& propertyList) QTC_OVERRIDE; void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) QTC_OVERRIDE; void selectedNodesChanged(const QList &selectedNodeList, diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index dfc6de76224e17787e39608d03cf74428db49f40..a3e3f2ba64826755047804756962b4820f0d418b 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -279,6 +279,10 @@ void FormEditorView::bindingPropertiesChanged(const QList& prop QmlModelView::bindingPropertiesChanged(propertyList, propertyChange); } +void FormEditorView::signalHandlerPropertiesChanged(const QVector & /*propertyList*/, AbstractView::PropertyChangeFlags /*propertyChange*/) +{ +} + WidgetInfo FormEditorView::widgetInfo() { return createWidgetInfo(m_formEditorWidget.data(), 0, "FormEditor", WidgetInfo::CentralPane, 0, tr("Form Editor")); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index deabbee8a4b022a1c3e5b78f903d1f918c445962..e89b6b7e4e87656216ec9643a4e1698705f68243 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -78,6 +78,7 @@ public: void propertiesAboutToBeRemoved(const QList& propertyList) QTC_OVERRIDE; void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) QTC_OVERRIDE; void selectedNodesChanged(const QList &selectedNodeList, diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp index 465a10325bdad41574c44b612eb12173989f033b..49fb7df80bbdee98e827835e58c6f647ac181550 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.cpp +++ b/src/plugins/qmldesigner/components/integration/componentview.cpp @@ -188,6 +188,7 @@ void ComponentView::propertiesAboutToBeRemoved(const QList& /* void ComponentView::propertiesRemoved(const QList& /*propertyList*/) {} void ComponentView::variantPropertiesChanged(const QList& /*propertyList*/, PropertyChangeFlags /*propertyChange*/) {} void ComponentView::bindingPropertiesChanged(const QList& /*propertyList*/, PropertyChangeFlags /*propertyChange*/) {} +void ComponentView::signalHandlerPropertiesChanged(const QVector & /*propertyList*/, AbstractView::PropertyChangeFlags /*propertyChange*/) {} void ComponentView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) {} void ComponentView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) {} void ComponentView::instancePropertyChange(const QList > &/*propertyList*/) {} diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h index 43d7e9b1bd57cbf78e2c5d37493c041b2f37c394..f3287940aab7b038e102bacba41b61d1279b21aa 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.h +++ b/src/plugins/qmldesigner/components/integration/componentview.h @@ -78,6 +78,8 @@ public: PropertyChangeFlags propertyChange) QTC_OVERRIDE; void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector& propertyList, + PropertyChangeFlags propertyChange) QTC_OVERRIDE; void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) QTC_OVERRIDE; void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) QTC_OVERRIDE; void instancePropertyChange(const QList > &propertyList) QTC_OVERRIDE; diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp index 7e152dd524bd3780b8daa62582857b73705874e6..4a34d31c1ef25733590139547862690063d7d860 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp @@ -59,6 +59,9 @@ void DesignDocumentView::propertiesAboutToBeRemoved(const QList& /*propertyList*/) {} void DesignDocumentView::variantPropertiesChanged(const QList& /*propertyList*/, AbstractView::PropertyChangeFlags /*propertyChange*/) {} void DesignDocumentView::bindingPropertiesChanged(const QList& /*propertyList*/, AbstractView::PropertyChangeFlags /*propertyChange*/) {} +void DesignDocumentView::signalHandlerPropertiesChanged(const QVector & /*propertyList*/, + AbstractView::PropertyChangeFlags /*propertyChange*/) +{} void DesignDocumentView::rootNodeTypeChanged(const QString & /*type*/, int /*majorVersion*/, int /*minorVersion*/) {} void DesignDocumentView::selectedNodesChanged(const QList & /*selectedNodeList*/, diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.h b/src/plugins/qmldesigner/components/integration/designdocumentview.h index 271f041a2f7668cf822036468b24077f0caba511..d2ef379fec68056ca3db1f2fb6f6e065a96b5a79 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.h +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.h @@ -58,6 +58,7 @@ public: virtual void propertiesRemoved(const QList& propertyList) QTC_OVERRIDE; virtual void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; virtual void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + virtual void signalHandlerPropertiesChanged(const QVector& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; virtual void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) QTC_OVERRIDE; virtual void selectedNodesChanged(const QList &selectedNodeList, diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index f7dfb121c1c6dc19f3f78f29c8cef52afff3461b..82ea759fe29f4f752ccd1d66907b64a821d0a0e6 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -103,6 +103,10 @@ void ItemLibraryView::bindingPropertiesChanged(const QList &, P } +void ItemLibraryView::signalHandlerPropertiesChanged(const QVector &, AbstractView::PropertyChangeFlags) +{ +} + void ItemLibraryView::nodeAboutToBeRemoved(const ModelNode &) { diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h index 277dac312a8c2a847a361e20937ef83658fce046..dc156d61e23152c68ced44c2472e1dcac72b7de4 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h @@ -65,6 +65,8 @@ public: PropertyChangeFlags propertyChange) QTC_OVERRIDE; void bindingPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector& propertyList, + PropertyChangeFlags propertyChange) QTC_OVERRIDE; void nodeAboutToBeRemoved(const ModelNode &removedNode) QTC_OVERRIDE; void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex) QTC_OVERRIDE; diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index dbc1ae1bdde2c73603dc3e194c8de442f3e1da11..b685e927159dc02438e8a9bcf64a683d3f12132c 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -162,6 +162,11 @@ void NavigatorView::bindingPropertiesChanged(const QList & /*pr { } +void NavigatorView::signalHandlerPropertiesChanged(const QVector & /*propertyList*/, + AbstractView::PropertyChangeFlags /*propertyChange*/) +{ +} + void NavigatorView::nodeAboutToBeRemoved(const ModelNode &removedNode) { if (m_treeModel->isInTree(removedNode)) diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h index 2a802d7a265a7e3b70b4c78064fca70b822ecec2..2aa159367f3b3d7a96bf0574731147c1eece27dd 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.h +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h @@ -70,6 +70,7 @@ public: void propertiesRemoved(const QList &propertyList) QTC_OVERRIDE; void variantPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void bindingPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector& propertyList,PropertyChangeFlags propertyChange) QTC_OVERRIDE; void nodeAboutToBeRemoved(const ModelNode &removedNode) QTC_OVERRIDE; void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex) QTC_OVERRIDE; diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index 07be74f04682f0d8a0a251319ff615c8b2fbbd7d..d4329cc674560e709548619586463cc4f6227797 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -916,6 +916,11 @@ void PropertyEditor::bindingPropertiesChanged(const QList& prop } } +void PropertyEditor::signalHandlerPropertiesChanged(const QVector & /*propertyList*/, + AbstractView::PropertyChangeFlags /*propertyChange*/) +{ +} + void PropertyEditor::instanceInformationsChange(const QMultiHash &informationChangeHash) { diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h index a1d9be92bb963a97d3ffe1a45d1d190e6086f32f..2aa52ad07dfcff87ea126b71a20c97501dbc6ea4 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h @@ -100,6 +100,7 @@ public: void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector& propertyList,PropertyChangeFlags propertyChange) QTC_OVERRIDE; void instanceInformationsChange(const QMultiHash &informationChangeHash) QTC_OVERRIDE; diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index ffea5bfe2ec61f57b29d91cdfa93573bedf7ceca..58f52e9d8d16f9042dd2916d7ee9d99c4ef074f0 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -342,6 +342,12 @@ void StatesEditorView::bindingPropertiesChanged(const QList &/* } +void StatesEditorView::signalHandlerPropertiesChanged(const QVector & /*propertyList*/, + AbstractView::PropertyChangeFlags /*propertyChange*/) +{ + +} + void StatesEditorView::selectedNodesChanged(const QList &/*selectedNodeList*/, const QList &/*lastSelectedNodeList*/) { diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h index a218c71e5801d9be194f243271f63945bb72327e..369353f3e366b799692ce3b6a91fa9d98e8d2f04 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h @@ -76,6 +76,7 @@ public: void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) QTC_OVERRIDE; void nodeIdChanged(const ModelNode &node, const QString &newId, const QString &oldId) QTC_OVERRIDE; void bindingPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector& propertyList,PropertyChangeFlags propertyChange) QTC_OVERRIDE; void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) QTC_OVERRIDE; void instancesPreviewImageChanged(const QVector &nodeList) QTC_OVERRIDE; diff --git a/src/plugins/qmldesigner/designercore/designercore-lib.pri b/src/plugins/qmldesigner/designercore/designercore-lib.pri index 96609f2ac60755a3e67e88822df4c628117f0cf1..edd64602c17b4db5e4c0b15cfab1ca4d92bd34c6 100644 --- a/src/plugins/qmldesigner/designercore/designercore-lib.pri +++ b/src/plugins/qmldesigner/designercore/designercore-lib.pri @@ -76,7 +76,9 @@ SOURCES += $$PWD/model/abstractview.cpp \ $$PWD/model/qmltextgenerator.cpp \ $$PWD/model/modelmerger.cpp \ $$PWD/exceptions/rewritingexception.cpp \ - $$PWD/model/viewmanager.cpp + $$PWD/model/viewmanager.cpp \ + $$PWD/model/signalhandlerproperty.cpp \ + $$PWD/model/internalsignalhandlerproperty.cpp HEADERS += $$PWD/include/qmldesignercorelib_global.h \ $$PWD/include/abstractview.h \ @@ -147,7 +149,9 @@ HEADERS += $$PWD/include/qmldesignercorelib_global.h \ $$PWD/include/mathutils.h \ $$PWD/include/customnotifications.h \ $$PWD/include/rewritingexception.h \ - $$PWD/include/viewmanager.h + $$PWD/include/viewmanager.h \ + $$PWD/include/signalhandlerproperty.h \ + $$PWD/model/internalsignalhandlerproperty.h contains(CONFIG, plugin) { # If core.pri has been included in the qmldesigner plugin diff --git a/src/plugins/qmldesigner/designercore/include/abstractproperty.h b/src/plugins/qmldesigner/designercore/include/abstractproperty.h index 36a993d538f8ec504d07101204ceb1e635921db2..86e7381ce5d5826b021aa33f5fff7c92263ac3c8 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/abstractproperty.h @@ -57,6 +57,7 @@ class QMLDESIGNERCORE_EXPORT NodeListProperty; class QMLDESIGNERCORE_EXPORT NodeAbstractProperty; class QMLDESIGNERCORE_EXPORT BindingProperty; class QMLDESIGNERCORE_EXPORT NodeProperty; +class QMLDESIGNERCORE_EXPORT SignalHandlerProperty; class QmlObjectNode; @@ -93,12 +94,14 @@ public: NodeAbstractProperty toNodeAbstractProperty() const; BindingProperty toBindingProperty() const; NodeProperty toNodeProperty() const; + SignalHandlerProperty toSignalHandlerProperty() const; bool isVariantProperty() const; bool isNodeListProperty() const; bool isNodeAbstractProperty() const; bool isBindingProperty() const; bool isNodeProperty() const; + bool isSignalHandlerProperty() const; bool isDynamic() const; TypeName dynamicTypeName() const; diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index cad3f5946a21ec190eceba8fd55c0e2544afdcde..13063fb701156e2121abf51c1a135e3ed01d6afd 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -190,6 +190,7 @@ public: virtual void propertiesRemoved(const QList& propertyList) = 0; virtual void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) = 0; virtual void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) = 0; + virtual void signalHandlerPropertiesChanged(const QVector& propertyList, PropertyChangeFlags propertyChange) = 0; virtual void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) = 0; virtual void instancePropertyChange(const QList > &propertyList) = 0; diff --git a/src/plugins/qmldesigner/designercore/include/forwardview.h b/src/plugins/qmldesigner/designercore/include/forwardview.h index 82b4398aca07cddfb480657e994d07bc982c2f2f..7ebd6ca67d7bad946db5140def90e9fa9889bc1f 100644 --- a/src/plugins/qmldesigner/designercore/include/forwardview.h +++ b/src/plugins/qmldesigner/designercore/include/forwardview.h @@ -62,6 +62,7 @@ public: void propertiesRemoved(const QList& propertyList); void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange); void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange); + void signalHandlerPropertiesChanged(const QVector& propertyList,PropertyChangeFlags propertyChange); void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion); void selectedNodesChanged(const QList &selectedNodeList, @@ -185,6 +186,12 @@ void ForwardView::bindingPropertiesChanged(const QListbindingPropertiesChanged(adjustedList(propertyList, view.data()), propertyChange); } +void ForwardView::signalHandlerPropertiesChanged(const QVector &propertyList, AbstractView::PropertyChangeFlags propertyChange) +{ + foreach (const ViewTypePointer &view, m_targetViewList) + view->signalHandlerPropertiesChanged(adjustedList(propertyList, view.data()), propertyChange); +} + template void ForwardView::rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) { diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index ed322f49d9229315b1303723a0b27c8e5fc58da0..baadebb65676bef0bdef457053125eb9a34170e3 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -56,6 +56,7 @@ class NodeMetaInfo; class AbstractProperty; class BindingProperty; class VariantProperty; +class SignalHandlerProperty; class Model; class AbstractView; class NodeListProperty; @@ -120,6 +121,7 @@ public: AbstractProperty property(const PropertyName &name) const; VariantProperty variantProperty(const PropertyName &name) const; BindingProperty bindingProperty(const PropertyName &name) const; + SignalHandlerProperty signalHandlerProperty(const PropertyName &name) const; NodeListProperty nodeListProperty(const PropertyName &name) const; NodeProperty nodeProperty(const PropertyName &name) const; NodeAbstractProperty nodeAbstractProperty(const PropertyName &name) const; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 734211c29f0252f3b98cacfd06ec7d000a688954..205355edd991ba5c38bb87c534e95adbd5f35ad9 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -91,6 +91,7 @@ public: void propertiesRemoved(const QList& propertyList) QTC_OVERRIDE; void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector &propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void nodeAboutToBeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h index a24059b60114fca91752006c66e728a0a4105622..8807f2cff4edec8a43d1a70681f058303283f742 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h +++ b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h @@ -118,6 +118,7 @@ public: void propertiesRemoved(const QList& propertyList) QTC_OVERRIDE; void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector& propertyList,PropertyChangeFlags propertyChange) QTC_OVERRIDE; void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) QTC_OVERRIDE; void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) QTC_OVERRIDE; diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 5ffdfef2b491a2d93f40dc68b2cd0ec16e44651c..ff65fb09aca546917e5a9fd07b684ca1eb6ee638 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -127,6 +127,7 @@ public: void propertiesRemoved(const QList& propertyList) QTC_OVERRIDE; void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) QTC_OVERRIDE; + void signalHandlerPropertiesChanged(const QVector& propertyList,PropertyChangeFlags propertyChange) QTC_OVERRIDE; void nodeAboutToBeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) QTC_OVERRIDE; diff --git a/src/plugins/qmldesigner/designercore/include/signalhandlerproperty.h b/src/plugins/qmldesigner/designercore/include/signalhandlerproperty.h new file mode 100644 index 0000000000000000000000000000000000000000..649e9846fcec04d464a831c0ea6caf4df5bf7e73 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/include/signalhandlerproperty.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef SIGNALHANDLERPROPERTY_H +#define SIGNALHANDLERPROPERTY_H + +#include "qmldesignercorelib_global.h" +#include "abstractproperty.h" + +namespace QmlDesigner { + +class QMLDESIGNERCORE_EXPORT SignalHandlerProperty : public QmlDesigner::AbstractProperty +{ + friend class QmlDesigner::ModelNode; + friend class QmlDesigner::Internal::ModelPrivate; + friend class QmlDesigner::AbstractProperty; + +public: + void setSource(const QString &source); + QString source() const; + SignalHandlerProperty& operator= (const QString &source); + + SignalHandlerProperty(); + SignalHandlerProperty(const SignalHandlerProperty &property, AbstractView *view); + +protected: + SignalHandlerProperty(const PropertyName &propertyName, const Internal::InternalNodePointer &internalNode, Model* model, AbstractView *view); +}; + +} // namespace QmlDesigner + +#endif // SIGNALHANDLERPROPERTY_H diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 479e12db1bb52930d678f176d5fa7dbcb9fd8cea..c1a3a3d124bd1c4c05abdef5f57a1b05e62b12d0 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -376,6 +376,11 @@ void NodeInstanceView::bindingPropertiesChanged(const QList& pr nodeInstanceServer()->changePropertyBindings(createChangeBindingCommand(propertyList)); } +void NodeInstanceView::signalHandlerPropertiesChanged(const QVector & /*propertyList*/, + AbstractView::PropertyChangeFlags /*propertyChange*/) +{ +} + /*! \brief Notifing the view that a AbstractProperty value was changed to a ModelNode. The property will be set for the NodeInstance. diff --git a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp index dd86adcb312167a3e274617398baba6a001fb0fa..51cac9a412235bf98a0594d18360831fda21b051 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp @@ -37,6 +37,7 @@ #include "invalidpropertyexception.h" #include "variantproperty.h" #include "bindingproperty.h" +#include "signalhandlerproperty.h" #include "nodeproperty.h" #include "nodeabstractproperty.h" #include "nodelistproperty.h" @@ -257,6 +258,19 @@ NodeProperty AbstractProperty::toNodeProperty() const return NodeProperty(); } +SignalHandlerProperty AbstractProperty::toSignalHandlerProperty() const +{ + if (!isValid()) + throw InvalidPropertyException(__LINE__, __FUNCTION__, __FILE__, m_propertyName); + + SignalHandlerProperty propertyNode(name(), internalNode(), model(), view()); + + if (propertyNode.isSignalHandlerProperty()) + return propertyNode; + + return SignalHandlerProperty(); +} + NodeListProperty AbstractProperty::toNodeListProperty() const { if (!isValid()) @@ -348,6 +362,19 @@ bool AbstractProperty::isNodeProperty() const return false; } +bool AbstractProperty::isSignalHandlerProperty() const +{ + if (!isValid()) + throw InvalidPropertyException(__LINE__, __FUNCTION__, __FILE__, m_propertyName); + + if (internalNode()->hasProperty(name())) { + Q_ASSERT(internalNode()->property(name())); + return internalNode()->property(name())->isSignalHandlerProperty(); + } + + return false; +} + bool AbstractProperty::isBindingProperty() const { diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index f73d210d8c4440698851964393c52c0864907172..8c452eb523186c8b01f21214ccb54ea07f3e8b89 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -200,6 +200,15 @@ InternalBindingProperty::Pointer InternalNode::bindingProperty(const PropertyNam return InternalBindingProperty::Pointer(); } +InternalSignalHandlerProperty::Pointer InternalNode::signalHandlerProperty(const PropertyName &name) const +{ + InternalProperty::Pointer property = m_namePropertyHash.value(name); + if (property->isSignalHandlerProperty()) + return property.staticCast(); + + return InternalSignalHandlerProperty::Pointer(); +} + InternalVariantProperty::Pointer InternalNode::variantProperty(const PropertyName &name) const { InternalProperty::Pointer property = m_namePropertyHash.value(name); @@ -215,6 +224,12 @@ void InternalNode::addBindingProperty(const PropertyName &name) m_namePropertyHash.insert(name, newProperty); } +void InternalNode::addSignalHandlerProperty(const PropertyName &name) +{ + InternalProperty::Pointer newProperty(InternalSignalHandlerProperty::create(name, internalPointer())); + m_namePropertyHash.insert(name, newProperty); +} + InternalNodeListProperty::Pointer InternalNode::nodeListProperty(const PropertyName &name) const { InternalProperty::Pointer property = m_namePropertyHash.value(name); diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index b1edde9d94960402bf25a711cc736c9d8b8983a3..37c249f47b7851efce2a9fd11e5b98cc9bf8d744 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -38,6 +38,7 @@ #include "internalproperty.h" #include "internalvariantproperty.h" #include "internalbindingproperty.h" +#include "internalsignalhandlerproperty.h" #include "internalnodelistproperty.h" #include "internalnodeproperty.h" #include "internalnodeabstractproperty.h" @@ -93,12 +94,14 @@ public: InternalProperty::Pointer property(const PropertyName &name) const; InternalBindingProperty::Pointer bindingProperty(const PropertyName &name) const; + InternalSignalHandlerProperty::Pointer signalHandlerProperty(const PropertyName &name) const; InternalVariantProperty::Pointer variantProperty(const PropertyName &name) const; InternalNodeListProperty::Pointer nodeListProperty(const PropertyName &name) const; InternalNodeAbstractProperty::Pointer nodeAbstractProperty(const PropertyName &name) const; InternalNodeProperty::Pointer nodeProperty(const PropertyName &name) const; void addBindingProperty(const PropertyName &name); + void addSignalHandlerProperty(const PropertyName &name); void addNodeListProperty(const PropertyName &name); void addVariantProperty(const PropertyName &name); void addNodeProperty(const PropertyName &name); diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp index c5fc9e3438b72eb0e92d24204b2d3dee9a9ec18b..2ae1307550fb45d9fa22075ab702bee2deaa750a 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp @@ -32,6 +32,7 @@ #include "internalvariantproperty.h" #include "internalnodelistproperty.h" #include "internalnodeproperty.h" +#include "internalsignalhandlerproperty.h" #include "internalnode_p.h" #include #include @@ -116,6 +117,11 @@ bool InternalProperty::isNodeAbstractProperty() const return false; } +bool InternalProperty::isSignalHandlerProperty() const +{ + return false; +} + QSharedPointer InternalProperty::toVariantProperty() const { @@ -146,6 +152,12 @@ QSharedPointer InternalProperty::toNodeAbstractPro return internalPointer().staticCast(); } +QSharedPointer InternalProperty::toSignalHandlerProperty() const +{ + Q_ASSERT(internalPointer().dynamicCast()); + return internalPointer().staticCast(); +} + void InternalProperty::remove() { propertyOwner()->removeProperty(name()); diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.h b/src/plugins/qmldesigner/designercore/model/internalproperty.h index 8aabd3fe65b09bcad088774986f0aa4837b68d0a..14d72a68a593b59126719ca165c4551ffaff2987 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.h @@ -46,6 +46,7 @@ namespace QmlDesigner { namespace Internal { class InternalBindingProperty; +class InternalSignalHandlerProperty; class InternalVariantProperty; class InternalNodeListProperty; class InternalNodeProperty; @@ -74,12 +75,14 @@ public: virtual bool isNodeListProperty() const; virtual bool isNodeProperty() const; virtual bool isNodeAbstractProperty() const; + virtual bool isSignalHandlerProperty() const; QSharedPointer toBindingProperty() const; QSharedPointer toVariantProperty() const; QSharedPointer toNodeListProperty() const; QSharedPointer toNodeProperty() const; QSharedPointer toNodeAbstractProperty() const; + QSharedPointer toSignalHandlerProperty() const; InternalNodePointer propertyOwner() const; diff --git a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp new file mode 100644 index 0000000000000000000000000000000000000000..73fd1c399caef6a4b77f146118a639b8274b212f --- /dev/null +++ b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "InternalSignalHandlerProperty.h" + +namespace QmlDesigner { +namespace Internal { + +InternalSignalHandlerProperty::InternalSignalHandlerProperty(const PropertyName &name, const InternalNodePointer &propertyOwner) + : InternalProperty(name, propertyOwner) +{ +} + + +InternalSignalHandlerProperty::Pointer InternalSignalHandlerProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) +{ + InternalSignalHandlerProperty *newPointer(new InternalSignalHandlerProperty(name, propertyOwner)); + InternalSignalHandlerProperty::Pointer smartPointer(newPointer); + + newPointer->setInternalWeakPointer(smartPointer); + + return smartPointer; +} + +bool InternalSignalHandlerProperty::isValid() const +{ + return InternalProperty::isValid() && isSignalHandlerProperty(); +} + +QString InternalSignalHandlerProperty::source() const +{ + return m_source; +} +void InternalSignalHandlerProperty::setSource(const QString &source) +{ + m_source = source; +} + +bool InternalSignalHandlerProperty::isSignalHandlerProperty() const +{ + return true; +} + +} // namespace Internal +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h new file mode 100644 index 0000000000000000000000000000000000000000..335ceb8199ddd31dffe626918e3d312a6246df99 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef INTERNALSIGNALHANDLERPROPERTY_H +#define INTERNALSIGNALHANDLERPROPERTY_H + +#include "internalproperty.h" + +namespace QmlDesigner { +namespace Internal { + +class InternalSignalHandlerProperty : public InternalProperty +{ +public: + typedef QSharedPointer Pointer; + + static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); + + bool isValid() const; + + QString source() const; + void setSource(const QString &source); + + bool isSignalHandlerProperty() const; + +protected: + InternalSignalHandlerProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); + +private: + QString m_source; +}; + +} // namespace Internal +} // namespace QmlDesigner + +#endif // INTERNALSIGNALHANDLERPROPERTY_H diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index eb32bf1b904d0212af3904439393e9275dd1272f..23b71ef0faf5f34b867a9a7f3948421e9593275f 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -52,6 +52,7 @@ #include "subcomponentmanager.h" #include "internalproperty.h" #include "internalnodelistproperty.h" +#include "internalsignalhandlerproperty.h" #include "internalnodeabstractproperty.h" #include "invalidmodelnodeexception.h" #include "invalidmodelstateexception.h" @@ -60,6 +61,7 @@ #include "abstractproperty.h" #include "variantproperty.h" #include "bindingproperty.h" +#include "signalhandlerproperty.h" #include "nodeabstractproperty.h" #include "nodelistproperty.h" #include "rewritertransaction.h" @@ -1009,6 +1011,46 @@ void ModelPrivate::notifyBindingPropertiesChanged(const QList &internalPropertyList, AbstractView::PropertyChangeFlags propertyChange) +{ + bool resetModel = false; + QString description; + + try { + if (rewriterView()) { + QVector propertyList; + foreach (const InternalSignalHandlerPropertyPointer &signalHandlerProperty, internalPropertyList) { + propertyList.append(SignalHandlerProperty(signalHandlerProperty->name(), signalHandlerProperty->propertyOwner(), model(), rewriterView())); + } + rewriterView()->signalHandlerPropertiesChanged(propertyList, propertyChange); + } + } catch (RewritingException &e) { + description = e.description(); + resetModel = true; + } + + foreach (const QWeakPointer &view, m_viewList) { + Q_ASSERT(view != 0); + QVector propertyList; + foreach (const InternalSignalHandlerPropertyPointer &signalHandlerProperty, internalPropertyList) { + propertyList.append(SignalHandlerProperty(signalHandlerProperty->name(), signalHandlerProperty->propertyOwner(), model(), view.data())); + } + view->signalHandlerPropertiesChanged(propertyList, propertyChange); + + } + + if (nodeInstanceView()) { + QVector propertyList; + foreach (const InternalSignalHandlerPropertyPointer &signalHandlerProperty, internalPropertyList) { + propertyList.append(SignalHandlerProperty(signalHandlerProperty->name(), signalHandlerProperty->propertyOwner(), model(), nodeInstanceView())); + } + nodeInstanceView()->signalHandlerPropertiesChanged(propertyList, propertyChange); + } + + if (resetModel) + resetModelByRewriter(description); +} + void ModelPrivate::notifyScriptFunctionsChanged(const InternalNodePointer &internalNodePointer, const QStringList &scriptFunctionList) { bool resetModel = false; @@ -1392,6 +1434,19 @@ void ModelPrivate::setBindingProperty(const InternalNode::Pointer &internalNode, notifyBindingPropertiesChanged(QList() << bindingProperty, propertyChange); } +void ModelPrivate::setSignalHandlerProperty(const InternalNodePointer &internalNode, const PropertyName &name, const QString &source) +{ + AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; + if (!internalNode->hasProperty(name)) { + internalNode->addSignalHandlerProperty(name); + propertyChange = AbstractView::PropertiesAdded; + } + + InternalSignalHandlerProperty::Pointer signalHandlerProperty = internalNode->signalHandlerProperty(name); + signalHandlerProperty->setSource(source); + notifySignalHandlerPropertiesChanged(QVector() << signalHandlerProperty, propertyChange); +} + void ModelPrivate::setVariantProperty(const InternalNode::Pointer &internalNode, const PropertyName &name, const QVariant &value) { AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 57ff11e4da8ce3b2da363581f0bd3998881bc497..ae0f156eb56af4586dd18201e897546af6513f1e 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -56,6 +56,7 @@ namespace Internal { class InternalNode; class InternalProperty; class InternalBindingProperty; +class InternalSignalHandlerProperty; class InternalVariantProperty; class InternalNodeAbstractProperty; class InternalNodeListProperty; @@ -63,6 +64,7 @@ class InternalNodeListProperty; typedef QSharedPointer InternalNodePointer; typedef QSharedPointer InternalPropertyPointer; typedef QSharedPointer InternalBindingPropertyPointer; +typedef QSharedPointer InternalSignalHandlerPropertyPointer; typedef QSharedPointer InternalVariantPropertyPointer; typedef QSharedPointer InternalNodeAbstractPropertyPointer; typedef QSharedPointer InternalNodeListPropertyPointer; @@ -137,6 +139,7 @@ public: void notifyPropertiesRemoved(const QList &propertyList); void notifyPropertiesAboutToBeRemoved(const QList &propertyList); void notifyBindingPropertiesChanged(const QList &propertyList, AbstractView::PropertyChangeFlags propertyChange); + void notifySignalHandlerPropertiesChanged(const QVector &propertyList, AbstractView::PropertyChangeFlags propertyChange); void notifyVariantPropertiesChanged(const InternalNodePointer &internalNodePointer, const PropertyNameList &propertyNameList, AbstractView::PropertyChangeFlags propertyChange); void notifyScriptFunctionsChanged(const InternalNodePointer &internalNodePointer, const QStringList &scriptFunctionList); @@ -187,6 +190,7 @@ public: void removeProperty(const InternalPropertyPointer &property); void setBindingProperty(const InternalNodePointer &internalNode, const PropertyName &name, const QString &expression); + void setSignalHandlerProperty(const InternalNodePointer &internalNode, const PropertyName &name, const QString &source); void setVariantProperty(const InternalNodePointer &internalNode, const PropertyName &name, const QVariant &value); void setDynamicVariantProperty(const InternalNodePointer &internalNode, const PropertyName &name, const TypeName &propertyType, const QVariant &value); void setDynamicBindingProperty(const InternalNodePointer &internalNode, const PropertyName &name, const TypeName &dynamicPropertyType, const QString &expression); diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 1266241b12455818b462b9950f2da1fa068c1030..b1752c3c7fd634f0595ab8ec81b767734fbbad1d 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -44,6 +44,7 @@ #include "model_p.h" #include "variantproperty.h" #include "bindingproperty.h" +#include "signalhandlerproperty.h" #include "nodeabstractproperty.h" #include "nodelistproperty.h" #include "nodeproperty.h" @@ -404,6 +405,14 @@ BindingProperty ModelNode::bindingProperty(const PropertyName &name) const return BindingProperty(name, m_internalNode, model(), view()); } +SignalHandlerProperty ModelNode::signalHandlerProperty(const PropertyName &name) const +{ + if (!isValid()) + throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); + + return SignalHandlerProperty(name, m_internalNode, model(), view()); +} + /*! \brief Returns a NodeProperty diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index 511ea6c44e3339e0b3ac1bb1e17f5f3b09ddd197..53d0bab0fb4324d026d167e8c4f40967e37d0dbd 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -315,7 +315,7 @@ void ModelToTextMerger::schedule(RewriteAction *action) QmlDesigner::QmlRefactoring::PropertyType ModelToTextMerger::propertyType(const AbstractProperty &property, const QString &textValue) { - if (property.isBindingProperty()) { + if (property.isBindingProperty() || property.isSignalHandlerProperty()) { QString val = textValue.trimmed(); if (val.isEmpty()) return QmlDesigner::QmlRefactoring::ObjectBinding; diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index 655b821d3795fb07df9f5c93fd872099d331ffcb..0b41ad18eeb737392a8063d839ce68f1a261c5d9 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -366,6 +366,7 @@ void QmlModelView::propertiesAboutToBeRemoved(const QList& /*p void QmlModelView::propertiesRemoved(const QList& /*propertyList*/) {} void QmlModelView::variantPropertiesChanged(const QList& /*propertyList*/, PropertyChangeFlags /*propertyChange*/) {} void QmlModelView::bindingPropertiesChanged(const QList& /*propertyList*/, PropertyChangeFlags /*propertyChange*/) {} +void QmlModelView::signalHandlerPropertiesChanged(const QVector & /*propertyList*/, AbstractView::PropertyChangeFlags /*propertyChange*/) {} void QmlModelView::rootNodeTypeChanged(const QString &/*type*/, int, int /*minorVersion*/) {} void QmlModelView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) {} void QmlModelView::selectedNodesChanged(const QList &/*selectedNodeList*/, const QList &/*lastSelectedNodeList*/) {} diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index ebd001a29223ac680860039e128e746b3efcfe90..1fe6d0e027208586d01dbfcb06f9f6af00b7b45f 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -33,6 +33,7 @@ #include #include "bindingproperty.h" +#include "signalhandlerproperty.h" #include "nodeproperty.h" #include "nodelistproperty.h" #include "variantproperty.h" @@ -74,6 +75,8 @@ QString QmlTextGenerator::toQml(const AbstractProperty &property, int indentDept { if (property.isBindingProperty()) { return property.toBindingProperty().expression(); + } else if (property.isSignalHandlerProperty()) { + return property.toSignalHandlerProperty().source(); } else if (property.isNodeProperty()) { return toQml(property.toNodeProperty().modelNode(), indentDepth); } else if (property.isNodeListProperty()) { diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 139c4c99ab90f9a5144d9d39de11ba4d38f045c8..1934399d448e76a3549d5a10d7d3a632043cfd50 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -43,6 +43,7 @@ #include "modeltotextmerger.h" #include "nodelistproperty.h" #include "nodeproperty.h" +#include "signalhandlerproperty.h" #include "invalidmodelnodeexception.h" @@ -264,6 +265,22 @@ void RewriterView::bindingPropertiesChanged(const QList& proper applyChanges(); } +void RewriterView::signalHandlerPropertiesChanged(const QVector &propertyList, AbstractView::PropertyChangeFlags propertyChange) +{ + Q_ASSERT(textModifier()); + if (textToModelMerger()->isActive()) + return; + + QList usefulPropertyList; + foreach (const SignalHandlerProperty &property, propertyList) + usefulPropertyList.append(property); + + modelToTextMerger()->propertiesChanged(usefulPropertyList, propertyChange); + + if (!isModificationGroupActive()) + applyChanges(); +} + void RewriterView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) { Q_ASSERT(textModifier()); diff --git a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fd03f46848be2a689e3fc297240b04f1486c2a67 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "SignalHandlerProperty.h" +#include "nodeabstractproperty.h" +#include "nodeproperty.h" +#include "internalproperty.h" +#include "internalSignalHandlerProperty.h" +#include "invalidmodelnodeexception.h" +#include "invalidpropertyexception.h" +#include "invalidargumentexception.h" +#include "internalnode_p.h" +#include "model.h" +#include "model_p.h" +namespace QmlDesigner { + +SignalHandlerProperty::SignalHandlerProperty() +{ +} + +SignalHandlerProperty::SignalHandlerProperty(const SignalHandlerProperty &property, AbstractView *view) + : AbstractProperty(property.name(), property.internalNode(), property.model(), view) +{ +} + + +SignalHandlerProperty::SignalHandlerProperty(const PropertyName &propertyName, const Internal::InternalNodePointer &internalNode, Model* model, AbstractView *view) + : AbstractProperty(propertyName, internalNode, model, view) +{ +} + + +void SignalHandlerProperty::setSource(const QString &source) +{ + Internal::WriteLocker locker(model()); + if (!isValid()) + throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); + + if (name() == "id") { // the ID for a node is independent of the state, so it has to be set with ModelNode::setId + throw InvalidPropertyException(__LINE__, __FUNCTION__, __FILE__, name()); + } + + if (source.isEmpty()) + throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, name()); + + if (internalNode()->hasProperty(name())) { //check if oldValue != value + Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); + if (internalProperty->isSignalHandlerProperty() + && internalProperty->toSignalHandlerProperty()->source() == source) + + return; + } + + if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isSignalHandlerProperty()) + model()->d->removeProperty(internalNode()->property(name())); + + model()->d->setSignalHandlerProperty(internalNode(), name(), source); +} + +QString SignalHandlerProperty::source() const +{ + if (internalNode()->hasProperty(name()) + && internalNode()->property(name())->isSignalHandlerProperty()) + return internalNode()->signalHandlerProperty(name())->source(); + + return QString(); +} + +SignalHandlerProperty& SignalHandlerProperty::operator= (const QString &source) +{ + setSource(source); + + return *this; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index de6c4d75d8be92773eebe43b4a1c1a331bf3a664..540e0d49a00767998b104622e9503f235f0095bb 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -40,6 +40,7 @@ #include "textmodifier.h" #include "rewriterview.h" #include "variantproperty.h" +#include "signalhandlerproperty.h" #include "nodemetainfo.h" #include "qmldesignercorelib_global.h" @@ -263,6 +264,11 @@ static bool isPropertyChangesType(const QmlDesigner::TypeName &type) return type == "PropertyChanges" || type == "QtQuick.PropertyChanges" || type == "Qt.PropertyChanges"; } +static bool isConnectionsType(const QmlDesigner::TypeName &type) +{ + return type == "Connections" || type == "QtQuick.Connections" || type == "Qt.Connections"; +} + static bool propertyIsComponentType(const QmlDesigner::NodeAbstractProperty &property, const QmlDesigner::TypeName &type, QmlDesigner::Model *model) { if (model->metaInfo(type, -1, -1).isSubclassOf("QtQuick.Component", -1, -1) && !isComponentType(type)) @@ -916,7 +922,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (UiArrayBinding *array = cast(member)) { const QString astPropertyName = toString(array->qualifiedId); - if (isPropertyChangesType(typeName) || context->lookupProperty(QString(), array->qualifiedId)) { + if (isPropertyChangesType(typeName) || isConnectionsType(typeName) || context->lookupProperty(QString(), array->qualifiedId)) { AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); QList arrayMembers; for (UiArrayMemberList *iter = array->members; iter; iter = iter->next) @@ -950,7 +956,9 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, const Value *propertyType = 0; const ObjectValue *containingObject = 0; QString name; - if (context->lookupProperty(QString(), binding->qualifiedId, &propertyType, &containingObject, &name) || isPropertyChangesType(typeName)) { + if (context->lookupProperty(QString(), binding->qualifiedId, &propertyType, &containingObject, &name) + || isPropertyChangesType(typeName) + || isConnectionsType(typeName)) { AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); if (context->isArrayProperty(propertyType, containingObject, name)) syncArrayProperty(modelProperty, QList() << member, context, differenceHandler); @@ -1050,11 +1058,15 @@ QmlDesigner::PropertyName TextToModelMerger::syncScriptBinding(ModelNode &modelN return astPropertyName.toUtf8(); } - if (isSignalPropertyName(astPropertyName)) - return PropertyName(); + if (isSignalPropertyName(astPropertyName)) { + AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); + syncSignalHandler(modelProperty, astValue, differenceHandler); + return astPropertyName.toUtf8(); + } if (isLiteralValue(script)) { - if (isPropertyChangesType(modelNode.type())) { + if (isPropertyChangesType(modelNode.type()) + || isConnectionsType(modelNode.type())) { AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); const QVariant variantValue(deEscape(stripQuotes(astValue))); syncVariantProperty(modelProperty, variantValue, TypeName(), differenceHandler); @@ -1079,7 +1091,9 @@ QmlDesigner::PropertyName TextToModelMerger::syncScriptBinding(ModelNode &modelN syncVariantProperty(modelProperty, enumValue, TypeName(), differenceHandler); // TODO: parse type return astPropertyName.toUtf8(); } else { // Not an enum, so: - if (isPropertyChangesType(modelNode.type()) || context->lookupProperty(prefix, script->qualifiedId)) { + if (isPropertyChangesType(modelNode.type()) + || isConnectionsType(modelNode.type()) + || context->lookupProperty(prefix, script->qualifiedId)) { AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); syncExpressionProperty(modelProperty, astValue, TypeName(), differenceHandler); // TODO: parse type return astPropertyName.toUtf8(); @@ -1159,6 +1173,21 @@ void TextToModelMerger::syncExpressionProperty(AbstractProperty &modelProperty, } } +void TextToModelMerger::syncSignalHandler(AbstractProperty &modelProperty, + const QString &javascript, + DifferenceHandler &differenceHandler) +{ + if (modelProperty.isSignalHandlerProperty()) { + SignalHandlerProperty signalHandlerProperty = modelProperty.toSignalHandlerProperty(); + if (signalHandlerProperty.source() != javascript) { + differenceHandler.signalHandlerSourceDiffer(signalHandlerProperty, javascript); + } + } else { + differenceHandler.shouldBeSignalHandlerProperty(modelProperty, javascript); + } +} + + void TextToModelMerger::syncArrayProperty(AbstractProperty &modelProperty, const QList &arrayMembers, ReadingContext *context, @@ -1321,6 +1350,21 @@ void ModelValidator::shouldBeBindingProperty(AbstractProperty &modelProperty, Q_ASSERT(0); } +void ModelValidator::signalHandlerSourceDiffer(SignalHandlerProperty &modelProperty, const QString &javascript) +{ + Q_UNUSED(modelProperty) + Q_UNUSED(javascript) + Q_ASSERT(modelProperty.source() == javascript); + Q_ASSERT(0); +} + +void ModelValidator::shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, const QString &javascript) +{ + Q_UNUSED(modelProperty) + Q_ASSERT(modelProperty.isSignalHandlerProperty()); + Q_ASSERT(0); +} + void ModelValidator::shouldBeNodeListProperty(AbstractProperty &modelProperty, const QList /*arrayMembers*/, ReadingContext * /*context*/) @@ -1450,6 +1494,18 @@ void ModelAmender::shouldBeBindingProperty(AbstractProperty &modelProperty, newModelProperty.setDynamicTypeNameAndExpression(astType, javascript); } +void ModelAmender::signalHandlerSourceDiffer(SignalHandlerProperty &modelProperty, const QString &javascript) +{ + modelProperty.setSource(javascript); +} + +void ModelAmender::shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, const QString &javascript) +{ + ModelNode theNode = modelProperty.parentModelNode(); + SignalHandlerProperty newModelProperty = theNode.signalHandlerProperty(modelProperty.name()); + newModelProperty.setSource(javascript); +} + void ModelAmender::shouldBeNodeListProperty(AbstractProperty &modelProperty, const QList arrayMembers, ReadingContext *context) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index 81c4797d6f70be7d0ba7ac37a5385d4330bd5aaa..68e9a4778c29da939778df75e7e824bcbe307e28 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -94,6 +94,9 @@ public: const QString &javascript, const TypeName &astType, DifferenceHandler &differenceHandler); + void syncSignalHandler(AbstractProperty &modelProperty, + const QString &javascript, + DifferenceHandler &differenceHandler); void syncArrayProperty(AbstractProperty &modelProperty, const QList &arrayMembers, ReadingContext *context, @@ -123,7 +126,6 @@ public: void setupCustomParserNodeDelayed(const ModelNode &node, bool synchron); void delayedSetup(); - private: void setupCustomParserNode(const ModelNode &node); void setupComponent(const ModelNode &node); @@ -158,9 +160,13 @@ public: virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &javascript, const TypeName &astType) = 0; + virtual void signalHandlerSourceDiffer(SignalHandlerProperty &modelProperty, + const QString &javascript) = 0; virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, const QString &javascript, const TypeName &astType) = 0; + virtual void shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, + const QString &javascript) = 0; virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QList arrayMembers, ReadingContext *context) = 0; @@ -208,6 +214,10 @@ public: virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, const QString &javascript, const TypeName &astType); + virtual void signalHandlerSourceDiffer(SignalHandlerProperty &modelProperty, + const QString &javascript); + virtual void shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, + const QString &javascript); virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QList arrayMembers, ReadingContext *context); @@ -252,6 +262,10 @@ public: virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, const QString &javascript, const TypeName &astType); + virtual void signalHandlerSourceDiffer(SignalHandlerProperty &modelProperty, + const QString &javascript); + virtual void shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, + const QString &javascript); virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QList arrayMembers, ReadingContext *context); diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp index c0871e08c355c2395d936a2d95bbf71be07fce86..95c76f741776668aedfaa0894a3199b97afad164 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp @@ -152,6 +152,10 @@ void ViewLogger::bindingPropertiesChanged(const QList& property m_output << time() << indent() << property << endl; } +void ViewLogger::signalHandlerPropertiesChanged(const QVector & /*propertyList*/, AbstractView::PropertyChangeFlags /*propertyChange*/) +{ +} + void ViewLogger::rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) { m_output << time() << indent("rootNodeTypeChanged:") << rootModelNode() << type << majorVersion << minorVersion << endl; diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.h b/src/plugins/qmldesigner/designercore/model/viewlogger.h index 1c1f2444ffe1b0a25a04741530c143b51507d893..baa94550aca2709d0ec62b7279dbad995819a9e2 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.h +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.h @@ -57,6 +57,7 @@ public: void propertiesRemoved(const QList& propertyList); void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange); void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange); + void signalHandlerPropertiesChanged(const QVector &propertyList, PropertyChangeFlags propertyChange); void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion); void selectedNodesChanged(const QList &selectedNodeList,