File indexing completed on 2024-05-05 17:45:01

0001 /*
0002     SPDX-FileCopyrightText: 2021 Alexander Lohnau <alexander.lohnau@gmx.de>
0003     SPDX-License-Identifier: LGPL-2.1-or-later
0004 */
0005 
0006 #include "helprunner.h"
0007 
0008 #include <KIO/CommandLauncherJob>
0009 #include <KLocalizedString>
0010 #include <KPluginMetaData>
0011 
0012 HelpRunner::HelpRunner(QObject *parent, const KPluginMetaData &pluginMetaData, const QVariantList &args)
0013     : AbstractRunner(parent, pluginMetaData, args)
0014 {
0015     setTriggerWords({i18nc("this is a runner keyword", "help"), QStringLiteral("?")});
0016     m_manager = qobject_cast<RunnerManager *>(parent);
0017     Q_ASSERT(m_manager);
0018     m_actionList = {new QAction(QIcon::fromTheme(QStringLiteral("configure")), i18n("Configure plugin"), this)};
0019 }
0020 
0021 void HelpRunner::match(RunnerContext &context)
0022 {
0023     const QString sanatizedQuery = context.query().remove(matchRegex());
0024     auto runners = m_manager->runners();
0025     for (auto it = runners.begin(); it != runners.end();) {
0026         if (*it == this || (*it)->syntaxes().isEmpty()) {
0027             it = runners.erase(it);
0028         } else {
0029             ++it;
0030         }
0031     }
0032 
0033     QList<AbstractRunner *> matchingRunners;
0034     if (sanatizedQuery.isEmpty()) {
0035         matchingRunners = runners;
0036     } else {
0037         for (AbstractRunner *runner : std::as_const(runners)) {
0038             if (runner->id().contains(sanatizedQuery, Qt::CaseInsensitive) || runner->name().contains(sanatizedQuery, Qt::CaseInsensitive)) {
0039                 matchingRunners << runner;
0040             }
0041         }
0042     }
0043     QList<QueryMatch> matches;
0044     bool showExtendedHelp = matchingRunners.count() == 1 && sanatizedQuery.count() >= 3;
0045     for (AbstractRunner *runner : std::as_const(matchingRunners)) {
0046         const QList<RunnerSyntax> syntaxes = runner->syntaxes();
0047         if (showExtendedHelp) {
0048             for (const RunnerSyntax &syntax : syntaxes) {
0049                 QueryMatch match(this);
0050                 QString matchText;
0051                 QString text = QLatin1String("<b>");
0052                 const auto exampleQueries = syntax.exampleQueries();
0053                 for (auto &query : exampleQueries) {
0054                     text.append(query.toHtmlEscaped());
0055                     text.append(QLatin1String("<br>"));
0056                 }
0057                 text.append(QLatin1String("</b>"));
0058                 matchText.append(text);
0059                 matchText.append(syntax.description().toHtmlEscaped());
0060                 match.setText(matchText);
0061                 match.setData(syntax.exampleQueries().constFirst());
0062                 match.setMultiLine(true);
0063                 match.setMatchCategory(runner->name());
0064                 match.setIcon(runner->icon());
0065                 matches << match;
0066             }
0067         } else {
0068             QueryMatch match(this);
0069             if (runner->metadata().value(QStringLiteral("X-Plasma-ShowDesciptionInOverview"), false)) {
0070                 match.setText(runner->description());
0071             } else {
0072                 match.setText(syntaxes.constFirst().exampleQueries().constFirst());
0073                 match.setSubtext(runner->description());
0074             }
0075             match.setIcon(runner->icon());
0076             match.setType(QueryMatch::CompletionMatch);
0077             match.setData(QVariant::fromValue(runner->metadata()));
0078             if (!runner->metadata().value(QStringLiteral("X-KDE-ConfigModule")).isEmpty()) {
0079                 match.setActions(m_actionList);
0080             }
0081             matches << match;
0082         }
0083     }
0084     context.addMatches(matches);
0085 }
0086 
0087 void HelpRunner::run(const RunnerContext &context, const QueryMatch &match)
0088 {
0089     context.ignoreCurrentMatchForHistory();
0090     if (match.selectedAction()) {
0091         KIO::CommandLauncherJob *job = nullptr;
0092         const QStringList args{
0093             QStringLiteral("kcm_plasmasearch"),
0094             QStringLiteral("--args"),
0095             match.data().value<KPluginMetaData>().pluginId(),
0096         };
0097         job = new KIO::CommandLauncherJob(QStringLiteral("systemsettings5"), args);
0098         job->start();
0099     } else if (match.type() == QueryMatch::CompletionMatch) {
0100         const KPluginMetaData data = match.data().value<KPluginMetaData>();
0101         const QString completedRunnerName = QStringLiteral("?") + data.name();
0102         context.requestQueryStringUpdate(completedRunnerName, -1);
0103     } else {
0104         const QString query = match.data().toString();
0105         static const QRegularExpression placeholderRegex{QStringLiteral("<.+>$")};
0106         const int idx = query.indexOf(placeholderRegex);
0107         context.requestQueryStringUpdate(query, idx == -1 ? query.count() : idx);
0108     }
0109 }
0110 
0111 K_PLUGIN_CLASS_WITH_JSON(HelpRunner, "helprunner.json")
0112 
0113 #include "helprunner.moc"