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"