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 + bool addCompressAndExtractPluginActions(); // 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 @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include "listpanel.h" #include "krview.h" @@ -58,6 +60,31 @@ menu.performAction(result); } +/** + * Copied from dolphin/src/dolphincontextmenu.cpp and modified to add only compress and extract submenus. + */ +bool KrPopupMenu::addCompressAndExtractPluginActions() +{ + + KFileItemListProperties props(_items); + + QVector jsonPlugins = KPluginLoader::findPlugins("kf5/kfileitemaction", + [=](const KPluginMetaData& metaData) { + return metaData.pluginId() == "compressfileitemaction" || metaData.pluginId() == "extractfileitemaction"; + }); + + foreach (const KPluginMetaData &jsonMetadata, jsonPlugins) { + KAbstractFileItemActionPlugin* abstractPlugin = KPluginLoader(jsonMetadata.fileName()) + .factory()->create(); + if (abstractPlugin) { + abstractPlugin->setParent(this); + addActions(abstractPlugin->actions(props, this)); + } + } + + return !jsonPlugins.isEmpty(); +} + KrPopupMenu::KrPopupMenu(KrPanel *thePanel, QWidget *parent) : QMenu(parent), panel(thePanel), empty(false), multipleSelections(false), actions(0), _item(0) { @@ -161,8 +188,18 @@ addAction(uAct); uAct->setText(i18n("User Actions")); - fileItemActions.setItemListProperties(KFileItemListProperties(_items)); - fileItemActions.addServiceActionsTo(this); + // add compress and extract plugins (if available) + bool success = addCompressAndExtractPluginActions(); + + /* + * When KF 5.25 is adopted by all distros, we can remove these 2 lines (and corresponding code) + * because since KF 5.25 compress and extract submenus are standalone plugins. + */ + if (!success) { + fileItemActions.setItemListProperties(KFileItemListProperties(_items)); + fileItemActions.addServiceActionsTo(this); + } + addSeparator(); // ------------- 'create new' submenu