diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 6b0276c8b15..a7632574c0a 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -284,6 +284,23 @@ public: bool isEnabled() const; void setEnabled(bool b); + bool isBlockingNotifications() const { return m_isBlockingNotifications; } + + class NotificationBlocker + { + public: + NotificationBlocker(AbstractView *view) + : m_view{view} + { + m_view->m_isBlockingNotifications = true; + } + + ~NotificationBlocker() { m_view->m_isBlockingNotifications = false; } + + private: + AbstractView *m_view; + }; + protected: void setModel(Model * model); void removeModel(); @@ -296,10 +313,11 @@ protected: private: //functions QList toModelNodeList(const QList &nodeList) const; - bool m_enabled = true; private: QPointer m_model; + bool m_enabled = true; + bool m_isBlockingNotifications = false; }; QMLDESIGNERCORE_EXPORT QList toInternalNodeList(const QList &nodeList); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index d504a1fbda5..5f059c50fde 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -397,17 +397,19 @@ void ModelPrivate::notifyNodeInstanceViewLast(Callable call) QString description; try { - if (rewriterView()) + if (rewriterView() && !rewriterView()->isBlockingNotifications()) call(rewriterView()); } catch (const RewritingException &e) { description = e.description(); resetModel = true; } - for (QPointer view : enabledViews()) - call(view.data()); + for (QPointer view : enabledViews()) { + if (!view->isBlockingNotifications()) + call(view.data()); + } - if (nodeInstanceView()) + if (nodeInstanceView() && !nodeInstanceView()->isBlockingNotifications()) call(nodeInstanceView()); if (resetModel) @@ -421,18 +423,20 @@ void ModelPrivate::notifyNormalViewsLast(Callable call) QString description; try { - if (rewriterView()) + if (rewriterView() && !rewriterView()->isBlockingNotifications()) call(rewriterView()); } catch (const RewritingException &e) { description = e.description(); resetModel = true; } - if (nodeInstanceView()) + if (nodeInstanceView() && !nodeInstanceView()->isBlockingNotifications()) call(nodeInstanceView()); - for (QPointer view : enabledViews()) - call(view.data()); + for (QPointer view : enabledViews()) { + if (!view->isBlockingNotifications()) + call(view.data()); + } if (resetModel) resetModelByRewriter(description); @@ -441,8 +445,10 @@ void ModelPrivate::notifyNormalViewsLast(Callable call) template void ModelPrivate::notifyInstanceChanges(Callable call) { - for (QPointer view : enabledViews()) - call(view.data()); + for (QPointer view : enabledViews()) { + if (!view->isBlockingNotifications()) + call(view.data()); + } } void ModelPrivate::notifyAuxiliaryDataChanged(const InternalNodePointer &internalNode,