Paste P225

gwenview-mimedata-refactor.patch
ActivePublic

Authored by rkflx on May 27 2018, 10:16 PM.
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 <QAction>
#include <QApplication>
#include <QClipboard>
-#include <QFileInfo>
#include <QListView>
#include <QMenu>
-#include <QMimeData>
#include <QShortcut>
// KDE
@@ -55,9 +53,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// Local
#include <lib/contextmanager.h>
-#include <lib/document/documentfactory.h>
#include <lib/eventwatcher.h>
#include <lib/gvdebug.h>
+#include <lib/mimetypeutils.h>
#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 <QApplication>
#include <QStringList>
#include <QDebug>
+#include <QFileInfo>
#include <QUrl>
+#include <QMimeData>
#include <QMimeDatabase>
#include <QImageReader>
@@ -36,6 +38,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// Local
#include <archiveutils.h>
+#include <lib/document/documentfactory.h>
#include <gvdebug.h>
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);
}