X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/5593c252e8d9638c86dcc2bb9edd394ea14f8ba1..01edd6480ca967fefe8dbbf61d9ca1fd9e3889ff:/src/dolphincontextmenu.cpp diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index dfec76144..666b81c8d 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -34,9 +34,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -47,6 +49,7 @@ #include #include #include +#include #include #include @@ -281,7 +284,7 @@ void DolphinContextMenu::openItemContextMenu() fileItemActions.setItemListProperties(selectedItemsProps); addServiceActions(fileItemActions); - addFileItemPluginActions(); + addFileItemPluginActions(fileItemActions); addVersionControlPluginActions(); @@ -304,7 +307,7 @@ void DolphinContextMenu::openItemContextMenu() if (selectedUrl.isValid()) { PlacesItemModel model; const QString text = selectedUrl.fileName(); - PlacesItem* item = model.createPlacesItem(text, selectedUrl); + PlacesItem* item = model.createPlacesItem(text, selectedUrl, KIO::iconNameForUrl(selectedUrl)); model.appendItemToGroup(item); model.saveBookmarks(); } @@ -353,7 +356,7 @@ void DolphinContextMenu::openViewportContextMenu() fileItemActions.setItemListProperties(baseUrlProperties); addServiceActions(fileItemActions); - addFileItemPluginActions(); + addFileItemPluginActions(fileItemActions); addVersionControlPluginActions(); @@ -370,7 +373,8 @@ void DolphinContextMenu::openViewportContextMenu() if (container->url().isValid()) { PlacesItemModel model; PlacesItem* item = model.createPlacesItem(container->placesText(), - container->url()); + container->url(), + KIO::iconNameForUrl(container->url())); model.appendItemToGroup(item); model.saveBookmarks(); } @@ -481,8 +485,12 @@ void DolphinContextMenu::addServiceActions(KFileItemActions& fileItemActions) fileItemActions.addServiceActionsTo(this); } -void DolphinContextMenu::addFileItemPluginActions() +void DolphinContextMenu::addFileItemPluginActions(KFileItemActions& fileItemActions) { +#if KIO_VERSION >= QT_VERSION_CHECK(5, 27, 0) + fileItemActions.addPluginActionsTo(this); +#else + Q_UNUSED(fileItemActions); KFileItemListProperties props; if (m_selectedItems.isEmpty()) { props.setItems(KFileItemList() << baseFileItem()); @@ -496,13 +504,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 addedPlugins; foreach (const KService::Ptr& service, pluginServices) { if (!showGroup.readEntry(service->desktopEntryName(), true)) { // The plugin has been disabled @@ -513,8 +518,45 @@ 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(); + if (abstractPlugin) { + abstractPlugin->setParent(this); + addActions(abstractPlugin->actions(props, m_mainWindow)); + addedPlugins << jsonMetadata.pluginId(); } } +#endif } void DolphinContextMenu::addVersionControlPluginActions()