#include <KIO/EmptyTrashJob>
#include <KIO/JobUiDelegate>
#include <KIO/Paste>
+#include <kio_version.h>
#include <KJobWidgets>
#include <KMimeTypeTrader>
#include <KNewFileMenu>
+#include <KPluginMetaData>
#include <KService>
#include <KLocalizedString>
#include <KStandardAction>
#include <QKeyEvent>
#include <QMenuBar>
#include <QMenu>
+#include <QMimeDatabase>
#include <panels/places/placesitem.h>
#include <panels/places/placesitemmodel.h>
{
Q_ASSERT(m_context & TrashContext);
- QAction* emptyTrashAction = new QAction(QIcon::fromTheme("trash-empty"), i18nc("@action:inmenu", "Empty Trash"), this);
- KConfig trashConfig("trashrc", KConfig::SimpleConfig);
+ QAction* emptyTrashAction = new QAction(QIcon::fromTheme(QStringLiteral("trash-empty")), i18nc("@action:inmenu", "Empty Trash"), this);
+ KConfig trashConfig(QStringLiteral("trashrc"), KConfig::SimpleConfig);
emptyTrashAction->setEnabled(!trashConfig.group("Status").readEntry("Empty", true));
addAction(emptyTrashAction);
addCustomActions();
- QAction* propertiesAction = m_mainWindow->actionCollection()->action("properties");
+ QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties"));
addAction(propertiesAction);
addShowMenuBarAction();
QAction* restoreAction = new QAction(i18nc("@action:inmenu", "Restore"), m_mainWindow);
addAction(restoreAction);
- QAction* deleteAction = m_mainWindow->actionCollection()->action("delete");
+ QAction* deleteAction = m_mainWindow->actionCollection()->action(QStringLiteral("delete"));
addAction(deleteAction);
- QAction* propertiesAction = m_mainWindow->actionCollection()->action("properties");
+ QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties"));
addAction(propertiesAction);
if (exec(m_pos) == restoreAction) {
QList<QUrl> selectedUrls;
+ selectedUrls.reserve(m_selectedItems.count());
foreach (const KFileItem &item, m_selectedItems) {
selectedUrls.append(item.url());
}
QMenu* menu = newFileMenu->menu();
menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New"));
- menu->setIcon(QIcon::fromTheme("document-new"));
+ menu->setIcon(QIcon::fromTheme(QStringLiteral("document-new")));
addMenu(menu);
addSeparator();
// insert 'Open in new window' and 'Open in new tab' entries
- addAction(m_mainWindow->actionCollection()->action("open_in_new_window"));
- addAction(m_mainWindow->actionCollection()->action("open_in_new_tab"));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("open_in_new_window")));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("open_in_new_tab")));
// insert 'Add to Places' entry
if (!placeExists(m_fileInfo.url())) {
- addToPlacesAction = addAction(QIcon::fromTheme("bookmark-new"),
+ addToPlacesAction = addAction(QIcon::fromTheme(QStringLiteral("bookmark-new")),
i18nc("@action:inmenu Add selected folder to places",
"Add to Places"));
}
addSeparator();
- } else if (m_baseUrl.scheme().contains("search") || m_baseUrl.scheme().contains("timeline")) {
- openParentAction = new QAction(QIcon::fromTheme("document-open-folder"),
+ } else if (m_baseUrl.scheme().contains(QStringLiteral("search")) || m_baseUrl.scheme().contains(QStringLiteral("timeline"))) {
+ openParentAction = new QAction(QIcon::fromTheme(QStringLiteral("document-open-folder")),
i18nc("@action:inmenu",
"Open Path"),
this);
addAction(openParentAction);
- openParentInNewWindowAction = new QAction(QIcon::fromTheme("window-new"),
+ openParentInNewWindowAction = new QAction(QIcon::fromTheme(QStringLiteral("window-new")),
i18nc("@action:inmenu",
"Open Path in New Window"),
this);
addAction(openParentInNewWindowAction);
- openParentInNewTabAction = new QAction(QIcon::fromTheme("tab-new"),
+ openParentInNewTabAction = new QAction(QIcon::fromTheme(QStringLiteral("tab-new")),
i18nc("@action:inmenu",
"Open Path in New Tab"),
this);
addSeparator();
} else if (!DolphinView::openItemAsFolderUrl(m_fileInfo).isEmpty()) {
// insert 'Open in new window' and 'Open in new tab' entries
- addAction(m_mainWindow->actionCollection()->action("open_in_new_window"));
- addAction(m_mainWindow->actionCollection()->action("open_in_new_tab"));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("open_in_new_window")));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("open_in_new_tab")));
addSeparator();
}
if (selectionHasOnlyDirs) {
// insert 'Open in new tab' entry
- addAction(m_mainWindow->actionCollection()->action("open_in_new_tabs"));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("open_in_new_tabs")));
addSeparator();
}
}
fileItemActions.setItemListProperties(selectedItemsProps);
addServiceActions(fileItemActions);
- addFileItemPluginActions();
+ addFileItemPluginActions(fileItemActions);
addVersionControlPluginActions();
// insert 'Copy To' and 'Move To' sub menus
if (GeneralSettings::showCopyMoveMenu()) {
- m_copyToMenu.setItems(m_selectedItems);
+ m_copyToMenu.setUrls(m_selectedItems.urlList());
m_copyToMenu.setReadOnly(!selectedItemsProps.supportsWriting());
+ m_copyToMenu.setAutoErrorHandlingEnabled(true);
m_copyToMenu.addActionsTo(this);
}
// insert 'Properties...' entry
- QAction* propertiesAction = m_mainWindow->actionCollection()->action("properties");
+ QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties"));
addAction(propertiesAction);
QAction* activatedAction = exec(m_pos);
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();
}
} else if (activatedAction == openParentAction) {
m_command = OpenParentFolder;
// Insert 'New Window' and 'New Tab' entries. Don't use "open_in_new_window" and
// "open_in_new_tab" here, as the current selection should get ignored.
- addAction(m_mainWindow->actionCollection()->action("new_window"));
- addAction(m_mainWindow->actionCollection()->action("new_tab"));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("new_window")));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("new_tab")));
// Insert 'Add to Places' entry if exactly one item is selected
QAction* addToPlacesAction = 0;
if (!placeExists(m_mainWindow->activeViewContainer()->url())) {
- addToPlacesAction = addAction(QIcon::fromTheme("bookmark-new"),
+ addToPlacesAction = addAction(QIcon::fromTheme(QStringLiteral("bookmark-new")),
i18nc("@action:inmenu Add current folder to places", "Add to Places"));
}
fileItemActions.setItemListProperties(baseUrlProperties);
addServiceActions(fileItemActions);
- addFileItemPluginActions();
+ addFileItemPluginActions(fileItemActions);
addVersionControlPluginActions();
addCustomActions();
- QAction* propertiesAction = m_mainWindow->actionCollection()->action("properties");
+ QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties"));
addAction(propertiesAction);
addShowMenuBarAction();
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();
}
}
}
addSeparator();
// Insert 'Rename'
- QAction* renameAction = collection->action("rename");
+ QAction* renameAction = collection->action(QStringLiteral("rename"));
addAction(renameAction);
// Insert 'Move to Trash' and/or 'Delete'
if (showDeleteAction && showMoveToTrashAction) {
delete m_removeAction;
m_removeAction = 0;
- addAction(m_mainWindow->actionCollection()->action("move_to_trash"));
- addAction(m_mainWindow->actionCollection()->action("delete"));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("move_to_trash")));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("delete")));
} else if (showDeleteAction && !showMoveToTrashAction) {
- addAction(m_mainWindow->actionCollection()->action("delete"));
+ addAction(m_mainWindow->actionCollection()->action(QStringLiteral("delete")));
} else {
if (!m_removeAction) {
m_removeAction = new DolphinRemoveAction(this, m_mainWindow->actionCollection());
bool DolphinContextMenu::placeExists(const QUrl& url) const
{
- PlacesItemModel model;
-
- const int count = model.count();
- for (int i = 0; i < count; ++i) {
- const QUrl placeUrl = model.placesItem(i)->url();
- if (placeUrl.matches(url, QUrl::StripTrailingSlash)) {
- return true;
- }
- }
-
+ // Creating up a PlacesItemModel to find out if 'url' is one of the Places
+ // can be expensive because the model asks Solid for the devices which are
+ // available, which can take some time.
+ // TODO: Consider restoring this check if the handling of Places and devices
+ // will be decoupled in the future.
return false;
}
const QMimeData *mimeData = QApplication::clipboard()->mimeData();
bool canPaste;
const QString text = KIO::pasteActionText(mimeData, &canPaste, m_fileInfo);
- action = new QAction(QIcon::fromTheme("edit-paste"), text, this);
+ action = new QAction(QIcon::fromTheme(QStringLiteral("edit-paste")), text, this);
action->setEnabled(canPaste);
connect(action, &QAction::triggered, m_mainWindow, &DolphinMainWindow::pasteIntoFolder);
} else {
fileItemActions.setParentWidget(m_mainWindow);
// insert 'Open With...' action or sub menu
- fileItemActions.addOpenWithActionsTo(this, "DesktopEntryName != 'dolphin'");
+ fileItemActions.addOpenWithActionsTo(this, QStringLiteral("DesktopEntryName != 'dolphin'"));
// insert 'Actions' sub menu
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());
QString commonMimeType = props.mimeType();
if (commonMimeType.isEmpty()) {
- commonMimeType = QLatin1String("application/octet-stream");
+ commonMimeType = QStringLiteral("application/octet-stream");
}
- const KService::List pluginServices = KMimeTypeTrader::self()->query(commonMimeType, "KFileItemAction/Plugin", "exist Library");
- if (pluginServices.isEmpty()) {
- return;
- }
-
- const KConfig config("kservicemenurc", KConfig::NoGlobals);
+ const KService::List pluginServices = KMimeTypeTrader::self()->query(commonMimeType, QStringLiteral("KFileItemAction/Plugin"), QStringLiteral("exist Library"));
+ 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
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();
}
}
+#endif
}
void DolphinContextMenu::addVersionControlPluginActions()
const DolphinView* view = m_mainWindow->activeViewContainer()->view();
const QList<QAction*> versionControlActions = view->versionControlActions(m_selectedItems);
if (!versionControlActions.isEmpty()) {
- foreach (QAction* action, versionControlActions) {
- addAction(action);
- }
+ addActions(versionControlActions);
addSeparator();
}
}
void DolphinContextMenu::addCustomActions()
{
- foreach (QAction* action, m_customActions) {
- addAction(action);
- }
+ addActions(m_customActions);
}