3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-23 15:45:53 +00:00
Brooklyn/plasma/workspace/runners/baloo/baloosearchrunner.cpp
2022-04-02 18:24:21 +05:00

164 lines
5.3 KiB
C++

/*
SPDX-FileCopyrightText: 2014 Vishesh Handa <me@vhanda.in>
SPDX-FileCopyrightText: 2017 David Edmundson <davidedmundson@kde.org>
SPDX-License-Identifier: LGPL-2.1-or-later
*/
#include "baloosearchrunner.h"
#include <KLocalizedString>
#include <QAction>
#include <QApplication>
#include <QDBusConnection>
#include <QDir>
#include <QIcon>
#include <QMimeData>
#include <QMimeDatabase>
#include <QTimer>
#include <Baloo/IndexerConfig>
#include <Baloo/Query>
#include <KIO/OpenFileManagerWindowJob>
#include <KIO/OpenUrlJob>
#include <KNotificationJobUiDelegate>
#include <KShell>
#include "krunner1adaptor.h"
static const QString s_openParentDirId = QStringLiteral("openParentDir");
int main(int argc, char **argv)
{
QCoreApplication::setAttribute(Qt::AA_DisableSessionManager);
QApplication::setQuitOnLastWindowClosed(false);
QApplication app(argc, argv); // KRun needs widgets for error message boxes
SearchRunner r;
return app.exec();
}
SearchRunner::SearchRunner(QObject *parent)
: QObject(parent)
{
new Krunner1Adaptor(this);
qDBusRegisterMetaType<RemoteMatch>();
qDBusRegisterMetaType<RemoteMatches>();
qDBusRegisterMetaType<RemoteAction>();
qDBusRegisterMetaType<RemoteActions>();
QDBusConnection::sessionBus().registerObject(QStringLiteral("/runner"), this);
QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.runners.baloo"));
}
SearchRunner::~SearchRunner()
{
}
RemoteActions SearchRunner::Actions()
{
Baloo::IndexerConfig config;
if (!config.fileIndexingEnabled()) {
sendErrorReply(QDBusError::ErrorType::NotSupported);
}
return RemoteActions({RemoteAction{s_openParentDirId, i18n("Open Containing Folder"), QStringLiteral("document-open-folder")}});
}
RemoteMatches SearchRunner::Match(const QString &searchTerm)
{
Baloo::IndexerConfig config;
if (!config.fileIndexingEnabled()) {
sendErrorReply(QDBusError::ErrorType::NotSupported);
return {};
}
// Do not try to show results for queries starting with =
// this should trigger the calculator, but the AdvancedQueryParser::parse method
// in baloo interpreted it as an operator, BUG 345134
if (searchTerm.startsWith(QLatin1Char('='))) {
return RemoteMatches();
}
// Filter out duplicates
QSet<QUrl> foundUrls;
RemoteMatches matches;
matches << matchInternal(searchTerm, QStringLiteral("Audio"), i18n("Audio"), foundUrls);
matches << matchInternal(searchTerm, QStringLiteral("Image"), i18n("Image"), foundUrls);
matches << matchInternal(searchTerm, QStringLiteral("Video"), i18n("Video"), foundUrls);
matches << matchInternal(searchTerm, QStringLiteral("Spreadsheet"), i18n("Spreadsheet"), foundUrls);
matches << matchInternal(searchTerm, QStringLiteral("Presentation"), i18n("Presentation"), foundUrls);
matches << matchInternal(searchTerm, QStringLiteral("Folder"), i18n("Folder"), foundUrls);
matches << matchInternal(searchTerm, QStringLiteral("Document"), i18n("Document"), foundUrls);
matches << matchInternal(searchTerm, QStringLiteral("Archive"), i18n("Archive"), foundUrls);
return matches;
}
RemoteMatches SearchRunner::matchInternal(const QString &searchTerm, const QString &type, const QString &category, QSet<QUrl> &foundUrls)
{
Baloo::Query query;
query.setSearchString(searchTerm);
query.setType(type);
query.setLimit(10);
Baloo::ResultIterator it = query.exec();
RemoteMatches matches;
QMimeDatabase mimeDb;
// KRunner is absolutely daft and allows plugins to set the global
// relevance levels. so Baloo should not set the relevance of results too
// high because then Applications will often appear after if the application
// runner has not a higher relevance. So stupid.
// Each runner plugin should not have to know about the others.
// Anyway, that's why we're starting with .75
float relevance = .75;
while (it.next()) {
RemoteMatch match;
QString localUrl = it.filePath();
const QUrl url = QUrl::fromLocalFile(localUrl);
if (foundUrls.contains(url)) {
continue;
}
foundUrls.insert(url);
match.id = url.toString();
match.text = url.fileName();
match.iconName = mimeDb.mimeTypeForFile(localUrl).iconName();
match.relevance = relevance;
match.type = Plasma::QueryMatch::PossibleMatch;
QVariantMap properties;
QString folderPath = url.adjusted(QUrl::RemoveFilename | QUrl::StripTrailingSlash).toLocalFile();
folderPath = KShell::tildeCollapse(folderPath);
properties[QStringLiteral("urls")] = QStringList({QString::fromLocal8Bit(url.toEncoded())});
properties[QStringLiteral("subtext")] = folderPath;
properties[QStringLiteral("category")] = category;
match.properties = properties;
relevance -= 0.05;
matches << match;
}
return matches;
}
void SearchRunner::Run(const QString &id, const QString &actionId)
{
const QUrl url(id);
if (actionId == s_openParentDirId) {
KIO::highlightInFileManager({url});
return;
}
auto *job = new KIO::OpenUrlJob(url);
job->setUiDelegate(new KNotificationJobUiDelegate(KJobUiDelegate::AutoErrorHandlingEnabled));
job->setRunExecutables(false);
job->start();
}