diff --git a/app/fileopscontextmanageritem.cpp b/app/fileopscontextmanageritem.cpp --- a/app/fileopscontextmanageritem.cpp +++ b/app/fileopscontextmanageritem.cpp @@ -97,7 +97,7 @@ selectedFiles = contextManager()->selectedFileItemList(); } - return MimeTypeUtils::selectionMimeData(selectedFiles); + return MimeTypeUtils::selectionMimeData(selectedFiles, MimeTypeUtils::ClipboardTarget); } QUrl FileOpsContextManagerItem::pasteTargetUrl() const diff --git a/lib/documentview/documentview.cpp b/lib/documentview/documentview.cpp --- a/lib/documentview/documentview.cpp +++ b/lib/documentview/documentview.cpp @@ -405,7 +405,7 @@ } mDrag = new QDrag(q); const auto itemList = KFileItemList({q->document()->url()}); - mDrag->setMimeData(MimeTypeUtils::selectionMimeData(itemList)); + mDrag->setMimeData(MimeTypeUtils::selectionMimeData(itemList, MimeTypeUtils::DropTarget)); if (q->document()->isModified()) { setDragPixmap(QPixmap::fromImage(q->document()->image())); diff --git a/lib/mimetypeutils.h b/lib/mimetypeutils.h --- a/lib/mimetypeutils.h +++ b/lib/mimetypeutils.h @@ -59,12 +59,17 @@ GWENVIEWLIB_EXPORT Kind urlKind(const QUrl&); GWENVIEWLIB_EXPORT Kind mimeTypeKind(const QString& mimeType); +enum MimeTarget { + ClipboardTarget, + DropTarget +}; + /** * Returns the image data (and also the URL, unless the image * is edited/unsaved) if there is a single image selected. * Otherwise, returns a list of URLs for all selected images. */ -GWENVIEWLIB_EXPORT QMimeData* selectionMimeData(const KFileItemList& selectedFiles); +GWENVIEWLIB_EXPORT QMimeData* selectionMimeData(const KFileItemList& selectedFiles, const MimeTarget& mimeTarget); } // namespace MimeTypeUtils diff --git a/lib/mimetypeutils.cpp b/lib/mimetypeutils.cpp --- a/lib/mimetypeutils.cpp +++ b/lib/mimetypeutils.cpp @@ -165,11 +165,20 @@ return mimeTypeKind(urlMimeType(url)); } -QMimeData* selectionMimeData(const KFileItemList& selectedFiles) +QMimeData* selectionMimeData(const KFileItemList& selectedFiles, const MimeTarget& mimeTarget) { QMimeData* mimeData = new QMimeData; if (selectedFiles.count() == 1) { + + // When a single file is selected, there are a couple of cases: + // - Pasting unmodified images: Set both image data and URL + // (since some apps only support either image data or URL) + // - Dragging unmodified images: Only set URL + // (otherwise dragging to Chromium or the desktop fails, see https://phabricator.kde.org/D13249#300894) + // - Dragging or pasting modified images: Only set image data + // (otherwise some apps prefer the URL, which would only contain the unmodified image) + const QUrl url = selectedFiles.first().url(); const MimeTypeUtils::Kind mimeKind = MimeTypeUtils::urlKind(url); bool documentIsModified = false; @@ -179,25 +188,25 @@ doc->waitUntilLoaded(); documentIsModified = doc->isModified(); - QString suggestedFileName; + if (mimeTarget == ClipboardTarget || (mimeTarget == DropTarget && documentIsModified)) { + QString suggestedFileName; - if (mimeKind == MimeTypeUtils::KIND_RASTER_IMAGE) { - mimeData->setImageData(doc->image()); + if (mimeKind == MimeTypeUtils::KIND_RASTER_IMAGE) { + mimeData->setImageData(doc->image()); - // Set the filename extension to PNG, as it is the first - // entry in the combobox when pasting to Dolphin - suggestedFileName = QFileInfo(url.fileName()).completeBaseName() + QStringLiteral(".png"); - } else { - mimeData->setData(MimeTypeUtils::urlMimeType(url), doc->rawData()); - suggestedFileName = url.fileName(); - } + // Set the filename extension to PNG, as it is the first + // entry in the combobox when pasting to Dolphin + suggestedFileName = QFileInfo(url.fileName()).completeBaseName() + QStringLiteral(".png"); + } else { + mimeData->setData(MimeTypeUtils::urlMimeType(url), doc->rawData()); + suggestedFileName = url.fileName(); + } - mimeData->setData(QStringLiteral("application/x-kde-suggestedfilename"), - QFile::encodeName(suggestedFileName)); + mimeData->setData(QStringLiteral("application/x-kde-suggestedfilename"), + QFile::encodeName(suggestedFileName)); + } } - // Don't set the URL to support pasting edited images to - // applications preferring the URL otherwise, e.g. Dolphin if (!documentIsModified) { mimeData->setUrls({url}); } diff --git a/lib/thumbnailview/thumbnailview.cpp b/lib/thumbnailview/thumbnailview.cpp --- a/lib/thumbnailview/thumbnailview.cpp +++ b/lib/thumbnailview/thumbnailview.cpp @@ -691,7 +691,7 @@ } QDrag* drag = new QDrag(this); - drag->setMimeData(MimeTypeUtils::selectionMimeData(selectedFiles)); + drag->setMimeData(MimeTypeUtils::selectionMimeData(selectedFiles, MimeTypeUtils::DropTarget)); d->initDragPixmap(drag, indexes); drag->exec(Qt::MoveAction | Qt::CopyAction | Qt::LinkAction, Qt::CopyAction); }