From 7c1e210d2cb4c243fcbe412112a01ea8d179ca6c Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Thu, 17 Dec 2020 13:06:15 +0100 Subject: [PATCH] Allow designeractions to target specific views This is needed for the "connect signal to event dialog" which resides in a different plugin but needs to be opened from the connection editor. Change-Id: I9e200791831fa46d65e5f833e14a0d893fc29432 Reviewed-by: Thomas Hartmann --- .../components/componentcore/actioninterface.h | 6 ++++++ .../components/componentcore/designeractionmanager.cpp | 10 ++++++++++ .../components/componentcore/designeractionmanager.h | 3 +++ .../connectioneditor/connectionviewwidget.cpp | 10 ++++++++++ 4 files changed, 29 insertions(+) diff --git a/src/plugins/qmldesigner/components/componentcore/actioninterface.h b/src/plugins/qmldesigner/components/componentcore/actioninterface.h index 026bb707a9d..d570d1dc229 100644 --- a/src/plugins/qmldesigner/components/componentcore/actioninterface.h +++ b/src/plugins/qmldesigner/components/componentcore/actioninterface.h @@ -53,6 +53,11 @@ public: LowestPriority = ComponentCoreConstants::priorityLast }; + enum class Target { + Undefined, + ConnectionEditor + }; + virtual ~ActionInterface() = default; virtual QAction *action() const = 0; @@ -61,6 +66,7 @@ public: virtual int priority() const = 0; virtual Type type() const = 0; virtual void currentContextChanged(const SelectionContext &selectionState) = 0; + virtual Target target() const { return Target::Undefined; } }; diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 46c23449d1e..207ecbf357d 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -1461,6 +1461,16 @@ void DesignerActionManager::addCreatorCommand(Core::Command *command, const QByt addDesignerAction(new CommandAction(command, category, priority, overrideIcon)); } +QList > DesignerActionManager::actionsForTarget(const ActionInterface::Target &target) +{ + QList > out; + for (auto interface : m_designerActions) + if (interface->target() == target) + out << interface; + + return out; +} + QList DesignerActionManager::designerActions() const { return Utils::transform(m_designerActions, [](const QSharedPointer &pointer) { diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h index 969af7a3bdd..5dfbfc9db12 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h @@ -106,6 +106,9 @@ public: void addDesignerAction(ActionInterface *newAction); void addCreatorCommand(Core::Command *command, const QByteArray &category, int priority, const QIcon &overrideIcon = QIcon()); + + QList> actionsForTarget(const ActionInterface::Target &target); + QList designerActions() const; void createDefaultDesignerActions(); diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp index 769b33e31de..401ddc5841f 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp @@ -172,6 +172,16 @@ void ConnectionViewWidget::contextMenuEvent(QContextMenuEvent *event) m_connectionEditor->updateWindowName(); }); + QMap data; + data["ModelNode"] = index.siblingAtColumn(ConnectionModel::TargetModelNodeRow).data(); + data["Signal"] = index.siblingAtColumn(ConnectionModel::TargetPropertyNameRow).data(); + DesignerActionManager &designerActionManager = QmlDesignerPlugin::instance()->designerActionManager(); + for (auto actionInterface : designerActionManager.actionsForTarget(ActionInterface::Target::ConnectionEditor)) { + auto *action = actionInterface->action(); + action->setData(data); + menu.addAction(action); + } + menu.exec(event->globalPos()); } break;