From d48b73349241a46ad70cac5a5ce3e11f641650af Mon Sep 17 00:00:00 2001 From: Elvis Angelaccio Date: Wed, 8 Jun 2016 15:30:52 +0200 Subject: Load KFileItemAction plugins with json metadata REVIEW: 128088 --- src/dolphincontextmenu.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/dolphincontextmenu.cpp') diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index dfec76144..823c9340f 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -503,6 +504,7 @@ void DolphinContextMenu::addFileItemPluginActions() const KConfig config(QStringLiteral("kservicemenurc"), KConfig::NoGlobals); const KConfigGroup showGroup = config.group("Show"); + QSet addedPlugins; foreach (const KService::Ptr& service, pluginServices) { if (!showGroup.readEntry(service->desktopEntryName(), true)) { // The plugin has been disabled @@ -510,6 +512,30 @@ void DolphinContextMenu::addFileItemPluginActions() } KAbstractFileItemActionPlugin* abstractPlugin = service->createInstance(); + if (abstractPlugin) { + abstractPlugin->setParent(this); + addActions(abstractPlugin->actions(props, m_mainWindow)); + addedPlugins << service->desktopEntryName(); + } + } + + const auto jsonPlugins = KPluginLoader::findPlugins(QString(), [](const KPluginMetaData& metaData) { + return metaData.serviceTypes().contains(QStringLiteral("KFileItemAction/Plugin")); + }); + + 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(); if (abstractPlugin) { abstractPlugin->setParent(this); addActions(abstractPlugin->actions(props, m_mainWindow)); -- cgit v1.3 From 6bb62f17b525baf89e7f35f4f3a321876c3a31ab Mon Sep 17 00:00:00 2001 From: Elvis Angelaccio Date: Sat, 18 Jun 2016 17:47:07 +0200 Subject: Look for kfileitemaction plugins in the expected subfolder For a rationale, see https://git.reviewboard.kde.org/r/128225/ --- src/dolphincontextmenu.cpp | 2 +- src/settings/services/servicessettingspage.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/dolphincontextmenu.cpp') diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index 823c9340f..ff2e5478a 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -519,7 +519,7 @@ void DolphinContextMenu::addFileItemPluginActions() } } - const auto jsonPlugins = KPluginLoader::findPlugins(QString(), [](const KPluginMetaData& metaData) { + const auto jsonPlugins = KPluginLoader::findPlugins(QStringLiteral("kf5/kfileitemaction"), [](const KPluginMetaData& metaData) { return metaData.serviceTypes().contains(QStringLiteral("KFileItemAction/Plugin")); }); diff --git a/src/settings/services/servicessettingspage.cpp b/src/settings/services/servicessettingspage.cpp index e124fb2c5..2b9b8f46f 100644 --- a/src/settings/services/servicessettingspage.cpp +++ b/src/settings/services/servicessettingspage.cpp @@ -230,7 +230,7 @@ void ServicesSettingsPage::loadServices() } // Load JSON-based plugins that implement the KFileItemActionPlugin interface - const auto jsonPlugins = KPluginLoader::findPlugins(QString(), [](const KPluginMetaData& metaData) { + const auto jsonPlugins = KPluginLoader::findPlugins(QStringLiteral("kf5/kfileitemaction"), [](const KPluginMetaData& metaData) { return metaData.serviceTypes().contains(QStringLiteral("KFileItemAction/Plugin")); }); -- cgit v1.3 From 809ba746952c9768de0163153215d95bd233f5c6 Mon Sep 17 00:00:00 2001 From: Elvis Angelaccio Date: Tue, 23 Aug 2016 17:58:48 +0200 Subject: Filter json-only KFileItemAction plugins by mimetype Commit d48b733 introduced support for kfileitemaction plugins with json metadata, but forgot to filter them by the commonMimeType (like KMimeTypeTrader::query() does with old-style plugins). So we need to load a plugin only when commonMimeType is equal to (or child of) one of the mimetypes supported by the plugin. --- src/dolphincontextmenu.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src/dolphincontextmenu.cpp') diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index ff2e5478a..9507ba0a8 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -48,6 +48,7 @@ #include #include #include +#include #include #include @@ -519,8 +520,19 @@ void DolphinContextMenu::addFileItemPluginActions() } } - const auto jsonPlugins = KPluginLoader::findPlugins(QStringLiteral("kf5/kfileitemaction"), [](const KPluginMetaData& metaData) { - return metaData.serviceTypes().contains(QStringLiteral("KFileItemAction/Plugin")); + 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) { -- cgit v1.3 From abaf20f11409657888b1442c3d6c745de1d8f0c9 Mon Sep 17 00:00:00 2001 From: Elvis Angelaccio Date: Sat, 10 Sep 2016 21:52:02 +0200 Subject: Fix logic for loading kfileitemaction plugins Since dolphin is now loading also plugins with json metadata, it is wrong to return here, as those plugins could be missed. --- src/dolphincontextmenu.cpp | 4 ---- 1 file changed, 4 deletions(-) (limited to 'src/dolphincontextmenu.cpp') diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index 9507ba0a8..5bfa06689 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -498,10 +498,6 @@ 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"); -- cgit v1.3 From e93e6d4cc5231c5ee209f1ac9df70bbb253ce786 Mon Sep 17 00:00:00 2001 From: Elvis Angelaccio Date: Sat, 10 Sep 2016 21:57:58 +0200 Subject: Don't load twice kfileitemaction plugins with json metadata --- src/dolphincontextmenu.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/dolphincontextmenu.cpp') diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index 5bfa06689..971ef1e35 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -547,6 +547,7 @@ void DolphinContextMenu::addFileItemPluginActions() if (abstractPlugin) { abstractPlugin->setParent(this); addActions(abstractPlugin->actions(props, m_mainWindow)); + addedPlugins << jsonMetadata.pluginId(); } } } -- cgit v1.3