X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/4cf04b91dd8804f2536fc31ae2f1b486bfc8cf9c..2b58f0457e470b1e4f1ed2d947faca32bf982a49:/src/settings/services/servicessettingspage.cpp diff --git a/src/settings/services/servicessettingspage.cpp b/src/settings/services/servicessettingspage.cpp index 4110d1f5e..e18bfb09e 100644 --- a/src/settings/services/servicessettingspage.cpp +++ b/src/settings/services/servicessettingspage.cpp @@ -21,45 +21,39 @@ #include "dolphin_generalsettings.h" #include "dolphin_versioncontrolsettings.h" +#include "settings/serviceitemdelegate.h" +#include "settings/servicemodel.h" -#include -#include #include -#include -#include -#include +#include #include #include +#include #include #include -#include - -#include -#include +#include -#include #include -#include #include #include -#include -#include #include +#include +#include namespace { const bool ShowDeleteDefault = false; - const char* VersionControlServicePrefix = "_version_control_"; - const char* DeleteService = "_delete"; - const char* CopyToMoveToService ="_copy_to_move_to"; + const char VersionControlServicePrefix[] = "_version_control_"; + const char DeleteService[] = "_delete"; + const char CopyToMoveToService[] ="_copy_to_move_to"; } ServicesSettingsPage::ServicesSettingsPage(QWidget* parent) : SettingsPageBase(parent), m_initialized(false), - m_serviceModel(0), - m_sortModel(0), - m_listView(0), + m_serviceModel(nullptr), + m_sortModel(nullptr), + m_listView(nullptr), m_enabledVcsPlugins() { QVBoxLayout* topLayout = new QVBoxLayout(this); @@ -68,34 +62,41 @@ ServicesSettingsPage::ServicesSettingsPage(QWidget* parent) : "Select which services should " "be shown in the context menu:"), this); label->setWordWrap(true); + m_searchLineEdit = new QLineEdit(this); + m_searchLineEdit->setPlaceholderText(i18nc("@label:textbox", "Search...")); + connect(m_searchLineEdit, &QLineEdit::textChanged, this, [this](const QString &filter){ + m_sortModel->setFilterFixedString(filter); + }); m_listView = new QListView(this); - ServiceItemDelegate* delegate = new ServiceItemDelegate(m_listView, m_listView); + auto *delegate = new ServiceItemDelegate(m_listView, m_listView); m_serviceModel = new ServiceModel(this); m_sortModel = new QSortFilterProxyModel(this); m_sortModel->setSourceModel(m_serviceModel); m_sortModel->setSortRole(Qt::DisplayRole); + m_sortModel->setSortLocaleAware(true); + m_sortModel->setFilterRole(Qt::DisplayRole); + m_sortModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_listView->setModel(m_sortModel); m_listView->setItemDelegate(delegate); m_listView->setVerticalScrollMode(QListView::ScrollPerPixel); connect(m_listView, &QListView::clicked, this, &ServicesSettingsPage::changed); - KNS3::Button* downloadButton = new KNS3::Button(i18nc("@action:button", "Download New Services..."), - "servicemenu.knsrc", - this); + auto *downloadButton = new KNS3::Button(i18nc("@action:button", "Download New Services..."), + QStringLiteral("servicemenu.knsrc"), + this); connect(downloadButton, &KNS3::Button::dialogFinished, this, &ServicesSettingsPage::loadServices); topLayout->addWidget(label); + topLayout->addWidget(m_searchLineEdit); topLayout->addWidget(m_listView); topLayout->addWidget(downloadButton); m_enabledVcsPlugins = VersionControlSettings::enabledPlugins(); - qSort(m_enabledVcsPlugins); + std::sort(m_enabledVcsPlugins.begin(), m_enabledVcsPlugins.end()); } -ServicesSettingsPage::~ServicesSettingsPage() -{ -} +ServicesSettingsPage::~ServicesSettingsPage() = default; void ServicesSettingsPage::applySettings() { @@ -103,12 +104,12 @@ void ServicesSettingsPage::applySettings() return; } - KConfig config("kservicemenurc", KConfig::NoGlobals); + KConfig config(QStringLiteral("kservicemenurc"), KConfig::NoGlobals); KConfigGroup showGroup = config.group("Show"); QStringList enabledPlugins; - const QAbstractItemModel* model = m_listView->model(); + const QAbstractItemModel *model = m_listView->model(); for (int i = 0; i < model->rowCount(); ++i) { const QModelIndex index = model->index(i, 0); const QString service = model->data(index, ServiceModel::DesktopEntryNameRole).toString(); @@ -119,13 +120,13 @@ void ServicesSettingsPage::applySettings() enabledPlugins.append(model->data(index, Qt::DisplayRole).toString()); } } else if (service == QLatin1String(DeleteService)) { - KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig("kdeglobals", KConfig::NoGlobals); + KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig(QStringLiteral("kdeglobals"), KConfig::NoGlobals); KConfigGroup configGroup(globalConfig, "KDE"); configGroup.writeEntry("ShowDeleteCommand", checked); configGroup.sync(); } else if (service == QLatin1String(CopyToMoveToService)) { GeneralSettings::setShowCopyMoveMenu(checked); - GeneralSettings::self()->writeConfig(); + GeneralSettings::self()->save(); } else { showGroup.writeEntry(service, checked); } @@ -135,13 +136,13 @@ void ServicesSettingsPage::applySettings() if (m_enabledVcsPlugins != enabledPlugins) { VersionControlSettings::setEnabledPlugins(enabledPlugins); - VersionControlSettings::self()->writeConfig(); + VersionControlSettings::self()->save(); KMessageBox::information(window(), i18nc("@info", "Dolphin must be restarted to apply the " "updated version control systems settings."), QString(), // default title - QLatin1String("ShowVcsRestartInformation")); + QStringLiteral("ShowVcsRestartInformation")); } } @@ -167,15 +168,15 @@ void ServicesSettingsPage::showEvent(QShowEvent* event) loadVersionControlSystems(); // Add "Show 'Delete' command" as service - KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig("kdeglobals", KConfig::IncludeGlobals); + KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig(QStringLiteral("kdeglobals"), KConfig::IncludeGlobals); KConfigGroup configGroup(globalConfig, "KDE"); - addRow("edit-delete", + addRow(QStringLiteral("edit-delete"), i18nc("@option:check", "Delete"), DeleteService, configGroup.readEntry("ShowDeleteCommand", ShowDeleteDefault)); // Add "Show 'Copy To' and 'Move To' commands" as service - addRow("edit-copy", + addRow(QStringLiteral("edit-copy"), i18nc("@option:check", "'Copy To' and 'Move To' commands"), CopyToMoveToService, GeneralSettings::showCopyMoveMenu()); @@ -189,24 +190,21 @@ void ServicesSettingsPage::showEvent(QShowEvent* event) void ServicesSettingsPage::loadServices() { - const KConfig config("kservicemenurc", KConfig::NoGlobals); + const KConfig config(QStringLiteral("kservicemenurc"), KConfig::NoGlobals); const KConfigGroup showGroup = config.group("Show"); // Load generic services - const KService::List entries = KServiceTypeTrader::self()->query("KonqPopupMenu/Plugin"); - foreach (const KService::Ptr& service, entries) { - const QString file = KStandardDirs::locate("services", service->entryPath()); - const QList serviceActions = - KDesktopFileActions::userDefinedServices(file, true); + const KService::List entries = KServiceTypeTrader::self()->query(QStringLiteral("KonqPopupMenu/Plugin")); + for (const KService::Ptr &service : entries) { + const QString file = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kservices5/" % service->entryPath()); + const QList serviceActions = KDesktopFileActions::userDefinedServices(file, true); - KDesktopFile desktopFile(file); + const KDesktopFile desktopFile(file); const QString subMenuName = desktopFile.desktopGroup().readEntry("X-KDE-Submenu"); - foreach (const KServiceAction& action, serviceActions) { + for (const KServiceAction &action : serviceActions) { const QString serviceName = action.name(); - const bool addService = !action.noDisplay() - && !action.isSeparator() - && !isInServicesList(serviceName); + const bool addService = !action.noDisplay() && !action.isSeparator() && !isInServicesList(serviceName); if (addService) { const QString itemName = subMenuName.isEmpty() @@ -219,8 +217,8 @@ void ServicesSettingsPage::loadServices() } // Load service plugins that implement the KFileItemActionPlugin interface - const KService::List pluginServices = KServiceTypeTrader::self()->query("KFileItemAction/Plugin"); - foreach (const KService::Ptr& service, pluginServices) { + const KService::List pluginServices = KServiceTypeTrader::self()->query(QStringLiteral("KFileItemAction/Plugin")); + for (const KService::Ptr &service : pluginServices) { const QString desktopEntryName = service->desktopEntryName(); if (!isInServicesList(desktopEntryName)) { const bool checked = showGroup.readEntry(desktopEntryName, true); @@ -228,7 +226,21 @@ void ServicesSettingsPage::loadServices() } } + // Load JSON-based plugins that implement the KFileItemActionPlugin interface + const auto jsonPlugins = KPluginLoader::findPlugins(QStringLiteral("kf5/kfileitemaction"), [](const KPluginMetaData& metaData) { + return metaData.serviceTypes().contains(QLatin1String("KFileItemAction/Plugin")); + }); + + for (const auto &jsonMetadata : jsonPlugins) { + const QString desktopEntryName = jsonMetadata.pluginId(); + if (!isInServicesList(desktopEntryName)) { + const bool checked = showGroup.readEntry(desktopEntryName, true); + addRow(jsonMetadata.iconName(), jsonMetadata.name(), desktopEntryName, checked); + } + } + m_sortModel->sort(Qt::DisplayRole); + m_searchLineEdit->setFocus(Qt::OtherFocusReason); } void ServicesSettingsPage::loadVersionControlSystems() @@ -236,10 +248,10 @@ void ServicesSettingsPage::loadVersionControlSystems() const QStringList enabledPlugins = VersionControlSettings::enabledPlugins(); // Create a checkbox for each available version control plugin - const KService::List pluginServices = KServiceTypeTrader::self()->query("FileViewVersionControlPlugin"); - for (KService::List::ConstIterator it = pluginServices.constBegin(); it != pluginServices.constEnd(); ++it) { - const QString pluginName = (*it)->name(); - addRow("code-class", + const KService::List pluginServices = KServiceTypeTrader::self()->query(QStringLiteral("FileViewVersionControlPlugin")); + for (const auto &plugin : pluginServices) { + const QString pluginName = plugin->name(); + addRow(QStringLiteral("code-class"), pluginName, VersionControlServicePrefix + pluginName, enabledPlugins.contains(pluginName)); @@ -248,7 +260,7 @@ void ServicesSettingsPage::loadVersionControlSystems() m_sortModel->sort(Qt::DisplayRole); } -bool ServicesSettingsPage::isInServicesList(const QString& service) const +bool ServicesSettingsPage::isInServicesList(const QString &service) const { for (int i = 0; i < m_serviceModel->rowCount(); ++i) { const QModelIndex index = m_serviceModel->index(i, 0); @@ -259,9 +271,9 @@ bool ServicesSettingsPage::isInServicesList(const QString& service) const return false; } -void ServicesSettingsPage::addRow(const QString& icon, - const QString& text, - const QString& value, +void ServicesSettingsPage::addRow(const QString &icon, + const QString &text, + const QString &value, bool checked) { m_serviceModel->insertRow(0); @@ -273,4 +285,3 @@ void ServicesSettingsPage::addRow(const QString& icon, m_serviceModel->setData(index, checked, Qt::CheckStateRole); } -#include "servicessettingspage.moc"