File indexing completed on 2024-12-08 07:33:47

0001 // SPDX-FileCopyrightText: 2010 Eike Hein <hein@kde.org>
0002 // SPDX-FileCopyrightText: 2021 Carl Schwan <carl@carlschwan.eu>
0003 // SPDX-License-Identifier: LGPL-2.0-or-later
0004 
0005 #include "webshortcutmodel.h"
0006 
0007 #ifdef HAVE_KIO
0008 #include <KIO/CommandLauncherJob>
0009 #include <KUriFilter>
0010 #endif
0011 #include <KStringHandler>
0012 
0013 struct WebShortcutModelPrivate {
0014     QString selectedText;
0015 #ifdef HAVE_KIO
0016     KUriFilterData filterData;
0017 #endif
0018     QStringList searchProviders;
0019 };
0020 
0021 WebShortcutModel::WebShortcutModel(QObject *parent)
0022     : QAbstractListModel(parent)
0023     , d(new WebShortcutModelPrivate)
0024 {
0025 }
0026 
0027 WebShortcutModel::~WebShortcutModel()
0028 {
0029 }
0030 
0031 QString WebShortcutModel::selectedText() const
0032 {
0033     return d->selectedText;
0034 }
0035 
0036 QString WebShortcutModel::trunkatedSearchText() const
0037 {
0038     return KStringHandler::rsqueeze(d->selectedText, 21);
0039 }
0040 
0041 bool WebShortcutModel::enabled() const
0042 {
0043 #ifdef HAVE_KIO
0044     return true;
0045 #else
0046     return false;
0047 #endif
0048 }
0049 
0050 void WebShortcutModel::setSelectedText(const QString &selectedText)
0051 {
0052     if (d->selectedText == selectedText) {
0053         return;
0054     }
0055 #ifdef HAVE_KIO
0056     beginResetModel();
0057     d->selectedText = selectedText;
0058 
0059     if (selectedText.isEmpty()) {
0060         endResetModel();
0061         return;
0062     }
0063 
0064     QString searchText = selectedText;
0065     searchText = searchText.replace(QLatin1Char('\n'), QLatin1Char(' ')).replace(QLatin1Char('\r'), QLatin1Char(' ')).simplified();
0066     if (searchText.isEmpty()) {
0067         endResetModel();
0068         return;
0069     }
0070     d->filterData.setData(searchText);
0071     d->filterData.setSearchFilteringOptions(KUriFilterData::RetrievePreferredSearchProvidersOnly);
0072 
0073     if (KUriFilter::self()->filterSearchUri(d->filterData, KUriFilter::NormalTextFilter)) {
0074         d->searchProviders = d->filterData.preferredSearchProviders();
0075     }
0076     endResetModel();
0077 #else
0078     d->selectedText = selectedText;
0079 #endif
0080     Q_EMIT selectedTextChanged();
0081 }
0082 
0083 int WebShortcutModel::rowCount(const QModelIndex &parent) const
0084 {
0085     Q_UNUSED(parent);
0086 #ifdef HAVE_KIO
0087     if (!d->selectedText.isEmpty()) {
0088         return d->searchProviders.count();
0089     }
0090 #endif
0091     return 0;
0092 }
0093 
0094 QVariant WebShortcutModel::data(const QModelIndex &index, int role) const
0095 {
0096     if (!index.isValid()) {
0097         return {};
0098     }
0099 
0100 #ifdef HAVE_KIO
0101     switch (role) {
0102     case Qt::DisplayRole:
0103         return d->searchProviders[index.row()];
0104     case Qt::DecorationRole:
0105         return d->filterData.iconNameForPreferredSearchProvider(d->searchProviders[index.row()]);
0106     case Qt::EditRole:
0107         return d->filterData.queryForPreferredSearchProvider(d->searchProviders[index.row()]);
0108     }
0109 #endif
0110     return {};
0111 }
0112 
0113 void WebShortcutModel::trigger(const QString &data)
0114 {
0115 #ifdef HAVE_KIO
0116     KUriFilterData filterData(data);
0117     if (KUriFilter::self()->filterSearchUri(filterData, KUriFilter::WebShortcutFilter)) {
0118         Q_EMIT openUrl(filterData.uri());
0119     }
0120 #else
0121     Q_UNUSED(data);
0122 #endif
0123 }
0124 
0125 void WebShortcutModel::configureWebShortcuts()
0126 {
0127 #ifdef HAVE_KIO
0128     auto job = new KIO::CommandLauncherJob(QStringLiteral("kcmshell5"), QStringList() << QStringLiteral("webshortcuts"), this);
0129     job->exec();
0130 #endif
0131 }
0132 
0133 #include "moc_webshortcutmodel.cpp"