File: actionsquickopenprovider.cpp

package info (click to toggle)
kdevelop 4%3A25.04.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 73,508 kB
  • sloc: cpp: 291,803; python: 4,322; javascript: 3,518; sh: 1,316; ansic: 703; xml: 414; php: 95; lisp: 66; makefile: 31; sed: 12
file content (121 lines) | stat: -rw-r--r-- 3,029 bytes parent folder | download | duplicates (2)
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"