diff --git a/app/fileopscontextmanageritem.cpp b/app/fileopscontextmanageritem.cpp index 98b8bb53..04547b12 100644 --- a/app/fileopscontextmanageritem.cpp +++ b/app/fileopscontextmanageritem.cpp @@ -26,10 +26,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include -#include #include #include -#include #include // KDE @@ -55,9 +53,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Local #include -#include #include #include +#include #include "fileoperations.h" #include "sidebar.h" @@ -90,51 +88,16 @@ void FileOpsContextManagerItem::updateServiceList() QMimeData* FileOpsContextManagerItem::selectionMimeData() { - QMimeData* mimeData = new QMimeData; - KFileItemList list = contextManager()->selectedFileItemList(); - const bool viewModeActive = !mThumbnailView->isVisible(); - - // Return the URL and/or the (possibly edited but unsaved) image data of - // - the current image in View/Compare mode - // - a single selected image in Browse mode - // Otherwise, return a list of URLs for multiple selected images in Browse mode - if (viewModeActive || list.count() == 1) { - const QUrl url = viewModeActive ? contextManager()->currentUrl() : list.first().url(); - const MimeTypeUtils::Kind mimeKind = MimeTypeUtils::urlKind(url); - bool documentIsModified = false; - - if (mimeKind == MimeTypeUtils::KIND_RASTER_IMAGE || mimeKind == MimeTypeUtils::KIND_SVG_IMAGE) { - const Document::Ptr doc = DocumentFactory::instance()->load(url); - doc->waitUntilLoaded(); - documentIsModified = doc->isModified(); - - QString suggestedFileName; - - 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(); - } - - mimeData->setData(QStringLiteral("application/x-kde-suggestedfilename"), - QFile::encodeName(suggestedFileName)); - } + KFileItemList selectedFiles; - // Don't set the URL to support pasting edited images to - // applications preferring the URL otherwise, e.g. Dolphin - if (!documentIsModified) { - mimeData->setUrls({url}); - } + // In Compare mode, restrict the returned mimedata to the focused image + if (!mThumbnailView->isVisible()) { + selectedFiles << KFileItem(contextManager()->currentUrl()); } else { - mimeData->setUrls(list.urlList()); + selectedFiles = contextManager()->selectedFileItemList(); } - return mimeData; + return MimeTypeUtils::selectionMimeData(selectedFiles); } QUrl FileOpsContextManagerItem::pasteTargetUrl() const diff --git a/lib/mimetypeutils.cpp b/lib/mimetypeutils.cpp index 2e8eda31..2103053a 100644 --- a/lib/mimetypeutils.cpp +++ b/lib/mimetypeutils.cpp @@ -25,7 +25,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include +#include #include +#include #include #include @@ -36,6 +38,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Local #include +#include #include namespace Gwenview @@ -162,6 +165,49 @@ Kind urlKind(const QUrl &url) return mimeTypeKind(urlMimeType(url)); } +QMimeData* selectionMimeData(const KFileItemList& selectedFiles) +{ + QMimeData* mimeData = new QMimeData; + + if (selectedFiles.count() == 1) { + const QUrl url = selectedFiles.first().url(); + const MimeTypeUtils::Kind mimeKind = MimeTypeUtils::urlKind(url); + bool documentIsModified = false; + + if (mimeKind == MimeTypeUtils::KIND_RASTER_IMAGE || mimeKind == MimeTypeUtils::KIND_SVG_IMAGE) { + const Document::Ptr doc = DocumentFactory::instance()->load(url); + doc->waitUntilLoaded(); + documentIsModified = doc->isModified(); + + QString suggestedFileName; + + 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(); + } + + 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}); + } + } else { + mimeData->setUrls(selectedFiles.urlList()); + } + + return mimeData; +} + DataAccumulator::DataAccumulator(KIO::TransferJob* job) : QObject() , mFinished(false) diff --git a/lib/mimetypeutils.h b/lib/mimetypeutils.h index cc7d291a..b483964c 100644 --- a/lib/mimetypeutils.h +++ b/lib/mimetypeutils.h @@ -27,8 +27,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class QStringList; class KFileItem; +class KFileItemList; class QUrl; class QString; +class QMimeData; + namespace Gwenview { @@ -56,6 +59,13 @@ GWENVIEWLIB_EXPORT Kind fileItemKind(const KFileItem&); GWENVIEWLIB_EXPORT Kind urlKind(const QUrl&); GWENVIEWLIB_EXPORT Kind mimeTypeKind(const QString& mimeType); +/** + * 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); + } // namespace MimeTypeUtils } // namespace Gwenview diff --git a/lib/thumbnailview/thumbnailview.cpp b/lib/thumbnailview/thumbnailview.cpp index e0183e95..f09620da 100644 --- a/lib/thumbnailview/thumbnailview.cpp +++ b/lib/thumbnailview/thumbnailview.cpp @@ -680,12 +680,18 @@ bool ThumbnailView::isBusy(const QModelIndex& index) const void ThumbnailView::startDrag(Qt::DropActions supportedActions) { - QModelIndexList indexes = selectionModel()->selectedIndexes(); + const QModelIndexList indexes = selectionModel()->selectedIndexes(); if (indexes.isEmpty()) { return; } + + KFileItemList selectedFiles; + for(const auto index : indexes) { + selectedFiles << fileItemForIndex(index); + } + QDrag* drag = new QDrag(this); - drag->setMimeData(model()->mimeData(indexes)); + drag->setMimeData(MimeTypeUtils::selectionMimeData(selectedFiles)); d->initDragPixmap(drag, indexes); drag->exec(supportedActions, Qt::CopyAction); }