diff --git a/krusader/Panel/krpopupmenu.h b/krusader/Panel/krpopupmenu.h --- a/krusader/Panel/krpopupmenu.h +++ b/krusader/Panel/krpopupmenu.h @@ -44,6 +44,7 @@ void performAction(int id); void addEmptyMenuEntries(); // adds the choices for a menu without selected items void addCreateNewMenu(); // adds a "create new" submenu + void addFileItemPluginActions(); // adds various plugin actions enum ID { OPEN_ID, diff --git a/krusader/Panel/krpopupmenu.cpp b/krusader/Panel/krpopupmenu.cpp --- a/krusader/Panel/krpopupmenu.cpp +++ b/krusader/Panel/krpopupmenu.cpp @@ -21,6 +21,7 @@ // QtGui #include +#include #include #include @@ -31,6 +32,8 @@ #include #include #include +#include +#include #include "listpanel.h" #include "krview.h" @@ -58,6 +61,64 @@ menu.performAction(result); } +/** + * Copied from dolphin/src/dolphincontextmenu.cpp. + */ +void KrPopupMenu::addFileItemPluginActions() +{ + + KFileItemListProperties props(_items); + + QString commonMimeType = props.mimeType(); + if (commonMimeType.isEmpty()) { + commonMimeType = QStringLiteral("application/octet-stream"); + } + + const KService::List pluginServices = KMimeTypeTrader::self()->query(commonMimeType, QStringLiteral("KFileItemAction/Plugin"), QStringLiteral("exist Library")); + if (pluginServices.isEmpty()) { + return; + } + + QSet addedPlugins; + foreach (const KService::Ptr& service, pluginServices) { + KAbstractFileItemActionPlugin* abstractPlugin = service->createInstance(); + if (abstractPlugin) { + abstractPlugin->setParent(this); + addActions(abstractPlugin->actions(props, this)); + 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 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, this)); + } + } +} + KrPopupMenu::KrPopupMenu(KrPanel *thePanel, QWidget *parent) : QMenu(parent), panel(thePanel), empty(false), multipleSelections(false), actions(0), _item(0) { @@ -163,6 +224,7 @@ fileItemActions.setItemListProperties(KFileItemListProperties(_items)); fileItemActions.addServiceActionsTo(this); + addFileItemPluginActions(); addSeparator(); // ------------- 'create new' submenu