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"