From 6112aa762bfe0980ac94995bf54b1eb1c21e63c6 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Sat, 13 Jan 2018 16:11:24 +0100 Subject: [PATCH] QmlDesigner: Start optimizing action notifications We get more and more actions and notifying those slowly becomes a bottleneck. I guess we have to add an enum to the context that tells the action which notifier on the view was called, so that the action only react to relevant notifiers. Change-Id: Ic05999b5855e4823659ff1520484242e0c957f1e Reviewed-by: Thomas Hartmann --- .../components/componentcore/designeractionmanager.cpp | 5 +++++ .../components/componentcore/designeractionmanager.h | 4 ++++ .../componentcore/designeractionmanagerview.cpp | 5 +++-- .../componentcore/designeractionmanagerview.h | 5 ++--- .../components/componentcore/modelnodecontextmenu.cpp | 5 ++++- .../components/componentcore/selectioncontext.cpp | 10 ++++++++++ .../components/componentcore/selectioncontext.h | 6 ++++++ 7 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index bc8047d4749..b19e06e45b6 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -173,6 +173,11 @@ DesignerActionManager &DesignerActionManager::instance() return QmlDesignerPlugin::instance()->viewManager().designerActionManager(); } +void DesignerActionManager::setupContext() +{ + m_designerActionManagerView->setupContext(); +} + class VisiblityModelNodeAction : public ModelNodeContextMenuAction { public: diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h index 4a9571fabae..6cd7d7f2e2e 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h @@ -71,6 +71,10 @@ public: QGraphicsWidget *createFormEditorToolBar(QGraphicsItem *parent); static DesignerActionManager &instance(); + void setupContext(); + + DesignerActionManager(const DesignerActionManager&) = delete; + DesignerActionManager & operator=(const DesignerActionManager&) = delete; private: QList > m_designerActions; diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp index d11b6ca2dad..1efd79a1cdf 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp @@ -147,7 +147,7 @@ void DesignerActionManagerView::bindingPropertiesChanged(const QList > &) { if (hasSingleSelectedModelNode()) - setupContext(); + setupContext(SelectionContext::UpdateMode::Fast); } DesignerActionManager &DesignerActionManagerView::designerActionManager() @@ -168,13 +168,14 @@ void DesignerActionManagerView::emitSelectionChanged() /* We should consider compressing this. */ /* One update every 100ms should be enough. */ -void DesignerActionManagerView::setupContext() +void DesignerActionManagerView::setupContext(SelectionContext::UpdateMode updateMode) { if (m_isInRewriterTransaction) { m_setupContextDirty = true; return; } SelectionContext selectionContext(this); + selectionContext.setUpdateMode(updateMode); foreach (ActionInterface* action, m_designerActionList) { action->currentContextChanged(selectionContext); } diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h index e1e926639f6..5ee29cd4217 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h @@ -26,6 +26,7 @@ #pragma once #include +#include #include "designeractionmanager.h" @@ -69,13 +70,11 @@ public: DesignerActionManager &designerActionManager(); const DesignerActionManager &designerActionManager() const; void emitSelectionChanged(); + void setupContext(SelectionContext::UpdateMode updateMode = SelectionContext::UpdateMode::Normal); signals: void selectionChanged(bool itemsSelected, bool rootItemIsSelected); -protected: - void setupContext(); - private: DesignerActionManager m_designerActionManager; QList m_designerActionList; diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp index bf95e70b3ca..de2733893aa 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp @@ -96,9 +96,12 @@ void ModelNodeContextMenu::execute(const QPoint &position, bool selectionMenuBoo m_selectionContext.setShowSelectionTools(selectionMenuBool); m_selectionContext.setScenePosition(m_scenePos); + auto &manager = QmlDesignerPlugin::instance()->designerActionManager(); + + manager.setupContext(); QSet factories = - QSet::fromList(QmlDesignerPlugin::instance()->designerActionManager().designerActions()); + QSet::fromList(manager.designerActions()); populateMenu(factories, QByteArray(), mainMenu, m_selectionContext); diff --git a/src/plugins/qmldesigner/components/componentcore/selectioncontext.cpp b/src/plugins/qmldesigner/components/componentcore/selectioncontext.cpp index 298eb855c38..e82b2a22ddc 100644 --- a/src/plugins/qmldesigner/components/componentcore/selectioncontext.cpp +++ b/src/plugins/qmldesigner/components/componentcore/selectioncontext.cpp @@ -117,4 +117,14 @@ bool SelectionContext::isValid() const return view() && view()->model(); } +bool SelectionContext::fastUpdate() const +{ + return m_updateMode == UpdateMode::Fast; +} + +void SelectionContext::setUpdateMode(UpdateMode mode) +{ + m_updateMode = mode; +} + } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/selectioncontext.h b/src/plugins/qmldesigner/components/componentcore/selectioncontext.h index 594fc2f6e5c..11e1937cbb5 100644 --- a/src/plugins/qmldesigner/components/componentcore/selectioncontext.h +++ b/src/plugins/qmldesigner/components/componentcore/selectioncontext.h @@ -35,6 +35,8 @@ namespace QmlDesigner { class QMLDESIGNERCORE_EXPORT SelectionContext { public: + enum class UpdateMode {Normal, Fast}; + SelectionContext(); SelectionContext(AbstractView *view); @@ -62,12 +64,16 @@ public: bool isValid() const; + bool fastUpdate() const; + void setUpdateMode(UpdateMode mode); + private: QPointer m_view; ModelNode m_targetNode; QPointF m_scenePosition; bool m_showSelectionTools = false; bool m_toggled = false; + UpdateMode m_updateMode = UpdateMode::Normal; }; } //QmlDesigner