X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a512176b4bdbf0f0471a9b9089f4a936c14e2732..863ee3a87cee8b1f22a311d6a6a62e56714b5eae:/src/settings/contextmenu/contextmenusettingspage.cpp diff --git a/src/settings/contextmenu/contextmenusettingspage.cpp b/src/settings/contextmenu/contextmenusettingspage.cpp index 4f126d3e2..78d8ccf8a 100644 --- a/src/settings/contextmenu/contextmenusettingspage.cpp +++ b/src/settings/contextmenu/contextmenusettingspage.cpp @@ -6,61 +6,67 @@ #include "contextmenusettingspage.h" +#include "dolphin_contextmenusettings.h" #include "dolphin_generalsettings.h" #include "dolphin_versioncontrolsettings.h" -#include "dolphin_contextmenusettings.h" +#include "global.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 namespace { - const bool ShowDeleteDefault = false; - const char VersionControlServicePrefix[] = "_version_control_"; - const char DeleteService[] = "_delete"; - const char CopyToMoveToService[] ="_copy_to_move_to"; - const char AddToPlacesService[] = "_add_to_places"; - const char SortByService[] = "_sort_by"; - const char ViewModeService[] = "_view_mode"; - const char OpenInNewTabService[] = "_open_in_new_tab"; - const char OpenInNewWindowService[] = "_open_in_new_window"; - const char CopyLocationService[] = "_copy_location"; - const char DuplicateHereService[] = "_duplicate_here"; +const bool ShowDeleteDefault = false; +const char VersionControlServicePrefix[] = "_version_control_"; +const char DeleteService[] = "_delete"; +const char CopyToMoveToService[] = "_copy_to_move_to"; + +bool laterSelected = false; } -ContextMenuSettingsPage::ContextMenuSettingsPage(QWidget* parent) : - SettingsPageBase(parent), - m_initialized(false), - m_serviceModel(nullptr), - m_sortModel(nullptr), - m_listView(nullptr), - m_enabledVcsPlugins() +ContextMenuSettingsPage::ContextMenuSettingsPage(QWidget *parent, const KActionCollection *actions, const QStringList &actionIds) + : SettingsPageBase(parent) + , m_initialized(false) + , m_serviceModel(nullptr) + , m_sortModel(nullptr) + , m_listView(nullptr) + , m_enabledVcsPlugins() + , m_actions(actions) + , m_actionIds(actionIds) { - QVBoxLayout* topLayout = new QVBoxLayout(this); + QVBoxLayout *topLayout = new QVBoxLayout(this); - QLabel* label = new QLabel(i18nc("@label:textbox", + QLabel *label = new QLabel(i18nc("@label:textbox", "Select which services should " - "be shown in the context menu:"), this); + "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){ + connect(m_searchLineEdit, &QLineEdit::textChanged, this, [this](const QString &filter) { m_sortModel->setFilterFixedString(filter); }); @@ -80,31 +86,79 @@ ContextMenuSettingsPage::ContextMenuSettingsPage(QWidget* parent) : m_listView->setVerticalScrollMode(QListView::ScrollPerPixel); connect(m_listView, &QListView::clicked, this, &ContextMenuSettingsPage::changed); -#ifndef Q_OS_WIN - auto *downloadButton = new KNS3::Button(i18nc("@action:button", "Download New Services..."), - QStringLiteral("servicemenu.knsrc"), - this); - connect(downloadButton, &KNS3::Button::dialogFinished, this, [this](const KNS3::Entry::List &changedEntries) { - if (!changedEntries.isEmpty()) { - m_serviceModel->clear(); - loadServices(); - } - }); - -#endif - topLayout->addWidget(label); topLayout->addWidget(m_searchLineEdit); topLayout->addWidget(m_listView); + #ifndef Q_OS_WIN + using NewStuffButton = KNSWidgets::Button; + auto *downloadButton = new NewStuffButton(i18nc("@action:button", "Download New Services..."), QStringLiteral("servicemenu.knsrc"), this); + connect(downloadButton, &NewStuffButton::dialogFinished, this, [this](const auto &changedEntries) { + if (!changedEntries.isEmpty()) { + m_serviceModel->clear(); + loadServices(); + } + }); topLayout->addWidget(downloadButton); -#endif +#endif // Q_OS_WIN m_enabledVcsPlugins = VersionControlSettings::enabledPlugins(); std::sort(m_enabledVcsPlugins.begin(), m_enabledVcsPlugins.end()); } -ContextMenuSettingsPage::~ContextMenuSettingsPage() { +ContextMenuSettingsPage::~ContextMenuSettingsPage() +{ +} + +bool ContextMenuSettingsPage::entryVisible(const QString &id) +{ + if (id == "add_to_places") { + return ContextMenuSettings::showAddToPlaces(); + } else if (id == "sort") { + return ContextMenuSettings::showSortBy(); + } else if (id == "view_mode") { + return ContextMenuSettings::showViewMode(); + } else if (id == "open_in_new_tab") { + return ContextMenuSettings::showOpenInNewTab(); + } else if (id == "open_in_new_window") { + return ContextMenuSettings::showOpenInNewWindow(); + } else if (id == "copy_location") { + return ContextMenuSettings::showCopyLocation(); + } else if (id == "duplicate") { + return ContextMenuSettings::showDuplicateHere(); + } else if (id == "open_terminal_here") { + return ContextMenuSettings::showOpenTerminal(); + } else if (id == "copy_to_inactive_split_view") { + return ContextMenuSettings::showCopyToOtherSplitView(); + } else if (id == "move_to_inactive_split_view") { + return ContextMenuSettings::showMoveToOtherSplitView(); + } + return false; +} + +void ContextMenuSettingsPage::setEntryVisible(const QString &id, bool visible) +{ + if (id == "add_to_places") { + ContextMenuSettings::setShowAddToPlaces(visible); + } else if (id == "sort") { + ContextMenuSettings::setShowSortBy(visible); + } else if (id == "view_mode") { + ContextMenuSettings::setShowViewMode(visible); + } else if (id == "open_in_new_tab") { + ContextMenuSettings::setShowOpenInNewTab(visible); + } else if (id == "open_in_new_window") { + ContextMenuSettings::setShowOpenInNewWindow(visible); + } else if (id == "copy_location") { + ContextMenuSettings::setShowCopyLocation(visible); + } else if (id == "duplicate") { + ContextMenuSettings::setShowDuplicateHere(visible); + } else if (id == "open_terminal_here") { + ContextMenuSettings::setShowOpenTerminal(visible); + } else if (id == "copy_to_inactive_split_view") { + ContextMenuSettings::setShowCopyToOtherSplitView(visible); + } else if (id == "move_to_inactive_split_view") { + ContextMenuSettings::setShowMoveToOtherSplitView(visible); + } } void ContextMenuSettingsPage::applySettings() @@ -136,26 +190,8 @@ void ContextMenuSettingsPage::applySettings() } else if (service == QLatin1String(CopyToMoveToService)) { ContextMenuSettings::setShowCopyMoveMenu(checked); ContextMenuSettings::self()->save(); - } else if (service == QLatin1String(AddToPlacesService)) { - ContextMenuSettings::setShowAddToPlaces(checked); - ContextMenuSettings::self()->save(); - } else if (service == QLatin1String(SortByService)) { - ContextMenuSettings::setShowSortBy(checked); - ContextMenuSettings::self()->save(); - } else if (service == QLatin1String(ViewModeService)) { - ContextMenuSettings::setShowViewMode(checked); - ContextMenuSettings::self()->save(); - } else if (service == QLatin1String(OpenInNewTabService)) { - ContextMenuSettings::setShowOpenInNewTab(checked); - ContextMenuSettings::self()->save(); - } else if (service == QLatin1String(OpenInNewWindowService)) { - ContextMenuSettings::setShowOpenInNewWindow(checked); - ContextMenuSettings::self()->save(); - } else if (service == QLatin1String(CopyLocationService)) { - ContextMenuSettings::setShowCopyLocation(checked); - ContextMenuSettings::self()->save(); - } else if (service == QLatin1String(DuplicateHereService)) { - ContextMenuSettings::setShowDuplicateHere(checked); + } else if (m_actionIds.contains(service)) { + setEntryVisible(service, checked); ContextMenuSettings::self()->save(); } else { showGroup.writeEntry(service, checked); @@ -168,29 +204,48 @@ void ContextMenuSettingsPage::applySettings() VersionControlSettings::setEnabledPlugins(enabledPlugins); VersionControlSettings::self()->save(); - KMessageBox::information(window(), - i18nc("@info", "Dolphin must be restarted to apply the " - "updated version control systems settings."), - QString(), // default title - QStringLiteral("ShowVcsRestartInformation")); + if (!laterSelected) { +#if KWIDGETSADDONS_VERSION >= QT_VERSION_CHECK(5, 100, 0) + KMessageBox::ButtonCode promptRestart = + KMessageBox::questionTwoActions(window(), +#else + KMessageBox::ButtonCode promptRestart = + KMessageBox::questionYesNo(window(), +#endif + i18nc("@info", + "Dolphin must be restarted to apply the " + "updated version control system settings."), + i18nc("@info", "Restart now?"), + KGuiItem(QApplication::translate("KStandardGuiItem", "&Restart"), QStringLiteral("dialog-restart")), + KGuiItem(QApplication::translate("KStandardGuiItem", "&Later"), QStringLiteral("dialog-later"))); +#if KWIDGETSADDONS_VERSION >= QT_VERSION_CHECK(5, 100, 0) + if (promptRestart == KMessageBox::ButtonCode::PrimaryAction) { +#else + if (promptRestart == KMessageBox::ButtonCode::Yes) { +#endif + Dolphin::openNewWindow(); + qApp->quit(); + } else { + laterSelected = true; + } + } } } void ContextMenuSettingsPage::restoreDefaults() { - QAbstractItemModel* model = m_listView->model(); + 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(); - const bool checked = !service.startsWith(VersionControlServicePrefix) - && service != QLatin1String(DeleteService) - && service != QLatin1String(CopyToMoveToService); + const bool checked = + !service.startsWith(VersionControlServicePrefix) && service != QLatin1String(DeleteService) && service != QLatin1String(CopyToMoveToService); model->setData(index, checked, Qt::CheckStateRole); } } -void ContextMenuSettingsPage::showEvent(QShowEvent* event) +void ContextMenuSettingsPage::showEvent(QShowEvent *event) { if (!event->spontaneous() && !m_initialized) { loadServices(); @@ -200,10 +255,7 @@ void ContextMenuSettingsPage::showEvent(QShowEvent* event) // Add "Show 'Delete' command" as service KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig(QStringLiteral("kdeglobals"), KConfig::IncludeGlobals); KConfigGroup configGroup(globalConfig, "KDE"); - addRow(QStringLiteral("edit-delete"), - i18nc("@option:check", "Delete"), - DeleteService, - configGroup.readEntry("ShowDeleteCommand", ShowDeleteDefault)); + addRow(QStringLiteral("edit-delete"), i18nc("@option:check", "Delete"), DeleteService, configGroup.readEntry("ShowDeleteCommand", ShowDeleteDefault)); // Add "Show 'Copy To' and 'Move To' commands" as service addRow(QStringLiteral("edit-copy"), @@ -211,35 +263,15 @@ void ContextMenuSettingsPage::showEvent(QShowEvent* event) CopyToMoveToService, ContextMenuSettings::showCopyMoveMenu()); - // Add other built-in actions - addRow(QStringLiteral("bookmark-new"), - i18nc("@option:check", "Add to Places"), - AddToPlacesService, - ContextMenuSettings::showAddToPlaces()); - addRow(QStringLiteral("view-sort"), - i18nc("@option:check", "Sort By"), - SortByService, - ContextMenuSettings::showSortBy()); - addRow(QStringLiteral("view-list-icons"), - i18nc("@option:check", "View Mode"), - ViewModeService, - ContextMenuSettings::showViewMode()); - addRow(QStringLiteral("folder-new"), - i18nc("@option:check", "'Open in New Tab' and 'Open in New Tabs'"), - OpenInNewTabService, - ContextMenuSettings::showOpenInNewTab()); - addRow(QStringLiteral("window-new"), - i18nc("@option:check", "Open in New Window"), - OpenInNewWindowService, - ContextMenuSettings::showOpenInNewWindow()); - addRow(QStringLiteral("edit-copy"), - i18nc("@option:check", "Copy Location"), - CopyLocationService, - ContextMenuSettings::showCopyLocation()); - addRow(QStringLiteral("edit-copy"), - i18nc("@option:check", "Duplicate Here"), - DuplicateHereService, - ContextMenuSettings::showDuplicateHere()); + if (m_actions) { + // Add other built-in actions + for (const QString &id : m_actionIds) { + const QAction *action = m_actions->action(id); + if (action) { + addRow(action->icon().name(), action->text(), id, entryVisible(id)); + } + } + } m_sortModel->sort(Qt::DisplayRole); @@ -254,10 +286,11 @@ void ContextMenuSettingsPage::loadServices() const KConfigGroup showGroup = config.group("Show"); // Load generic services - 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); + const auto locations = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("kio/servicemenus"), QStandardPaths::LocateDirectory); + QStringList files = KFileUtils::findAllUniqueFiles(locations); + + for (const auto &file : qAsConst(files)) { + const QList serviceActions = KDesktopFileActions::userDefinedServices(KService(file), true); const KDesktopFile desktopFile(file); const QString subMenuName = desktopFile.desktopGroup().readEntry("X-KDE-Submenu"); @@ -267,29 +300,15 @@ void ContextMenuSettingsPage::loadServices() const bool addService = !action.noDisplay() && !action.isSeparator() && !isInServicesList(serviceName); if (addService) { - const QString itemName = subMenuName.isEmpty() - ? action.text() - : i18nc("@item:inmenu", "%1: %2", subMenuName, action.text()); + const QString itemName = subMenuName.isEmpty() ? action.text() : i18nc("@item:inmenu", "%1: %2", subMenuName, action.text()); const bool checked = showGroup.readEntry(serviceName, true); addRow(action.icon(), itemName, serviceName, checked); } } } - // Load service plugins that implement the KFileItemActionPlugin interface - 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); - addRow(service->icon(), service->name(), desktopEntryName, checked); - } - } - // 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")); - }); + const auto jsonPlugins = KPluginMetaData::findPlugins(QStringLiteral("kf" QT_STRINGIFY(QT_MAJOR_VERSION)) + QStringLiteral("/kfileitemaction")); for (const auto &jsonMetadata : jsonPlugins) { const QString desktopEntryName = jsonMetadata.pluginId(); @@ -308,13 +327,13 @@ void ContextMenuSettingsPage::loadVersionControlSystems() const QStringList enabledPlugins = VersionControlSettings::enabledPlugins(); // Create a checkbox for each available version control plugin - 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)); + QSet loadedPlugins; + + const QVector plugins = KPluginMetaData::findPlugins(QStringLiteral("dolphin/vcs")); + for (const auto &plugin : plugins) { + const QString pluginName = plugin.name(); + addRow(QStringLiteral("code-class"), pluginName, VersionControlServicePrefix + pluginName, enabledPlugins.contains(pluginName)); + loadedPlugins += pluginName; } m_sortModel->sort(Qt::DisplayRole); @@ -331,10 +350,7 @@ bool ContextMenuSettingsPage::isInServicesList(const QString &service) const return false; } -void ContextMenuSettingsPage::addRow(const QString &icon, - const QString &text, - const QString &value, - bool checked) +void ContextMenuSettingsPage::addRow(const QString &icon, const QString &text, const QString &value, bool checked) { m_serviceModel->insertRow(0);