1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
/*
SPDX-FileCopyrightText: 2008 Andreas Pakulat <apaku@gmx.de>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "contextmenuextension.h"
#include <QMap>
#include <QMenu>
#include <QAction>
#include <QActionGroup>
#include <KLocalizedString>
namespace KDevelop
{
const QString ContextMenuExtension::FileGroup = QStringLiteral("FileGroup");
const QString ContextMenuExtension::RefactorGroup = QStringLiteral("RefactorGroup");
const QString ContextMenuExtension::BuildGroup = QStringLiteral("BuildGroup");
const QString ContextMenuExtension::RunGroup = QStringLiteral("RunGroup");
const QString ContextMenuExtension::DebugGroup = QStringLiteral("DebugGroup");
const QString ContextMenuExtension::EditGroup = QStringLiteral("EditGroup");
const QString ContextMenuExtension::VcsGroup = QStringLiteral("VcsGroup");
const QString ContextMenuExtension::ProjectGroup = QStringLiteral("ProjectGroup");
const QString ContextMenuExtension::OpenEmbeddedGroup = QStringLiteral("OpenEmbeddedGroup");
const QString ContextMenuExtension::OpenExternalGroup = QStringLiteral("OpenExternalGroup");
const QString ContextMenuExtension::AnalyzeFileGroup = QStringLiteral("AnalyzeFileGroup");
const QString ContextMenuExtension::AnalyzeProjectGroup = QStringLiteral("AnalyzeProjectGroup");
const QString ContextMenuExtension::NavigationGroup = QStringLiteral("NavigationGroup");
const QString ContextMenuExtension::ExtensionGroup = QStringLiteral("ExtensionGroup");
class ContextMenuExtensionPrivate
{
public:
QMap<QString,QList<QAction*> > extensions;
};
ContextMenuExtension::ContextMenuExtension()
: d_ptr(new ContextMenuExtensionPrivate)
{
}
ContextMenuExtension::~ContextMenuExtension() = default;
ContextMenuExtension::ContextMenuExtension( const ContextMenuExtension& rhs )
: d_ptr(new ContextMenuExtensionPrivate)
{
Q_D(ContextMenuExtension);
d->extensions = rhs.d_func()->extensions;
}
ContextMenuExtension& ContextMenuExtension::operator=( const ContextMenuExtension& rhs )
{
Q_D(ContextMenuExtension);
if( this == &rhs )
return *this;
d->extensions = rhs.d_func()->extensions;
return *this;
}
QList<QAction*> ContextMenuExtension::actions( const QString& group ) const
{
Q_D(const ContextMenuExtension);
return d->extensions.value( group, QList<QAction*>() );
}
void ContextMenuExtension::addAction( const QString& group, QAction* action )
{
Q_D(ContextMenuExtension);
auto actionGroupIt = d->extensions.find(group);
if (actionGroupIt == d->extensions.end()) {
d->extensions.insert( group, QList<QAction*>() << action );
} else
{
actionGroupIt->append(action);
}
}
static
void populateMenuWithGroup(
QMenu* menu,
const QList<ContextMenuExtension>& extensions,
const QString& groupName,
const QString& groupDisplayName = QString(),
const QString& groupIconName = QString(),
bool forceAddMenu = false,
bool addSeparator = true)
{
QList<QAction*> groupActions;
for (const ContextMenuExtension& extension : extensions) {
groupActions += extension.actions(groupName);
}
// remove NULL QActions, if any. Those can end up in groupActions if plugins
// like the debugger plugins are not loaded.
groupActions.removeAll(nullptr);
if (groupActions.isEmpty()) {
return;
}
QMenu* groupMenu = menu;
if ((groupActions.count() > 1 && !groupDisplayName.isEmpty()) ||
(!groupDisplayName.isEmpty() && forceAddMenu)) {
groupMenu = menu->addMenu(groupDisplayName);
if (!groupIconName.isEmpty()) {
groupMenu->setIcon(QIcon::fromTheme(groupIconName));
}
}
for (QAction* action : std::as_const(groupActions)) {
groupMenu->addAction(action);
}
if (addSeparator) {
menu->addSeparator();
}
}
void ContextMenuExtension::populateMenu(QMenu* menu, const QList<ContextMenuExtension>& extensions)
{
populateMenuWithGroup(menu, extensions, BuildGroup);
populateMenuWithGroup(menu, extensions, FileGroup);
populateMenuWithGroup(menu, extensions, EditGroup);
populateMenuWithGroup(menu, extensions, DebugGroup, i18nc("@title:menu", "Debug"));
populateMenuWithGroup(menu, extensions, RefactorGroup, i18nc("@title:menu", "Refactor"));
populateMenuWithGroup(menu, extensions, NavigationGroup);
populateMenuWithGroup(menu, extensions, AnalyzeFileGroup, i18nc("@title:menu", "Analyze Current File With"), QStringLiteral("dialog-ok"), true, false);
populateMenuWithGroup(menu, extensions, AnalyzeProjectGroup, i18nc("@title:menu", "Analyze Current Project With"), QStringLiteral("dialog-ok"), true);
populateMenuWithGroup(menu, extensions, VcsGroup);
populateMenuWithGroup(menu, extensions, ExtensionGroup);
}
}
|