diff --git a/plugins/projectmanagerview/projectmanagerviewplugin.h b/plugins/projectmanagerview/projectmanagerviewplugin.h --- a/plugins/projectmanagerview/projectmanagerviewplugin.h +++ b/plugins/projectmanagerview/projectmanagerviewplugin.h @@ -40,6 +40,7 @@ class Context; } +class QMimeData; class ProjectManagerView; class ProjectManagerViewPlugin: public KDevelop::IPlugin @@ -81,6 +82,7 @@ void createFolderFromContextMenu(); void createFileFromContextMenu(); void removeFromContextMenu(); + void cutFromContextMenu(); void removeTargetFilesFromContextMenu(); void renameItemFromContextMenu(); void updateActionState( KDevelop::Context* ctx ); @@ -91,6 +93,10 @@ QList collectItems(); QList collectAllProjects(); void runBuilderJob( KDevelop::BuilderJob::BuildType type, QList items ); + + // Returns nullptr iff the list of URLs to copy/cut was empty + QMimeData* createClipboardMimeData(bool cut); + class ProjectManagerViewPluginPrivate* const d; }; diff --git a/plugins/projectmanagerview/projectmanagerviewplugin.cpp b/plugins/projectmanagerview/projectmanagerviewplugin.cpp --- a/plugins/projectmanagerview/projectmanagerviewplugin.cpp +++ b/plugins/projectmanagerview/projectmanagerviewplugin.cpp @@ -32,6 +32,9 @@ #include #include #include +#include +#include +#include #include #include @@ -289,6 +292,11 @@ remove->setIcon(QIcon::fromTheme(QStringLiteral("user-trash"))); connect( remove, &QAction::triggered, this, &ProjectManagerViewPlugin::removeFromContextMenu ); menuExt.addAction( ContextMenuExtension::FileGroup, remove ); + + QAction* cut = KStandardAction::cut(this, SLOT(cutFromContextMenu()), this); + cut->setShortcutContext(Qt::WidgetShortcut); + menuExt.addAction(ContextMenuExtension::FileGroup, cut); + QAction* rename = new QAction( i18n( "Rename..." ), this ); rename->setIcon(QIcon::fromTheme(QStringLiteral("edit-rename"))); connect( rename, &QAction::triggered, this, &ProjectManagerViewPlugin::renameItemFromContextMenu ); @@ -656,21 +664,40 @@ } } -void ProjectManagerViewPlugin::copyFromContextMenu() +QMimeData* ProjectManagerViewPlugin::createClipboardMimeData(bool cut) { - KDevelop::ProjectItemContext* ctx = dynamic_cast(ICore::self()->selectionController()->currentSelection()); + KDevelop::ProjectItemContext* ctx = dynamic_cast( + ICore::self()->selectionController()->currentSelection()); QList urls; + QList mostLocalUrls; + bool dummy; foreach (ProjectBaseItem* item, ctx->items()) { if (item->folder() || item->file()) { - urls << item->path().toUrl(); + const QUrl& url = item->path().toUrl(); + urls << url; + mostLocalUrls << KFileItem(url).mostLocalUrl(dummy); } } qCDebug(PLUGIN_PROJECTMANAGERVIEW) << urls; - if (!urls.isEmpty()) { - QMimeData* data = new QMimeData; - data->setUrls(urls); - qApp->clipboard()->setMimeData(data); + + if (urls.isEmpty()) { + return nullptr; } + + QMimeData* mimeData = new QMimeData; + KIO::setClipboardDataCut(mimeData, cut); + KUrlMimeData::setUrls(urls, mostLocalUrls, mimeData); + return mimeData; +} + +void ProjectManagerViewPlugin::copyFromContextMenu() +{ + qApp->clipboard()->setMimeData(createClipboardMimeData(false)); +} + +void ProjectManagerViewPlugin::cutFromContextMenu() +{ + qApp->clipboard()->setMimeData(createClipboardMimeData(true)); } void ProjectManagerViewPlugin::pasteFromContextMenu()