]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphincontextmenu.cpp
Don't load twice kfileitemaction plugins with json metadata
[dolphin.git] / src / dolphincontextmenu.cpp
index dfec76144dafd9210aa8b6f45458ded98e27ab53..971ef1e35fa1f4d64257067a10b3e6a18ccb14b3 100644 (file)
@@ -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();
         }
     }
 }