QortalOS Brooklyn for Raspberry Pi 4
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

117 lines
3.6 KiB

/*
SPDX-FileCopyrightText: 2008 Sebastian Kügler <[email protected]>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "recentdocuments.h"
#include <QAction>
#include <QDir>
#include <QMimeData>
#include <KIO/Job>
#include <KIO/OpenFileManagerWindowJob>
#include <KIO/OpenUrlJob>
#include <KLocalizedString>
#include <KNotificationJobUiDelegate>
#include <KShell>
#include <KActivities/Stats/Query>
#include <KActivities/Stats/ResultModel>
#include <KActivities/Stats/Terms>
using namespace KActivities::Stats;
using namespace KActivities::Stats::Terms;
K_PLUGIN_CLASS_WITH_JSON(RecentDocuments, "plasma-runner-recentdocuments.json")
RecentDocuments::RecentDocuments(QObject *parent, const KPluginMetaData &metaData, const QVariantList &args)
: Plasma::AbstractRunner(parent, metaData, args)
{
setObjectName(QStringLiteral("Recent Documents"));
addSyntax(Plasma::RunnerSyntax(QStringLiteral(":q:"), i18n("Looks for documents recently used with names matching :q:.")));
m_actions = {new QAction(QIcon::fromTheme(QStringLiteral("document-open-folder")), i18n("Open Containing Folder"), this)};
setMinLetterCount(3);
}
RecentDocuments::~RecentDocuments()
{
}
void RecentDocuments::match(Plasma::RunnerContext &context)
{
if (!context.isValid()) {
return;
}
// clang-format off
const QString term = context.query();
auto query = UsedResources
| Activity::current()
| Order::RecentlyUsedFirst
| Agent::any()
// we search only on file name, as KActivity does not support better options
| Url("/*/" + term + "*")
| Limit(20);
// clang-format on
const auto result = new ResultModel(query);
for (int i = 0; i < result->rowCount(); ++i) {
const auto index = result->index(i, 0);
const auto url = QUrl::fromUserInput(result->data(index, ResultModel::ResourceRole).toString(),
QString(),
// We can assume local file thanks to the request Url
QUrl::AssumeLocalFile);
const auto name = result->data(index, ResultModel::TitleRole).toString();
Plasma::QueryMatch match(this);
auto relevance = 0.5;
match.setType(Plasma::QueryMatch::PossibleMatch);
if (url.fileName() == term) {
relevance = 1.0;
match.setType(Plasma::QueryMatch::ExactMatch);
} else if (url.fileName().startsWith(term)) {
relevance = 0.9;
match.setType(Plasma::QueryMatch::PossibleMatch);
}
match.setIconName(KIO::iconNameForUrl(url));
match.setRelevance(relevance);
match.setData(QVariant(url));
match.setUrls({url});
match.setId(url.toString());
if (url.isLocalFile()) {
match.setActions(m_actions);
}
match.setText(name);
QString destUrlString = KShell::tildeCollapse(url.adjusted(QUrl::RemoveFilename | QUrl::StripTrailingSlash).path());
match.setSubtext(destUrlString);
context.addMatch(match);
}
}
void RecentDocuments::run(const Plasma::RunnerContext &context, const Plasma::QueryMatch &match)
{
Q_UNUSED(context)
const QUrl url = match.data().toUrl();
if (match.selectedAction()) {
KIO::highlightInFileManager({url});
return;
}
auto *job = new KIO::OpenUrlJob(url);
job->setUiDelegate(new KNotificationJobUiDelegate(KJobUiDelegate::AutoErrorHandlingEnabled));
job->setRunExecutables(false);
job->start();
}
#include "recentdocuments.moc"