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
|
/*
SPDX-FileCopyrightText: 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "actionsquickopenprovider.h"
#include <KActionCollection>
#include <KLocalizedString>
#include <QIcon>
#include <QAction>
#include <QRegularExpression>
using namespace KDevelop;
class ActionsQuickOpenItem
: public QuickOpenDataBase
{
public:
ActionsQuickOpenItem(const QString& display, QAction* action)
: QuickOpenDataBase()
, m_action(action)
, m_display(display)
{}
QString text() const override
{
return m_display;
}
QString htmlDescription() const override
{
QString desc = m_action->toolTip();
const QKeySequence shortcut = m_action->shortcut();
if (!shortcut.isEmpty()) {
desc = i18nc("description (shortcut)", "%1 (%2)", desc, shortcut.toString());
}
return desc;
}
bool execute(QString&) override
{
m_action->trigger();
return true;
}
QIcon icon() const override
{
const QIcon icon = m_action->icon();
if (icon.isNull()) {
// note: not the best fallback icon, but can't find anything better
return QIcon::fromTheme(QStringLiteral("system-run"));
}
return icon;
}
private:
QAction* const m_action;
///needed because it won't have the "E&xit" ampersand
const QString m_display;
};
ActionsQuickOpenProvider::ActionsQuickOpenProvider()
{
}
void ActionsQuickOpenProvider::setFilterText(const QString& text)
{
if (text.size() < 2) {
return;
}
m_results.clear();
const QList<KActionCollection*> collections = KActionCollection::allCollections();
QRegularExpression mnemonicRx(QStringLiteral("^(.*)&(.+)$"));
for (KActionCollection* c : collections) {
const QList<QAction*> actions = c->actions();
for (QAction* action : actions) {
if (!action->isEnabled()) {
continue;
}
QString display = action->text();
QRegularExpressionMatch match = mnemonicRx.match(display);
if (match.hasMatch()) {
display = match.capturedView(1) + match.capturedView(2);
}
if (display.contains(text, Qt::CaseInsensitive)) {
m_results += QuickOpenDataPointer(new ActionsQuickOpenItem(display, action));
}
}
}
}
uint ActionsQuickOpenProvider::unfilteredItemCount() const
{
uint ret = 0;
const QList<KActionCollection*> collections = KActionCollection::allCollections();
for (KActionCollection* c : collections) {
ret += c->count();
}
return ret;
}
QuickOpenDataPointer ActionsQuickOpenProvider::data(uint row) const
{
return m_results.at(row);
}
uint ActionsQuickOpenProvider::itemCount() const
{
return m_results.count();
}
void ActionsQuickOpenProvider::reset()
{
m_results.clear();
}
#include "moc_actionsquickopenprovider.cpp"
|