┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/dolphincontextmenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dolphincontextmenu.cpp')
-rw-r--r--src/dolphincontextmenu.cpp43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp
index dfec76144..971ef1e35 100644
--- a/src/dolphincontextmenu.cpp
+++ b/src/dolphincontextmenu.cpp
@@ -37,6 +37,7 @@
#include <KJobWidgets>
#include <KMimeTypeTrader>
#include <KNewFileMenu>
+#include <KPluginMetaData>
#include <KService>
#include <KLocalizedString>
#include <KStandardAction>
@@ -47,6 +48,7 @@
#include <QKeyEvent>
#include <QMenuBar>
#include <QMenu>
+#include <QMimeDatabase>
#include <panels/places/placesitem.h>
#include <panels/places/placesitemmodel.h>
@@ -496,13 +498,10 @@ void DolphinContextMenu::addFileItemPluginActions()
}
const KService::List pluginServices = KMimeTypeTrader::self()->query(commonMimeType, QStringLiteral("KFileItemAction/Plugin"), QStringLiteral("exist Library"));
- if (pluginServices.isEmpty()) {
- return;
- }
-
const KConfig config(QStringLiteral("kservicemenurc"), KConfig::NoGlobals);
const KConfigGroup showGroup = config.group("Show");
+ QSet<QString> addedPlugins;
foreach (const KService::Ptr& service, pluginServices) {
if (!showGroup.readEntry(service->desktopEntryName(), true)) {
// The plugin has been disabled
@@ -513,6 +512,42 @@ void DolphinContextMenu::addFileItemPluginActions()
if (abstractPlugin) {
abstractPlugin->setParent(this);
addActions(abstractPlugin->actions(props, m_mainWindow));
+ addedPlugins << service->desktopEntryName();
+ }
+ }
+
+ const auto jsonPlugins = KPluginLoader::findPlugins(QStringLiteral("kf5/kfileitemaction"), [=](const KPluginMetaData& metaData) {
+ if (!metaData.serviceTypes().contains(QStringLiteral("KFileItemAction/Plugin"))) {
+ return false;
+ }
+
+ auto mimeType = QMimeDatabase().mimeTypeForName(commonMimeType);
+ foreach (const auto& supportedMimeType, metaData.mimeTypes()) {
+ if (mimeType.inherits(supportedMimeType)) {
+ return true;
+ }
+ }
+
+ return false;
+ });
+
+ foreach (const auto& jsonMetadata, jsonPlugins) {
+ // The plugin has been disabled
+ if (!showGroup.readEntry(jsonMetadata.pluginId(), true)) {
+ continue;
+ }
+
+ // The plugin also has a .desktop file and has already been added.
+ if (addedPlugins.contains(jsonMetadata.pluginId())) {
+ continue;
+ }
+
+ KPluginFactory *factory = KPluginLoader(jsonMetadata.fileName()).factory();
+ KAbstractFileItemActionPlugin* abstractPlugin = factory->create<KAbstractFileItemActionPlugin>();
+ if (abstractPlugin) {
+ abstractPlugin->setParent(this);
+ addActions(abstractPlugin->actions(props, m_mainWindow));
+ addedPlugins << jsonMetadata.pluginId();
}
}
}