// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "modelnodecontextmenu.h" #include "modelnodecontextmenu_helper.h" #include "designeractionmanager.h" #include #include "qmleditormenu.h" #include #include #include namespace QmlDesigner { ModelNodeContextMenu::ModelNodeContextMenu(AbstractView *view) : m_selectionContext(view) { } static QSet findMembers(const QSet actionInterface, const QByteArray &category) { QSet ret; for (ActionInterface *factory : actionInterface) { if (factory->category() == category) ret.insert(factory); } return ret; } void populateMenu(QSet &actionInterfaces, const QByteArray &category, QMenu* menu, const SelectionContext &selectionContext) { QSet matchingFactories = findMembers(actionInterfaces, category); actionInterfaces.subtract(matchingFactories); QList matchingFactoriesList = Utils::toList(matchingFactories); Utils::sort(matchingFactoriesList, [](ActionInterface *l, ActionInterface *r) { return l->priority() < r->priority(); }); for (ActionInterface* actionInterface : std::as_const(matchingFactoriesList)) { if (actionInterface->type() == ActionInterface::ContextMenu) { actionInterface->currentContextChanged(selectionContext); QMenu *newMenu = actionInterface->action()->menu(); if (newMenu && !newMenu->title().isEmpty()) menu->addMenu(newMenu); //recurse populateMenu(actionInterfaces, actionInterface->menuId(), newMenu, selectionContext); } else if (actionInterface->type() == ActionInterface::ContextMenuAction || actionInterface->type() == ActionInterface::Action || actionInterface->type() == ActionInterface::FormEditorAction) { QAction* action = actionInterface->action(); actionInterface->currentContextChanged(selectionContext); action->setIconVisibleInMenu(true); menu->addAction(action); } } } void ModelNodeContextMenu::execute(const QPoint &position, bool selectionMenuBool) { auto mainMenu = new QmlEditorMenu(); m_selectionContext.setShowSelectionTools(selectionMenuBool); m_selectionContext.setScenePosition(m_scenePos); auto &manager = QmlDesignerPlugin::instance()->designerActionManager(); manager.setupContext(); QSet factories = Utils::toSet(manager.designerActions()); populateMenu(factories, QByteArray(), mainMenu, m_selectionContext); mainMenu->exec(position); mainMenu->deleteLater(); } void ModelNodeContextMenu::setScenePos(const QPoint &position) { m_scenePos = position; } void ModelNodeContextMenu::showContextMenu(AbstractView *view, const QPoint &globalPosition, const QPoint &scenePosition, bool showSelection) { ModelNodeContextMenu contextMenu(view); contextMenu.setScenePos(scenePosition); contextMenu.execute(globalPosition, showSelection); } } //QmlDesigner