File indexing completed on 2024-12-08 03:40:49
0001 /* 0002 SPDX-FileCopyrightText: 2015 Montel Laurent <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "kurifiltersearchprovideractions.h" 0008 #include <KDialogJobUiDelegate> 0009 #include <KIO/CommandLauncherJob> 0010 #include <KLocalizedString> 0011 #include <KStringHandler> 0012 #include <QActionGroup> 0013 #include <QDesktopServices> 0014 #include <QIcon> 0015 #include <QMenu> 0016 #include <QStandardPaths> 0017 #include <kurifilter.h> 0018 0019 using namespace KIO; 0020 0021 class KIO::WebShortcutsMenuManagerPrivate 0022 { 0023 public: 0024 WebShortcutsMenuManagerPrivate() 0025 { 0026 } 0027 0028 QString mSelectedText; 0029 }; 0030 0031 KUriFilterSearchProviderActions::KUriFilterSearchProviderActions(QObject *parent) 0032 : QObject(parent) 0033 , d(new KIO::WebShortcutsMenuManagerPrivate) 0034 { 0035 } 0036 0037 KUriFilterSearchProviderActions::~KUriFilterSearchProviderActions() = default; 0038 0039 QString KUriFilterSearchProviderActions::selectedText() const 0040 { 0041 return d->mSelectedText; 0042 } 0043 0044 void KUriFilterSearchProviderActions::setSelectedText(const QString &selectedText) 0045 { 0046 d->mSelectedText = selectedText; 0047 } 0048 0049 void KUriFilterSearchProviderActions::slotConfigureWebShortcuts() 0050 { 0051 auto *job = new KIO::CommandLauncherJob(QStringLiteral("kcmshell6"), {QStringLiteral("webshortcuts")}); 0052 job->setUiDelegate(new KDialogJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, nullptr)); 0053 job->start(); 0054 } 0055 0056 void KUriFilterSearchProviderActions::addWebShortcutsToMenu(QMenu *menu) 0057 { 0058 if (d->mSelectedText.isEmpty()) { 0059 return; 0060 } 0061 0062 const QString searchText = d->mSelectedText.simplified(); 0063 0064 if (searchText.isEmpty()) { 0065 return; 0066 } 0067 0068 KUriFilterData filterData(searchText); 0069 0070 filterData.setSearchFilteringOptions(KUriFilterData::RetrievePreferredSearchProvidersOnly); 0071 0072 if (KUriFilter::self()->filterSearchUri(filterData, KUriFilter::NormalTextFilter)) { 0073 const QStringList searchProviders = filterData.preferredSearchProviders(); 0074 0075 if (!searchProviders.isEmpty()) { 0076 QMenu *webShortcutsMenu = new QMenu(menu); 0077 webShortcutsMenu->setIcon(QIcon::fromTheme(QStringLiteral("preferences-web-browser-shortcuts"))); 0078 0079 const QString squeezedText = KStringHandler::rsqueeze(searchText, 21); 0080 webShortcutsMenu->setTitle(i18n("Search for '%1' with", squeezedText)); 0081 0082 QActionGroup *actionGroup = new QActionGroup(this); 0083 connect(actionGroup, &QActionGroup::triggered, this, &KUriFilterSearchProviderActions::slotHandleWebShortcutAction); 0084 for (const QString &searchProvider : searchProviders) { 0085 QAction *action = new QAction(i18nc("@action:inmenu Search for <text> with", "%1", searchProvider), webShortcutsMenu); 0086 action->setIcon(QIcon::fromTheme(filterData.iconNameForPreferredSearchProvider(searchProvider))); 0087 action->setData(filterData.queryForPreferredSearchProvider(searchProvider)); 0088 webShortcutsMenu->addAction(action); 0089 actionGroup->addAction(action); 0090 } 0091 0092 if (!QStandardPaths::findExecutable(QStringLiteral("kcmshell6")).isEmpty()) { 0093 webShortcutsMenu->addSeparator(); 0094 QAction *action = new QAction(i18n("Configure Web Shortcuts..."), webShortcutsMenu); 0095 action->setIcon(QIcon::fromTheme(QStringLiteral("configure"))); 0096 connect(action, &QAction::triggered, this, &KUriFilterSearchProviderActions::slotConfigureWebShortcuts); 0097 webShortcutsMenu->addAction(action); 0098 } 0099 0100 menu->addMenu(webShortcutsMenu); 0101 } 0102 } 0103 } 0104 0105 void KUriFilterSearchProviderActions::slotHandleWebShortcutAction(QAction *action) 0106 { 0107 KUriFilterData filterData(action->data().toString()); 0108 if (KUriFilter::self()->filterSearchUri(filterData, KUriFilter::WebShortcutFilter)) { 0109 QDesktopServices::openUrl(filterData.uri()); 0110 } 0111 } 0112 0113 #include "moc_kurifiltersearchprovideractions.cpp"