From bed1c073dbd1d1be324bbe2009d33c6f6f941bbe Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 22 Oct 2020 14:47:08 +0200 Subject: [PATCH] QmlDesigner: Simplify notifier Change-Id: I6542596729e025210447ab93aaef44ed103d9982 Reviewed-by: Thomas Hartmann Reviewed-by: Mahmoud Badri --- .../qmldesigner/designercore/include/model.h | 6 +- .../qmldesigner/designercore/model/model.cpp | 1210 +++++------------ .../qmldesigner/designercore/model/model_p.h | 17 +- 3 files changed, 356 insertions(+), 877 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index 20611736e90..966e30c0c15 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -94,9 +94,9 @@ public: // Editing sub-components: // Imports: - QList imports() const; - QList possibleImports() const; - QList usedImports() const; + const QList &imports() const; + const QList &possibleImports() const; + const QList &usedImports() const; void changeImports(const QList &importsToBeAdded, const QList &importsToBeRemoved); void setPossibleImports(const QList &possibleImports); void setUsedImports(const QList &usedImports); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index aed9ae788c4..d504a1fbda5 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -24,38 +24,38 @@ ****************************************************************************/ #include "model.h" +#include "internalnode_p.h" +#include "invalidargumentexception.h" +#include "invalidpropertyexception.h" #include "model_p.h" #include -#include "internalnode_p.h" -#include "invalidpropertyexception.h" -#include "invalidargumentexception.h" -#include #include #include +#include #include #include "abstractview.h" -#include "nodeinstanceview.h" -#include "metainfo.h" -#include "nodemetainfo.h" -#include "internalproperty.h" -#include "internalnodelistproperty.h" -#include "internalsignalhandlerproperty.h" #include "internalnodeabstractproperty.h" +#include "internalnodelistproperty.h" +#include "internalproperty.h" +#include "internalsignalhandlerproperty.h" #include "invalidmodelnodeexception.h" +#include "metainfo.h" +#include "nodeinstanceview.h" +#include "nodemetainfo.h" #include "abstractproperty.h" -#include "variantproperty.h" #include "bindingproperty.h" -#include "signalhandlerproperty.h" +#include "invalididexception.h" #include "nodeabstractproperty.h" #include "nodelistproperty.h" #include "rewriterview.h" #include "rewritingexception.h" -#include "invalididexception.h" +#include "signalhandlerproperty.h" #include "textmodifier.h" +#include "variantproperty.h" #include @@ -80,12 +80,19 @@ Components that want to be informed about changes in the model can register a su namespace QmlDesigner { namespace Internal { -ModelPrivate::ModelPrivate(Model *model) : - m_q(model), - m_writeLock(false), - m_internalIdCounter(1) +ModelPrivate::ModelPrivate(Model *model) + : m_model(model) + , m_writeLock(false) + , m_internalIdCounter(1) { - m_rootInternalNode = createNode("QtQuick.Item", 1, 0, PropertyListType(), PropertyListType(), QString(), ModelNode::NodeWithoutSource,true); + m_rootInternalNode = createNode("QtQuick.Item", + 1, + 0, + PropertyListType(), + PropertyListType(), + QString(), + ModelNode::NodeWithoutSource, + true); m_currentStateNode = m_rootInternalNode; m_currentTimelineNode = m_rootInternalNode; } @@ -97,19 +104,19 @@ ModelPrivate::~ModelPrivate() void ModelPrivate::detachAllViews() { - foreach (const QPointer &view, m_viewList) + for (const QPointer &view : std::as_const(m_viewList)) detachView(view.data(), true); m_viewList.clear(); updateEnabledViews(); if (m_nodeInstanceView) { - m_nodeInstanceView->modelAboutToBeDetached(m_q); + m_nodeInstanceView->modelAboutToBeDetached(m_model); m_nodeInstanceView.clear(); } if (m_rewriterView) { - m_rewriterView->modelAboutToBeDetached(m_q); + m_rewriterView->modelAboutToBeDetached(m_model); m_rewriterView.clear(); } } @@ -126,10 +133,11 @@ Model *ModelPrivate::create(const TypeName &type, int major, int minor, Model *m return model; } -void ModelPrivate::changeImports(const QList &toBeAddedImportList, const QList &toBeRemovedImportList) +void ModelPrivate::changeImports(const QList &toBeAddedImportList, + const QList &toBeRemovedImportList) { QList removedImportList; - foreach (const Import &import, toBeRemovedImportList) { + for (const Import &import : toBeRemovedImportList) { if (m_imports.contains(import)) { removedImportList.append(import); m_imports.removeOne(import); @@ -137,7 +145,7 @@ void ModelPrivate::changeImports(const QList &toBeAddedImportList, const } QList addedImportList; - foreach (const Import &import, toBeAddedImportList) { + for (const Import &import : toBeAddedImportList) { if (!m_imports.contains(import)) { addedImportList.append(import); m_imports.append(import); @@ -148,7 +156,8 @@ void ModelPrivate::changeImports(const QList &toBeAddedImportList, const notifyImportsChanged(addedImportList, removedImportList); } -void ModelPrivate::notifyImportsChanged(const QList &addedImports, const QList &removedImports) +void ModelPrivate::notifyImportsChanged(const QList &addedImports, + const QList &removedImports) { bool resetModel = false; QString description; @@ -194,9 +203,10 @@ QUrl ModelPrivate::fileUrl() const return m_fileUrl; } -void ModelPrivate::setDocumentMessages(const QList &errors, const QList &warnings) +void ModelPrivate::setDocumentMessages(const QList &errors, + const QList &warnings) { - foreach (const QPointer &view, m_viewList) + for (const QPointer &view : std::as_const(m_viewList)) view->documentMessagesChanged(errors, warnings); } @@ -207,12 +217,15 @@ void ModelPrivate::setFileUrl(const QUrl &fileUrl) if (oldPath != fileUrl) { m_fileUrl = fileUrl; - foreach (const QPointer &view, m_viewList) + for (const QPointer &view : std::as_const(m_viewList)) view->fileUrlChanged(oldPath, fileUrl); } } -void ModelPrivate::changeNodeType(const InternalNodePointer &internalNodePointer, const TypeName &typeName, int majorVersion, int minorVersion) +void ModelPrivate::changeNodeType(const InternalNodePointer &internalNodePointer, + const TypeName &typeName, + int majorVersion, + int minorVersion) { internalNodePointer->setType(typeName); internalNodePointer->setMajorVersion(majorVersion); @@ -223,16 +236,14 @@ void ModelPrivate::changeNodeType(const InternalNodePointer &internalNodePointer } catch (const RewritingException &e) { throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, e.description().toUtf8()); - } - } InternalNode::Pointer ModelPrivate::createNode(const TypeName &typeName, int majorVersion, int minorVersion, - const QList > &propertyList, - const QList > &auxPropertyList, + const QList> &propertyList, + const QList> &auxPropertyList, const QString &nodeSource, ModelNode::NodeSourceType nodeSourceType, bool isRootNode) @@ -245,19 +256,21 @@ InternalNode::Pointer ModelPrivate::createNode(const TypeName &typeName, if (!isRootNode) internalId = m_internalIdCounter++; - InternalNode::Pointer newInternalNodePointer = InternalNode::create(typeName, majorVersion, minorVersion, internalId); + InternalNode::Pointer newInternalNodePointer = InternalNode::create(typeName, + majorVersion, + minorVersion, + internalId); newInternalNodePointer->setNodeSourceType(nodeSourceType); using PropertyPair = QPair; - foreach (const PropertyPair &propertyPair, propertyList) { + for (const PropertyPair &propertyPair : propertyList) { newInternalNodePointer->addVariantProperty(propertyPair.first); newInternalNodePointer->variantProperty(propertyPair.first)->setValue(propertyPair.second); } - foreach (const PropertyPair &propertyPair, auxPropertyList) { + for (const PropertyPair &propertyPair : auxPropertyList) newInternalNodePointer->setAuxiliaryData(propertyPair.first, propertyPair.second); - } m_nodeSet.insert(newInternalNodePointer); m_internalIdNodeHash.insert(newInternalNodePointer->internalId(), newInternalNodePointer); @@ -267,8 +280,11 @@ InternalNode::Pointer ModelPrivate::createNode(const TypeName &typeName, notifyNodeCreated(newInternalNodePointer); - if (!newInternalNodePointer->propertyNameList().isEmpty()) - notifyVariantPropertiesChanged(newInternalNodePointer, newInternalNodePointer->propertyNameList(), AbstractView::PropertiesAdded); + if (!newInternalNodePointer->propertyNameList().isEmpty()) { + notifyVariantPropertiesChanged(newInternalNodePointer, + newInternalNodePointer->propertyNameList(), + AbstractView::PropertiesAdded); + } return newInternalNodePointer; } @@ -279,7 +295,6 @@ void ModelPrivate::removeNodeFromModel(const InternalNodePointer &internalNodePo internalNodePointer->resetParentProperty(); - m_selectedInternalNodeList.removeAll(internalNodePointer); if (!internalNodePointer->id().isEmpty()) m_idNodeHash.remove(internalNodePointer->id()); @@ -295,7 +310,7 @@ const QList> ModelPrivate::enabledViews() const void ModelPrivate::removeAllSubNodes(const InternalNode::Pointer &internalNodePointer) { - foreach (const InternalNodePointer &subNode, internalNodePointer->allSubNodes()) { + for (const InternalNodePointer &subNode : internalNodePointer->allSubNodes()) { removeNodeFromModel(subNode); } } @@ -344,7 +359,7 @@ void ModelPrivate::setMetaInfo(const MetaInfo &metaInfo) m_metaInfo = metaInfo; } -void ModelPrivate::changeNodeId(const InternalNode::Pointer& internalNodePointer, const QString &id) +void ModelPrivate::changeNodeId(const InternalNode::Pointer &internalNodePointer, const QString &id) { const QString oldId = internalNodePointer->id(); @@ -359,7 +374,6 @@ void ModelPrivate::changeNodeId(const InternalNode::Pointer& internalNodePointer } catch (const RewritingException &e) { throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id.toUtf8(), e.description().toUtf8()); - } } @@ -376,495 +390,243 @@ void ModelPrivate::checkPropertyName(const PropertyName &propertyName) } } -void ModelPrivate::notifyAuxiliaryDataChanged(const InternalNodePointer &internalNode, const PropertyName &name, const QVariant &data) +template +void ModelPrivate::notifyNodeInstanceViewLast(Callable call) { bool resetModel = false; QString description; try { - if (rewriterView()) { - ModelNode node(internalNode, model(), rewriterView()); - rewriterView()->auxiliaryDataChanged(node, name, data); - } + if (rewriterView()) + call(rewriterView()); } catch (const RewritingException &e) { description = e.description(); resetModel = true; } - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - ModelNode node(internalNode, model(), view.data()); - view->auxiliaryDataChanged(node, name, data); - } + for (QPointer view : enabledViews()) + call(view.data()); - if (nodeInstanceView()) { - ModelNode node(internalNode, model(), nodeInstanceView()); - nodeInstanceView()->auxiliaryDataChanged(node, name, data); - } + if (nodeInstanceView()) + call(nodeInstanceView()); if (resetModel) resetModelByRewriter(description); } -void ModelPrivate::notifyNodeSourceChanged(const InternalNodePointer &internalNode, const QString &newNodeSource) +template +void ModelPrivate::notifyNormalViewsLast(Callable call) { bool resetModel = false; QString description; try { - if (rewriterView()) { - ModelNode node(internalNode, model(), rewriterView()); - rewriterView()->nodeSourceChanged(node, newNodeSource); - } + if (rewriterView()) + call(rewriterView()); } catch (const RewritingException &e) { description = e.description(); resetModel = true; } - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - ModelNode node(internalNode, model(), view.data()); - view->nodeSourceChanged(node, newNodeSource); - } + if (nodeInstanceView()) + call(nodeInstanceView()); - if (nodeInstanceView()) { - ModelNode node(internalNode, model(), nodeInstanceView()); - nodeInstanceView()->nodeSourceChanged(node, newNodeSource); - } + for (QPointer view : enabledViews()) + call(view.data()); if (resetModel) resetModelByRewriter(description); } +template +void ModelPrivate::notifyInstanceChanges(Callable call) +{ + for (QPointer view : enabledViews()) + call(view.data()); +} + +void ModelPrivate::notifyAuxiliaryDataChanged(const InternalNodePointer &internalNode, + const PropertyName &name, + const QVariant &data) +{ + notifyNodeInstanceViewLast([&](AbstractView *view) { + ModelNode node(internalNode, model(), view); + view->auxiliaryDataChanged(node, name, data); + }); +} + +void ModelPrivate::notifyNodeSourceChanged(const InternalNodePointer &internalNode, + const QString &newNodeSource) +{ + notifyNodeInstanceViewLast([&](AbstractView *view) { + ModelNode node(internalNode, model(), view); + view->nodeSourceChanged(node, newNodeSource); + }); +} + void ModelPrivate::notifyRootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) - rewriterView()->rootNodeTypeChanged(type, majorVersion, minorVersion); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - if (nodeInstanceView()) - nodeInstanceView()->rootNodeTypeChanged(type, majorVersion, minorVersion); - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->rootNodeTypeChanged(type, majorVersion, minorVersion); - } - - if (resetModel) - resetModelByRewriter(description); + notifyNodeInstanceViewLast( + [&](AbstractView *view) { view->rootNodeTypeChanged(type, majorVersion, minorVersion); }); } -void ModelPrivate::notifyInstancePropertyChange(const QList > &propertyPairList) +void ModelPrivate::notifyInstancePropertyChange(const QList> &propertyPairList) { - // no need to notify the rewriter or the instance view - - using ModelNodePropertyPair = QPair; - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - - QList > adaptedPropertyList; + notifyInstanceChanges([&](AbstractView *view) { + using ModelNodePropertyPair = QPair; + QList> adaptedPropertyList; for (const ModelNodePropertyPair &propertyPair : propertyPairList) { - ModelNodePropertyPair newPair(ModelNode(propertyPair.first.internalNode(), model(), view.data()), propertyPair.second); + ModelNodePropertyPair newPair{ModelNode{propertyPair.first.internalNode(), model(), view}, + propertyPair.second}; adaptedPropertyList.append(newPair); } - view->instancePropertyChanged(adaptedPropertyList); - } + }); } void ModelPrivate::notifyInstanceErrorChange(const QVector &instanceIds) { - // no need to notify the rewriter or the instance view - - QVector errorNodeList; - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); + notifyInstanceChanges([&](AbstractView *view) { + QVector errorNodeList; for (qint32 instanceId : instanceIds) errorNodeList.append(ModelNode(model()->d->nodeForInternalId(instanceId), model(), view)); view->instanceErrorChanged(errorNodeList); - } + }); } void ModelPrivate::notifyInstancesCompleted(const QVector &nodeVector) { - bool resetModel = false; - QString description; - QVector internalVector(toInternalNodeVector(nodeVector)); - try { - if (rewriterView()) - rewriterView()->instancesCompleted(toModelNodeVector(internalVector, rewriterView())); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->instancesCompleted(toModelNodeVector(internalVector, view.data())); - } - - if (nodeInstanceView()) - nodeInstanceView()->instancesCompleted(toModelNodeVector(internalVector, nodeInstanceView())); - - if (resetModel) - resetModelByRewriter(description); + notifyInstanceChanges([&](AbstractView *view) { + view->instancesCompleted(toModelNodeVector(internalVector, view)); + }); } -QMultiHash convertModelNodeInformationHash(const QMultiHash &informationChangeHash, AbstractView *view) +namespace { +QMultiHash convertModelNodeInformationHash( + const QMultiHash &informationChangeHash, AbstractView *view) { - QMultiHash convertedModelNodeInformationHash; + QMultiHash convertedModelNodeInformationHash; for (auto it = informationChangeHash.cbegin(), end = informationChangeHash.cend(); it != end; ++it) convertedModelNodeInformationHash.insert(ModelNode(it.key(), view), it.value()); return convertedModelNodeInformationHash; } +} // namespace -void ModelPrivate::notifyInstancesInformationsChange(const QMultiHash &informationChangeHash) +void ModelPrivate::notifyInstancesInformationsChange( + const QMultiHash &informationChangeHash) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) - rewriterView()->instanceInformationsChanged(convertModelNodeInformationHash(informationChangeHash, rewriterView())); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->instanceInformationsChanged(convertModelNodeInformationHash(informationChangeHash, view.data())); - } - - if (nodeInstanceView()) - nodeInstanceView()->instanceInformationsChanged(convertModelNodeInformationHash(informationChangeHash, nodeInstanceView())); - - if (resetModel) - resetModelByRewriter(description); + notifyInstanceChanges([&](AbstractView *view) { + view->instanceInformationsChanged(convertModelNodeInformationHash(informationChangeHash, view)); + }); } void ModelPrivate::notifyInstancesRenderImageChanged(const QVector &nodeVector) { - bool resetModel = false; - QString description; - QVector internalVector(toInternalNodeVector(nodeVector)); - try { - if (rewriterView()) - rewriterView()->instancesRenderImageChanged(toModelNodeVector(internalVector, rewriterView())); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->instancesRenderImageChanged(toModelNodeVector(internalVector, view.data())); - } - - if (nodeInstanceView()) - nodeInstanceView()->instancesRenderImageChanged(toModelNodeVector(internalVector, nodeInstanceView())); - - if (resetModel) - resetModelByRewriter(description); + notifyInstanceChanges([&](AbstractView *view) { + view->instancesRenderImageChanged(toModelNodeVector(internalVector, view)); + }); } void ModelPrivate::notifyInstancesPreviewImageChanged(const QVector &nodeVector) { - bool resetModel = false; - QString description; - QVector internalVector(toInternalNodeVector(nodeVector)); - try { - if (rewriterView()) - rewriterView()->instancesPreviewImageChanged(toModelNodeVector(internalVector, rewriterView())); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->instancesPreviewImageChanged(toModelNodeVector(internalVector, view.data())); - } - - if (nodeInstanceView()) - nodeInstanceView()->instancesPreviewImageChanged(toModelNodeVector(internalVector, nodeInstanceView())); - - if (resetModel) - resetModelByRewriter(description); + notifyInstanceChanges([&](AbstractView *view) { + view->instancesPreviewImageChanged(toModelNodeVector(internalVector, view)); + }); } void ModelPrivate::notifyInstancesChildrenChanged(const QVector &nodeVector) { - bool resetModel = false; - QString description; - QVector internalVector(toInternalNodeVector(nodeVector)); - try { - if (rewriterView()) - rewriterView()->instancesChildrenChanged(toModelNodeVector(internalVector, rewriterView())); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->instancesChildrenChanged(toModelNodeVector(internalVector, view.data())); - } - - if (nodeInstanceView()) - nodeInstanceView()->instancesChildrenChanged(toModelNodeVector(internalVector, nodeInstanceView())); - - if (resetModel) - resetModelByRewriter(description); + notifyInstanceChanges([&](AbstractView *view) { + view->instancesChildrenChanged(toModelNodeVector(internalVector, view)); + }); } void ModelPrivate::notifyCurrentStateChanged(const ModelNode &node) { - bool resetModel = false; - QString description; - - m_currentStateNode = node.internalNode(); - - try { - if (rewriterView()) - rewriterView()->currentStateChanged(ModelNode(node.internalNode(), model(), rewriterView())); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->currentStateChanged(ModelNode(node.internalNode(), model(), view.data())); - } - - if (nodeInstanceView()) - nodeInstanceView()->currentStateChanged(ModelNode(node.internalNode(), model(), nodeInstanceView())); - - if (resetModel) - resetModelByRewriter(description); + notifyNodeInstanceViewLast([&](AbstractView *view) { + view->currentStateChanged(ModelNode(node.internalNode(), model(), view)); + }); } void ModelPrivate::notifyCurrentTimelineChanged(const ModelNode &node) { - bool resetModel = false; - QString description; - - m_currentTimelineNode = node.internalNode(); - - try { - if (rewriterView()) - rewriterView()->currentTimelineChanged(ModelNode(node.internalNode(), model(), rewriterView())); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->currentTimelineChanged(ModelNode(node.internalNode(), model(), view.data())); - } - - if (nodeInstanceView()) - nodeInstanceView()->currentTimelineChanged(ModelNode(node.internalNode(), model(), nodeInstanceView())); - - if (resetModel) - resetModelByRewriter(description); + notifyNodeInstanceViewLast([&](AbstractView *view) { + view->currentTimelineChanged(ModelNode(node.internalNode(), model(), view)); + }); } void ModelPrivate::notifyRenderImage3DChanged(const QImage &image) { - for (const QPointer &view : qAsConst(m_viewList)) { - Q_ASSERT(view != nullptr); - view->renderImage3DChanged(image); - } + notifyInstanceChanges([&](AbstractView *view) { view->renderImage3DChanged(image); }); } void ModelPrivate::notifyUpdateActiveScene3D(const QVariantMap &sceneState) { - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->updateActiveScene3D(sceneState); - } + notifyInstanceChanges([&](AbstractView *view) { view->updateActiveScene3D(sceneState); }); } void ModelPrivate::notifyModelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap) { - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->modelNodePreviewPixmapChanged(node, pixmap); - } + notifyInstanceChanges( + [&](AbstractView *view) { view->modelNodePreviewPixmapChanged(node, pixmap); }); } void ModelPrivate::notifyRewriterBeginTransaction() { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) - rewriterView()->rewriterBeginTransaction(); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->rewriterBeginTransaction(); - } - - if (nodeInstanceView()) - nodeInstanceView()->rewriterBeginTransaction(); - - if (resetModel) - resetModelByRewriter(description); + notifyNodeInstanceViewLast([&](AbstractView *view) { view->rewriterBeginTransaction(); }); } void ModelPrivate::notifyRewriterEndTransaction() { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) - rewriterView()->rewriterEndTransaction(); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->rewriterEndTransaction(); - } - - if (nodeInstanceView()) - nodeInstanceView()->rewriterEndTransaction(); - - if (resetModel) - resetModelByRewriter(description); + notifyNodeInstanceViewLast([&](AbstractView *view) { view->rewriterEndTransaction(); }); } -void ModelPrivate::notifyInstanceToken(const QString &token, int number, const QVector &nodeVector) +void ModelPrivate::notifyInstanceToken(const QString &token, + int number, + const QVector &nodeVector) { - bool resetModel = false; - QString description; - QVector internalVector(toInternalNodeVector(nodeVector)); - - try { - if (rewriterView()) - rewriterView()->instancesToken(token, number, toModelNodeVector(internalVector, rewriterView())); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->instancesToken(token, number, toModelNodeVector(internalVector, view.data())); - } - - if (nodeInstanceView()) - nodeInstanceView()->instancesToken(token, number, toModelNodeVector(internalVector, nodeInstanceView())); - - if (resetModel) - resetModelByRewriter(description); + notifyInstanceChanges([&](AbstractView *view) { + view->instancesToken(token, number, toModelNodeVector(internalVector, view)); + }); } -void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList &nodeList, const QList &data) +void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, + const QString &identifier, + const QList &nodeList, + const QList &data) { - bool resetModel = false; - QString description; - QList internalList(toInternalNodeList(nodeList)); - - try { - if (rewriterView()) - rewriterView()->customNotification(senderView, identifier, toModelNodeList(internalList, rewriterView()), data); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - view->customNotification(senderView, identifier, toModelNodeList(internalList, view.data()), data); - } - - if (nodeInstanceView()) - nodeInstanceView()->customNotification(senderView, identifier, toModelNodeList(internalList, nodeInstanceView()), data); - - if (resetModel) - resetModelByRewriter(description); + notifyNodeInstanceViewLast([&](AbstractView *view) { + view->customNotification(senderView, identifier, toModelNodeList(internalList, view), data); + }); } - void ModelPrivate::notifyPropertiesRemoved(const QList &propertyPairList) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - QList propertyList; - foreach (const PropertyPair &propertyPair, propertyPairList) { - AbstractProperty newProperty(propertyPair.second, propertyPair.first, model(), rewriterView()); - propertyList.append(newProperty); - } - - rewriterView()->propertiesRemoved(propertyList); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - if (nodeInstanceView()) { + notifyNormalViewsLast([&](AbstractView *view) { QList propertyList; - foreach (const PropertyPair &propertyPair, propertyPairList) { - AbstractProperty newProperty(propertyPair.second, propertyPair.first, model(), nodeInstanceView()); + propertyList.reserve(propertyPairList.size()); + for (const PropertyPair &propertyPair : propertyPairList) { + AbstractProperty newProperty(propertyPair.second, propertyPair.first, model(), view); propertyList.append(newProperty); } - - nodeInstanceView()->propertiesRemoved(propertyList); - } - - for (const QPointer &view : enabledViews()) { - QList propertyList; - Q_ASSERT(view != nullptr); - foreach (const PropertyPair &propertyPair, propertyPairList) { - AbstractProperty newProperty(propertyPair.second, propertyPair.first, model(), view.data()); - propertyList.append(newProperty); - } - - view->propertiesRemoved(propertyList); - } - - if (resetModel) - resetModelByRewriter(description); + }); } -void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QList &internalPropertyList) +void ModelPrivate::notifyPropertiesAboutToBeRemoved( + const QList &internalPropertyList) { bool resetModel = false; QString description; @@ -872,7 +634,7 @@ void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QList propertyList; - foreach (const InternalProperty::Pointer &property, internalPropertyList) { + for (const InternalProperty::Pointer &property : internalPropertyList) { AbstractProperty newProperty(property->name(), property->propertyOwner(), model(), rewriterView()); propertyList.append(newProperty); } @@ -887,7 +649,7 @@ void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QList &view : enabledViews()) { QList propertyList; Q_ASSERT(view != nullptr); - foreach (const InternalProperty::Pointer &property, internalPropertyList) { + for (const InternalProperty::Pointer &property : internalPropertyList) { AbstractProperty newProperty(property->name(), property->propertyOwner(), model(), view.data()); propertyList.append(newProperty); } @@ -901,7 +663,7 @@ void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QList propertyList; - foreach (const InternalProperty::Pointer &property, internalPropertyList) { + for (const InternalProperty::Pointer &property : internalPropertyList) { AbstractProperty newProperty(property->name(), property->propertyOwner(), model(), nodeInstanceView()); propertyList.append(newProperty); } @@ -913,7 +675,9 @@ void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QListauxiliaryData(name) == data) return; @@ -923,7 +687,7 @@ void ModelPrivate::setAuxiliaryData(const InternalNode::Pointer& node, const Pro else node->removeAuxiliaryData(name); - notifyAuxiliaryDataChanged(node, name,data); + notifyAuxiliaryDataChanged(node, name, data); } void ModelPrivate::resetModelByRewriter(const QString &description) @@ -931,90 +695,45 @@ void ModelPrivate::resetModelByRewriter(const QString &description) if (rewriterView()) rewriterView()->resetToLastCorrectQml(); - throw RewritingException(__LINE__, __FUNCTION__, __FILE__, description.toUtf8(), rewriterView()->textModifierContent()); + throw RewritingException(__LINE__, + __FUNCTION__, + __FILE__, + description.toUtf8(), + rewriterView()->textModifierContent()); } - void ModelPrivate::attachView(AbstractView *view) { Q_ASSERT(view); if (m_viewList.contains(view)) - return; + return; m_viewList.append(view); - view->modelAttached(m_q); + view->modelAttached(m_model); } void ModelPrivate::detachView(AbstractView *view, bool notifyView) { if (notifyView) - view->modelAboutToBeDetached(m_q); + view->modelAboutToBeDetached(m_model); m_viewList.removeOne(view); updateEnabledViews(); } void ModelPrivate::notifyNodeCreated(const InternalNode::Pointer &newInternalNodePointer) { - Q_ASSERT(newInternalNodePointer->isValid()); - - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - ModelNode createdNode(newInternalNodePointer, model(), rewriterView()); - rewriterView()->nodeCreated(createdNode); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - if (nodeInstanceView()) { - ModelNode createdNode(newInternalNodePointer, model(), nodeInstanceView()); - nodeInstanceView()->nodeCreated(createdNode); - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - ModelNode createdNode(newInternalNodePointer, model(), view.data()); - view->nodeCreated(createdNode); - } - - if (resetModel) - resetModelByRewriter(description); + notifyNormalViewsLast([&](AbstractView *view) { + view->nodeCreated(ModelNode{newInternalNodePointer, model(), view}); + }); } void ModelPrivate::notifyNodeAboutToBeRemoved(const InternalNode::Pointer &internalNodePointer) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - ModelNode modelNode(internalNodePointer, model(), rewriterView()); - rewriterView()->nodeAboutToBeRemoved(modelNode); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - ModelNode modelNode(internalNodePointer, model(), view.data()); - view->nodeAboutToBeRemoved(modelNode); - } - - if (nodeInstanceView()) { - ModelNode modelNode(internalNodePointer, model(), nodeInstanceView()); - nodeInstanceView()->nodeAboutToBeRemoved(modelNode); - } - - if (resetModel) - resetModelByRewriter(description); + notifyNodeInstanceViewLast([&](AbstractView *view) { + view->nodeAboutToBeRemoved(ModelNode{internalNodePointer, model(), view}); + }); } void ModelPrivate::notifyNodeRemoved(const InternalNodePointer &internalNodePointer, @@ -1022,259 +741,89 @@ void ModelPrivate::notifyNodeRemoved(const InternalNodePointer &internalNodePoin const PropertyName &parentPropertyName, AbstractView::PropertyChangeFlags propertyChange) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - ModelNode modelNode(internalNodePointer, model(), rewriterView()); - NodeAbstractProperty parentProperty(parentPropertyName, parentNodePointer, model(), rewriterView()); - rewriterView()->nodeRemoved(modelNode, parentProperty, propertyChange); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - if (nodeInstanceView()) { - ModelNode modelNode(internalNodePointer, model(), nodeInstanceView()); - NodeAbstractProperty parentProperty(parentPropertyName, parentNodePointer, model(), nodeInstanceView()); - nodeInstanceView()->nodeRemoved(modelNode, parentProperty, propertyChange); - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - ModelNode modelNode(internalNodePointer, model(), view.data()); - NodeAbstractProperty parentProperty(parentPropertyName, parentNodePointer, model(), view.data()); - view->nodeRemoved(modelNode, parentProperty, propertyChange); - } - - if (resetModel) - resetModelByRewriter(description); + notifyNormalViewsLast([&](AbstractView *view) { + view->nodeRemoved(ModelNode{internalNodePointer, model(), view}, + NodeAbstractProperty{parentPropertyName, parentNodePointer, model(), view}, + propertyChange); + }); } -void ModelPrivate::notifyNodeTypeChanged(const InternalNodePointer &internalNodePointer, const TypeName &type, int majorVersion, int minorVersion) +void ModelPrivate::notifyNodeTypeChanged(const InternalNodePointer &internalNodePointer, + const TypeName &type, + int majorVersion, + int minorVersion) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - ModelNode modelNode(internalNodePointer, model(), rewriterView()); - rewriterView()->nodeTypeChanged(modelNode, type, majorVersion, minorVersion); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - ModelNode modelNode(internalNodePointer, model(), view.data()); - view->nodeTypeChanged(modelNode, type, majorVersion, minorVersion); - } - - if (nodeInstanceView()) { - ModelNode modelNode(internalNodePointer, model(), nodeInstanceView()); - nodeInstanceView()->nodeTypeChanged(modelNode, type, majorVersion, minorVersion); - } - - if (resetModel) - resetModelByRewriter(description); - + notifyNodeInstanceViewLast([&](AbstractView *view) { + view->nodeTypeChanged(ModelNode{internalNodePointer, model(), view}, + type, + majorVersion, + minorVersion); + }); } -void ModelPrivate::notifyNodeIdChanged(const InternalNode::Pointer& internalNodePointer, const QString& newId, const QString& oldId) +void ModelPrivate::notifyNodeIdChanged(const InternalNode::Pointer &internalNodePointer, + const QString &newId, + const QString &oldId) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - ModelNode modelNode(internalNodePointer, model(), rewriterView()); - rewriterView()->nodeIdChanged(modelNode, newId, oldId); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - ModelNode modelNode(internalNodePointer, model(), view.data()); - view->nodeIdChanged(modelNode, newId, oldId); - } - - if (nodeInstanceView()) { - ModelNode modelNode(internalNodePointer, model(), nodeInstanceView()); - nodeInstanceView()->nodeIdChanged(modelNode, newId, oldId); - } - - if (resetModel) - resetModelByRewriter(description); + notifyNodeInstanceViewLast([&](AbstractView *view) { + view->nodeIdChanged(ModelNode{internalNodePointer, model(), view}, newId, oldId); + }); } -void ModelPrivate::notifyBindingPropertiesChanged(const QList &internalPropertyList, - AbstractView::PropertyChangeFlags propertyChange) +void ModelPrivate::notifyBindingPropertiesChanged( + const QList &internalPropertyList, + AbstractView::PropertyChangeFlags propertyChange) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - QList propertyList; - foreach (const InternalBindingPropertyPointer &bindingProperty, internalPropertyList) { - propertyList.append(BindingProperty(bindingProperty->name(), bindingProperty->propertyOwner(), model(), rewriterView())); - } - rewriterView()->bindingPropertiesChanged(propertyList, propertyChange); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); + notifyNodeInstanceViewLast([&](AbstractView *view) { QList propertyList; - foreach (const InternalBindingPropertyPointer &bindingProperty, internalPropertyList) { - propertyList.append(BindingProperty(bindingProperty->name(), bindingProperty->propertyOwner(), model(), view.data())); + for (const InternalBindingPropertyPointer &bindingProperty : internalPropertyList) { + propertyList.append(BindingProperty(bindingProperty->name(), + bindingProperty->propertyOwner(), + model(), + view)); } view->bindingPropertiesChanged(propertyList, propertyChange); - } - - if (nodeInstanceView()) { - QList propertyList; - foreach (const InternalBindingPropertyPointer &bindingProperty, internalPropertyList) { - propertyList.append(BindingProperty(bindingProperty->name(), bindingProperty->propertyOwner(), model(), nodeInstanceView())); - } - nodeInstanceView()->bindingPropertiesChanged(propertyList, propertyChange); - } - - if (resetModel) - resetModelByRewriter(description); + }); } -void ModelPrivate::notifySignalHandlerPropertiesChanged(const QVector &internalPropertyList, - AbstractView::PropertyChangeFlags propertyChange) +void ModelPrivate::notifySignalHandlerPropertiesChanged( + const QVector &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 (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); + notifyNodeInstanceViewLast([&](AbstractView *view) { QVector propertyList; - foreach (const InternalSignalHandlerPropertyPointer &signalHandlerProperty, internalPropertyList) { - propertyList.append(SignalHandlerProperty(signalHandlerProperty->name(), signalHandlerProperty->propertyOwner(), model(), view.data())); + for (const InternalSignalHandlerPropertyPointer &signalHandlerProperty : internalPropertyList) { + propertyList.append(SignalHandlerProperty(signalHandlerProperty->name(), + signalHandlerProperty->propertyOwner(), + model(), + view)); } 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) +void ModelPrivate::notifyScriptFunctionsChanged(const InternalNodePointer &internalNodePointer, + const QStringList &scriptFunctionList) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - ModelNode node(internalNodePointer, model(), rewriterView()); - rewriterView()->scriptFunctionsChanged(node, scriptFunctionList); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - if (nodeInstanceView()) { - ModelNode node(internalNodePointer, model(), nodeInstanceView()); - nodeInstanceView()->scriptFunctionsChanged(node, scriptFunctionList); - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(view != nullptr); - - ModelNode node(internalNodePointer, model(), view.data()); - view->scriptFunctionsChanged(node, scriptFunctionList); - } - - if (resetModel) - resetModelByRewriter(description); + notifyNormalViewsLast([&](AbstractView *view) { + view->scriptFunctionsChanged(ModelNode{internalNodePointer, model(), view}, + scriptFunctionList); + }); } - void ModelPrivate::notifyVariantPropertiesChanged(const InternalNodePointer &internalNodePointer, const PropertyNameList &propertyNameList, AbstractView::PropertyChangeFlags propertyChange) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - QList propertyList; - foreach (const PropertyName &propertyName, propertyNameList) { - VariantProperty property(propertyName, internalNodePointer, model(), rewriterView()); - propertyList.append(property); - } - - ModelNode node(internalNodePointer, model(), rewriterView()); - rewriterView()->variantPropertiesChanged(propertyList, propertyChange); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { + notifyNodeInstanceViewLast([&](AbstractView *view) { QList propertyList; - Q_ASSERT(view != nullptr); - foreach (const PropertyName &propertyName, propertyNameList) { - VariantProperty property(propertyName, internalNodePointer, model(), view.data()); + for (const PropertyName &propertyName : propertyNameList) { + VariantProperty property(propertyName, internalNodePointer, model(), view); propertyList.append(property); } view->variantPropertiesChanged(propertyList, propertyChange); - } - - if (nodeInstanceView()) { - QList propertyList; - foreach (const PropertyName &propertyName, propertyNameList) { - Q_ASSERT(internalNodePointer->hasProperty(propertyName)); - Q_ASSERT(internalNodePointer->property(propertyName)->isVariantProperty()); - VariantProperty property(propertyName, internalNodePointer, model(), nodeInstanceView()); - propertyList.append(property); - } - - ModelNode node(internalNodePointer, model(), nodeInstanceView()); - nodeInstanceView()->variantPropertiesChanged(propertyList, propertyChange); - } - - if (resetModel) - resetModelByRewriter(description); + }); } void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &internalNodePointer, @@ -1283,156 +832,58 @@ void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &intern const PropertyName &oldPropertyName, AbstractView::PropertyChangeFlags propertyChange) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - NodeAbstractProperty newProperty; - NodeAbstractProperty oldProperty; - - if (!oldPropertyName.isEmpty() && oldParent->isValid()) - oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), rewriterView()); - - if (!newPropertyParent.isNull()) - newProperty = NodeAbstractProperty(newPropertyParent, model(), rewriterView()); - ModelNode modelNode(internalNodePointer, model(), rewriterView()); - rewriterView()->nodeAboutToBeReparented(modelNode, newProperty, oldProperty, propertyChange); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { + notifyNodeInstanceViewLast([&](AbstractView *view) { NodeAbstractProperty newProperty; NodeAbstractProperty oldProperty; - Q_ASSERT(!view.isNull()); if (!oldPropertyName.isEmpty() && oldParent->isValid()) - oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), view.data()); + oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), view); if (!newPropertyParent.isNull()) - newProperty = NodeAbstractProperty(newPropertyParent, model(), view.data()); - ModelNode modelNode(internalNodePointer, model(), view.data()); + newProperty = NodeAbstractProperty(newPropertyParent, model(), view); + + ModelNode modelNode(internalNodePointer, model(), view); view->nodeAboutToBeReparented(modelNode, newProperty, oldProperty, propertyChange); - } - - if (nodeInstanceView()) { - NodeAbstractProperty newProperty; - NodeAbstractProperty oldProperty; - - if (!oldPropertyName.isEmpty() && oldParent->isValid()) - oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), nodeInstanceView()); - - if (!newPropertyParent.isNull()) - newProperty = NodeAbstractProperty(newPropertyParent, model(), nodeInstanceView()); - ModelNode modelNode(internalNodePointer, model(), nodeInstanceView()); - nodeInstanceView()->nodeAboutToBeReparented(modelNode, newProperty, oldProperty, propertyChange); - } - - if (resetModel) - resetModelByRewriter(description); + }); } - void ModelPrivate::notifyNodeReparent(const InternalNode::Pointer &internalNodePointer, const InternalNodeAbstractProperty::Pointer &newPropertyParent, const InternalNodePointer &oldParent, const PropertyName &oldPropertyName, AbstractView::PropertyChangeFlags propertyChange) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) { - NodeAbstractProperty newProperty; - NodeAbstractProperty oldProperty; - - if (!oldPropertyName.isEmpty() && oldParent->isValid()) - oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), rewriterView()); - - if (!newPropertyParent.isNull()) - newProperty = NodeAbstractProperty(newPropertyParent, model(), rewriterView()); - ModelNode node(internalNodePointer, model(), rewriterView()); - rewriterView()->nodeReparented(node, newProperty, oldProperty, propertyChange); - } - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { + notifyNodeInstanceViewLast([&](AbstractView *view) { NodeAbstractProperty newProperty; NodeAbstractProperty oldProperty; - Q_ASSERT(!view.isNull()); if (!oldPropertyName.isEmpty() && oldParent->isValid()) - oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), view.data()); + oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), view); if (!newPropertyParent.isNull()) - newProperty = NodeAbstractProperty(newPropertyParent, model(), view.data()); - ModelNode modelNode(internalNodePointer, model(), view.data()); + newProperty = NodeAbstractProperty(newPropertyParent, model(), view); + ModelNode modelNode(internalNodePointer, model(), view); view->nodeReparented(modelNode, newProperty, oldProperty, propertyChange); - } - - if (nodeInstanceView()) { - NodeAbstractProperty newProperty; - NodeAbstractProperty oldProperty; - - if (!oldPropertyName.isEmpty() && oldParent->isValid()) - oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), nodeInstanceView()); - - if (!newPropertyParent.isNull()) - newProperty = NodeAbstractProperty(newPropertyParent, model(), nodeInstanceView()); - ModelNode modelNode(internalNodePointer, model(), nodeInstanceView()); - nodeInstanceView()->nodeReparented(modelNode, newProperty, oldProperty, propertyChange); - } - - if (resetModel) - resetModelByRewriter(description); + }); } void ModelPrivate::notifyNodeOrderChanged(const InternalNodeListPropertyPointer &internalListPropertyPointer, const InternalNode::Pointer &internalNodePointer, int oldIndex) { - bool resetModel = false; - QString description; - - try { - if (rewriterView()) - rewriterView()->nodeOrderChanged(NodeListProperty(internalListPropertyPointer, model(), rewriterView()), - ModelNode(internalNodePointer, model(), rewriterView()), + notifyNodeInstanceViewLast([&](AbstractView *view) { + view->nodeOrderChanged(NodeListProperty(internalListPropertyPointer, model(), view), + ModelNode(internalNodePointer, model(), view), oldIndex); - } catch (const RewritingException &e) { - description = e.description(); - resetModel = true; - } - - for (const QPointer &view : enabledViews()) { - Q_ASSERT(!view.isNull()); - view->nodeOrderChanged(NodeListProperty(internalListPropertyPointer, model(), view.data()), - ModelNode(internalNodePointer, model(), view.data()), - oldIndex); - } - - if (nodeInstanceView()) - nodeInstanceView()->nodeOrderChanged(NodeListProperty(internalListPropertyPointer, model(), nodeInstanceView()), - ModelNode(internalNodePointer, model(), nodeInstanceView()), - oldIndex); - - if (resetModel) - resetModelByRewriter(description); + }); } void ModelPrivate::setSelectedNodes(const QList &selectedNodeList) { - QList sortedSelectedList - = Utils::filtered(selectedNodeList, &InternalNode::isValid); + QList sortedSelectedList = Utils::filtered(selectedNodeList, + &InternalNode::isValid); sortedSelectedList = Utils::toList(Utils::toSet(sortedSelectedList)); Utils::sort(sortedSelectedList); @@ -1440,14 +891,12 @@ void ModelPrivate::setSelectedNodes(const QList &selected if (sortedSelectedList == m_selectedInternalNodeList) return; - const QList lastSelectedNodeList = m_selectedInternalNodeList; m_selectedInternalNodeList = sortedSelectedList; changeSelectedNodes(sortedSelectedList, lastSelectedNodeList); } - void ModelPrivate::clearSelectedNodes() { const QList lastSelectedNodeList = m_selectedInternalNodeList; @@ -1462,37 +911,41 @@ void ModelPrivate::removeAuxiliaryData(const InternalNodePointer &node, const Pr notifyAuxiliaryDataChanged(node, name, QVariant()); } -QList ModelPrivate::toModelNodeList(const QList &internalNodeList, AbstractView *view) const +QList ModelPrivate::toModelNodeList(const QList &internalNodeList, + AbstractView *view) const { QList newNodeList; - foreach (const Internal::InternalNode::Pointer &node, internalNodeList) + for (const Internal::InternalNode::Pointer &node : internalNodeList) newNodeList.append(ModelNode(node, model(), view)); return newNodeList; } -QVector ModelPrivate::toModelNodeVector(const QVector &internalNodeVector, AbstractView *view) const +QVector ModelPrivate::toModelNodeVector( + const QVector &internalNodeVector, AbstractView *view) const { QVector newNodeVector; - foreach (const Internal::InternalNode::Pointer &node, internalNodeVector) + for (const Internal::InternalNode::Pointer &node : internalNodeVector) newNodeVector.append(ModelNode(node, model(), view)); return newNodeVector; } -QList ModelPrivate::toInternalNodeList(const QList &internalNodeList) const +QList ModelPrivate::toInternalNodeList( + const QList &internalNodeList) const { QList newNodeList; - foreach (const ModelNode &node, internalNodeList) + for (const ModelNode &node : internalNodeList) newNodeList.append(node.internalNode()); return newNodeList; } -QVector ModelPrivate::toInternalNodeVector(const QVector &internalNodeVector) const +QVector ModelPrivate::toInternalNodeVector( + const QVector &internalNodeVector) const { QVector newNodeVector; - foreach (const ModelNode &node, internalNodeVector) + for (const ModelNode &node : internalNodeVector) newNodeVector.append(node.internalNode()); return newNodeVector; @@ -1503,17 +956,20 @@ void ModelPrivate::changeSelectedNodes(const QList &newSe { for (const QPointer &view : enabledViews()) { Q_ASSERT(view != nullptr); - view->selectedNodesChanged(toModelNodeList(newSelectedNodeList, view.data()), toModelNodeList(oldSelectedNodeList, view.data())); + view->selectedNodesChanged(toModelNodeList(newSelectedNodeList, view.data()), + toModelNodeList(oldSelectedNodeList, view.data())); } if (nodeInstanceView()) - nodeInstanceView()->selectedNodesChanged(toModelNodeList(newSelectedNodeList, nodeInstanceView()), - toModelNodeList(oldSelectedNodeList, nodeInstanceView())); + nodeInstanceView()->selectedNodesChanged(toModelNodeList(newSelectedNodeList, + nodeInstanceView()), + toModelNodeList(oldSelectedNodeList, + nodeInstanceView())); } QList ModelPrivate::selectedNodes() const { - foreach (const InternalNode::Pointer &node, m_selectedInternalNodeList) { + for (const InternalNode::Pointer &node : m_selectedInternalNodeList) { if (!node->isValid()) throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } @@ -1545,7 +1001,8 @@ void ModelPrivate::deselectNode(const InternalNode::Pointer &internalNodePointer void ModelPrivate::removePropertyWithoutNotification(const InternalPropertyPointer &property) { if (property->isNodeAbstractProperty()) { - foreach (const InternalNode::Pointer & internalNode, property->toNodeAbstractProperty()->allSubNodes()) + auto &&allSubNodes = property->toNodeAbstractProperty()->allSubNodes(); + for (const InternalNode::Pointer &internalNode : allSubNodes) removeNodeFromModel(internalNode); } @@ -1556,11 +1013,10 @@ static QList toPropertyPairList(const QList propertyPairList; - foreach (const InternalProperty::Pointer &property, propertyList) + for (const InternalProperty::Pointer &property : propertyList) propertyPairList.append({property->propertyOwner(), property->name()}); return propertyPairList; - } void ModelPrivate::removeProperty(const InternalProperty::Pointer &property) @@ -1574,7 +1030,9 @@ void ModelPrivate::removeProperty(const InternalProperty::Pointer &property) notifyPropertiesRemoved(propertyPairList); } -void ModelPrivate::setBindingProperty(const InternalNode::Pointer &internalNodePointer, const PropertyName &name, const QString &expression) +void ModelPrivate::setBindingProperty(const InternalNode::Pointer &internalNodePointer, + const PropertyName &name, + const QString &expression) { AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; if (!internalNodePointer->hasProperty(name)) { @@ -1587,7 +1045,9 @@ void ModelPrivate::setBindingProperty(const InternalNode::Pointer &internalNodeP notifyBindingPropertiesChanged({bindingProperty}, propertyChange); } -void ModelPrivate::setSignalHandlerProperty(const InternalNodePointer &internalNodePointer, const PropertyName &name, const QString &source) +void ModelPrivate::setSignalHandlerProperty(const InternalNodePointer &internalNodePointer, + const PropertyName &name, + const QString &source) { AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; if (!internalNodePointer->hasProperty(name)) { @@ -1595,12 +1055,15 @@ void ModelPrivate::setSignalHandlerProperty(const InternalNodePointer &internalN propertyChange = AbstractView::PropertiesAdded; } - InternalSignalHandlerProperty::Pointer signalHandlerProperty = internalNodePointer->signalHandlerProperty(name); + InternalSignalHandlerProperty::Pointer signalHandlerProperty = internalNodePointer + ->signalHandlerProperty(name); signalHandlerProperty->setSource(source); notifySignalHandlerPropertiesChanged({signalHandlerProperty}, propertyChange); } -void ModelPrivate::setVariantProperty(const InternalNode::Pointer &internalNodePointer, const PropertyName &name, const QVariant &value) +void ModelPrivate::setVariantProperty(const InternalNode::Pointer &internalNodePointer, + const PropertyName &name, + const QVariant &value) { AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; if (!internalNodePointer->hasProperty(name)) { @@ -1670,24 +1133,30 @@ void ModelPrivate::reparentNode(const InternalNode::Pointer &newParentNode, InternalNodeAbstractProperty::Pointer newParentProperty(newParentNode->nodeAbstractProperty(name)); Q_ASSERT(!newParentProperty.isNull()); - notifyNodeAboutToBeReparent(internalNodePointer, newParentProperty, oldParentNode, oldParentPropertyName, propertyChange); + notifyNodeAboutToBeReparent(internalNodePointer, + newParentProperty, + oldParentNode, + oldParentPropertyName, + propertyChange); if (newParentProperty) internalNodePointer->setParentProperty(newParentProperty); - if (oldParentProperty && oldParentProperty->isValid() && oldParentProperty->isEmpty()) { removePropertyWithoutNotification(oldParentProperty); propertyChange |= AbstractView::EmptyPropertiesRemoved; } - notifyNodeReparent(internalNodePointer, newParentProperty, oldParentNode, oldParentPropertyName, propertyChange); + notifyNodeReparent(internalNodePointer, + newParentProperty, + oldParentNode, + oldParentPropertyName, + propertyChange); } void ModelPrivate::clearParent(const InternalNodePointer &internalNodePointer) { - InternalNodeAbstractProperty::Pointer oldParentProperty(internalNodePointer->parentProperty()); InternalNode::Pointer oldParentNode; PropertyName oldParentPropertyName; @@ -1697,7 +1166,11 @@ void ModelPrivate::clearParent(const InternalNodePointer &internalNodePointer) } internalNodePointer->resetParentProperty(); - notifyNodeReparent(internalNodePointer, InternalNodeAbstractProperty::Pointer(), oldParentNode, oldParentPropertyName, AbstractView::NoAdditionalChanges); + notifyNodeReparent(internalNodePointer, + InternalNodeAbstractProperty::Pointer(), + oldParentNode, + oldParentPropertyName, + AbstractView::NoAdditionalChanges); } void ModelPrivate::changeRootNodeType(const TypeName &type, int majorVersion, int minorVersion) @@ -1709,20 +1182,25 @@ void ModelPrivate::changeRootNodeType(const TypeName &type, int majorVersion, in notifyRootNodeTypeChanged(QString::fromUtf8(type), majorVersion, minorVersion); } -void ModelPrivate::setScriptFunctions(const InternalNode::Pointer &internalNodePointer, const QStringList &scriptFunctionList) +void ModelPrivate::setScriptFunctions(const InternalNode::Pointer &internalNodePointer, + const QStringList &scriptFunctionList) { internalNodePointer->setScriptFunctions(scriptFunctionList); notifyScriptFunctionsChanged(internalNodePointer, scriptFunctionList); } -void ModelPrivate::setNodeSource(const InternalNodePointer &internalNodePointer, const QString &nodeSource) +void ModelPrivate::setNodeSource(const InternalNodePointer &internalNodePointer, + const QString &nodeSource) { internalNodePointer->setNodeSource(nodeSource); notifyNodeSourceChanged(internalNodePointer, nodeSource); } -void ModelPrivate::changeNodeOrder(const InternalNode::Pointer &internalParentNode, const PropertyName &listPropertyName, int from, int to) +void ModelPrivate::changeNodeOrder(const InternalNode::Pointer &internalParentNode, + const PropertyName &listPropertyName, + int from, + int to) { InternalNodeListProperty::Pointer nodeList(internalParentNode->nodeListProperty(listPropertyName)); Q_ASSERT(!nodeList.isNull()); @@ -1732,7 +1210,7 @@ void ModelPrivate::changeNodeOrder(const InternalNode::Pointer &internalParentNo notifyNodeOrderChanged(nodeList, internalNode, from); } -void ModelPrivate::setRewriterView(RewriterView *rewriterView) +void ModelPrivate::setRewriterView(RewriterView *rewriterView) { if (rewriterView == m_rewriterView.data()) return; @@ -1740,7 +1218,7 @@ void ModelPrivate::setRewriterView(RewriterView *rewriterView) Q_ASSERT(!(rewriterView && m_rewriterView)); if (m_rewriterView) - m_rewriterView->modelAboutToBeDetached(model()); + m_rewriterView->modelAboutToBeDetached(model()); m_rewriterView = rewriterView; @@ -1748,7 +1226,7 @@ void ModelPrivate::setRewriterView(RewriterView *rewriterView) rewriterView->modelAttached(model()); } -RewriterView *ModelPrivate::rewriterView() const +RewriterView *ModelPrivate::rewriterView() const { return m_rewriterView.data(); } @@ -1759,13 +1237,12 @@ void ModelPrivate::setNodeInstanceView(NodeInstanceView *nodeInstanceView) return; if (m_nodeInstanceView) - m_nodeInstanceView->modelAboutToBeDetached(m_q); + m_nodeInstanceView->modelAboutToBeDetached(m_model); m_nodeInstanceView = nodeInstanceView; if (nodeInstanceView) - nodeInstanceView->modelAttached(m_q); - + nodeInstanceView->modelAttached(m_model); } NodeInstanceView *ModelPrivate::nodeInstanceView() const @@ -1832,7 +1309,6 @@ InternalNode::Pointer ModelPrivate::currentStateNode() const return m_currentStateNode; } - WriteLocker::WriteLocker(ModelPrivate *model) : m_model(model) { @@ -1840,7 +1316,7 @@ WriteLocker::WriteLocker(ModelPrivate *model) if (m_model->m_writeLock) qWarning() << "QmlDesigner: Misbehaving view calls back to model!!!"; // FIXME: Enable it again - Q_ASSERT(!m_model->m_writeLock); + Q_ASSERT(!m_model->m_writeLock); model->m_writeLock = true; } @@ -1851,7 +1327,7 @@ WriteLocker::WriteLocker(Model *model) if (m_model->m_writeLock) qWarning() << "QmlDesigner: Misbehaving view calls back to model!!!"; // FIXME: Enable it again - Q_ASSERT(!m_model->m_writeLock); + Q_ASSERT(!m_model->m_writeLock); m_model->m_writeLock = true; } @@ -1860,47 +1336,44 @@ WriteLocker::~WriteLocker() if (!m_model->m_writeLock) qWarning() << "QmlDesigner: Misbehaving view calls back to model!!!"; // FIXME: Enable it again - Q_ASSERT(m_model->m_writeLock); + Q_ASSERT(m_model->m_writeLock); m_model->m_writeLock = false; } -} //namespace internal - - -Model::Model() : - QObject(), - d(new Internal::ModelPrivate(this)) -{ -} +} // namespace Internal +Model::Model() + : QObject() + , d(new Internal::ModelPrivate(this)) +{} Model::~Model() { delete d; } - Model *Model::create(TypeName type, int major, int minor, Model *metaInfoPropxyModel) { return Internal::ModelPrivate::create(type, major, minor, metaInfoPropxyModel); } -QList Model::imports() const +const QList &Model::imports() const { return d->imports(); } -QList Model::possibleImports() const +const QList &Model::possibleImports() const { return d->m_possibleImportList; } -QList Model::usedImports() const +const QList &Model::usedImports() const { return d->m_usedImportList; } -void Model::changeImports(const QList &importsToBeAdded, const QList &importsToBeRemoved) +void Model::changeImports(const QList &importsToBeAdded, + const QList &importsToBeRemoved) { d->changeImports(importsToBeAdded, importsToBeRemoved); } @@ -1957,12 +1430,13 @@ bool Model::hasImport(const Import &import, bool ignoreAlias, bool allowHigherVe if (!ignoreAlias) return false; - foreach (const Import &existingImport, imports()) { + for (const Import &existingImport : imports()) { if (existingImport.isFileImport() && import.isFileImport()) if (existingImport.file() == import.file()) return true; if (existingImport.isLibraryImport() && import.isLibraryImport()) - if (existingImport.url() == import.url() && compareVersions(existingImport.version(), import.version(), allowHigherVersion)) + if (existingImport.url() == import.url() + && compareVersions(existingImport.version(), import.version(), allowHigherVersion)) return true; } return false; @@ -1982,7 +1456,8 @@ bool Model::isImportPossible(const Import &import, bool ignoreAlias, bool allowH if (possibleImport.file() == import.file()) return true; if (possibleImport.isLibraryImport() && import.isLibraryImport()) - if (possibleImport.url() == import.url() && compareVersions(possibleImport.version(), import.version(), allowHigherVersion)) + if (possibleImport.url() == import.url() + && compareVersions(possibleImport.version(), import.version(), allowHigherVersion)) return true; } return false; @@ -2067,7 +1542,8 @@ void Model::setTextModifier(TextModifier *textModifier) d->m_textModifier = textModifier; } -void Model::setDocumentMessages(const QList &errors, const QList &warnings) +void Model::setDocumentMessages(const QList &errors, + const QList &warnings) { d->setDocumentMessages(errors, warnings); } @@ -2134,7 +1610,6 @@ MetaInfo Model::metaInfo() here you can find a facade to the internal undo redo framework */ - /*! \name View related functions */ //\{ @@ -2151,8 +1626,8 @@ The view is informed that it has been registered within the model by a call to A */ void Model::attachView(AbstractView *view) { -// Internal::WriteLocker locker(d); - auto castedRewriterView = qobject_cast(view); + // Internal::WriteLocker locker(d); + auto castedRewriterView = qobject_cast(view); if (castedRewriterView) { if (rewriterView() == castedRewriterView) return; @@ -2161,7 +1636,7 @@ void Model::attachView(AbstractView *view) return; } - auto nodeInstanceView = qobject_cast(view); + auto nodeInstanceView = qobject_cast(view); if (nodeInstanceView) return; @@ -2178,19 +1653,18 @@ void Model::attachView(AbstractView *view) */ void Model::detachView(AbstractView *view, ViewNotification emitDetachNotify) { -// Internal::WriteLocker locker(d); + // Internal::WriteLocker locker(d); bool emitNotify = (emitDetachNotify == NotifyView); - auto rewriterView = qobject_cast(view); + auto rewriterView = qobject_cast(view); if (rewriterView) return; - auto nodeInstanceView = qobject_cast(view); + auto nodeInstanceView = qobject_cast(view); if (nodeInstanceView) return; d->detachView(view, emitNotify); } - -} +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 4874959759b..9cb6af7e38f 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -122,9 +122,15 @@ public: void detachView(AbstractView *view, bool notifyView); void detachAllViews(); + Model *model() const { return m_model; } + void setModel(Model *model) { m_model = model; } - Model *model() const { return m_q; } - void setModel(Model *q) { m_q = q; } + template + void notifyNodeInstanceViewLast(Callable call); + template + void notifyNormalViewsLast(Callable call); + template + void notifyInstanceChanges(Callable call); void notifyNodeCreated(const InternalNodePointer &newInternalNodePointer); void notifyNodeAboutToBeReparent(const InternalNodePointer &internalNodePointer, const InternalNodeAbstractPropertyPointer &newPropertyParent, const InternalNodePointer &oldParent, const PropertyName &oldPropertyName, AbstractView::PropertyChangeFlags propertyChange); @@ -179,11 +185,10 @@ public: void setAuxiliaryData(const InternalNodePointer& node, const PropertyName &name, const QVariant &data); void removeAuxiliaryData(const InternalNodePointer& node, const PropertyName &name); - void resetModelByRewriter(const QString &description); - + [[noreturn]] void resetModelByRewriter(const QString &description); // Imports: - QList imports() const { return m_imports; } + const QList &imports() const { return m_imports; } void addImport(const Import &import); void removeImport(const Import &import); void changeImports(const QList &importsToBeAdded, const QList &importToBeRemoved); @@ -250,7 +255,7 @@ private: //functions const QList> enabledViews() const; private: - Model *m_q; + Model *m_model; MetaInfo m_metaInfo; QList m_imports; QList m_possibleImportList;