10#include <QApplication>
17#include <QScopedPointer>
18#include <QTemporaryFile>
62 : clipboard(QApplication::clipboard())
94 int overridePasteBehaviour)
const
96 const QMimeData *cbData =
d->
clipboard->mimeData();
102 dbgUI << Q_FUNC_INFO;
103 dbgUI <<
"\tFormats: " << cbData->formats();
104 dbgUI <<
"\tUrls: " << cbData->urls();
105 dbgUI <<
"\tHas images: " << cbData->hasImage();
113 clip->setDefaultBounds(defaultBounds);
122 const QMimeData *cbData =
d->
clipboard->mimeData();
128 dbgUI << Q_FUNC_INFO;
129 dbgUI <<
"\tFormats: " << cbData->formats();
130 dbgUI <<
"\tUrls: " << cbData->urls();
131 dbgUI <<
"\tHas images: " << cbData->hasImage();
144 const QMimeData *cbData =
d->
clipboard->mimeData();
151 const auto &urls = cbData->urls();
162 if (!data)
return result;
164 const KisMimeData *mimedata = qobject_cast<const KisMimeData *>(data);
165 if (!mimedata)
return result;
175 if (!data)
return resultImage;
177 const KisMimeData *mimedata = qobject_cast<const KisMimeData *>(data);
178 if (!mimedata)
return resultImage;
183QPair<bool, KisClipboard::PasteFormatBehaviour>
195QPair<bool, KisClipboard::PasteFormatBehaviour>
200 bool saveSourceSetting =
false;
204 if (!qimage.isNull() || !urls.isEmpty()) {
209 std::for_each(urls.constBegin(), urls.constEnd(), [&](
const QUrl &url) {
210 local |= url.isLocalFile();
211 remote |= !url.isLocalFile();
212 isURI |= url.scheme() ==
"data";
215 const bool hasMultipleFormatsAvailable = (remote && local)
216 || (remote && !qimage.isNull()) || (local && !qimage.isNull());
218 const bool defaultOptionUnavailable =
223 dbgUI <<
"Incoming paste event:";
224 dbgUI <<
"\tHas attached bitmap:" << !qimage.isNull();
225 dbgUI <<
"\tHas local images:" << local;
226 dbgUI <<
"\tHas remote images:" << remote;
227 dbgUI <<
"\tHas multiple formats:" << hasMultipleFormatsAvailable;
228 dbgUI <<
"\tDefault source preference" << choice;
229 dbgUI <<
"\tDefault source available:" << !defaultOptionUnavailable;
230 dbgUI <<
"\tIs data URI:" << isURI;
239 if (dlg.exec() != KoDialog::Accepted) {
251 }
else if (!qimage.isNull()) {
261 if (saveSourceSetting) {
265 dbgUI <<
"Selected source for the paste:" << choice;
267 return {
true, choice};
274 int overridePasteBehaviour,
275 QPair<bool, PasteFormatBehaviour>
source)
const
289 warnKrita <<
"Clipboard was cleared before loading image";
293 int behaviour = overridePasteBehaviour;
294 bool saveColorSetting =
false;
298 if (overridePasteBehaviour == -1) {
302 if (behaviour ==
PASTE_ASK && showPopup) {
306 if (dlg.exec() != QDialog::Accepted) {
326 KisImageSP image =
new KisImage(
nullptr, qimage.width(), qimage.height(), cs,
"clip");
327 if (qimage.dotsPerMeterX() > 0 && qimage.dotsPerMeterY() > 0) {
328 image->
setResolution(qimage.dotsPerMeterX() / 72.0 * 0.0254, qimage.dotsPerMeterY() / 72.0 * 0.0254);
337 if (saveColorSetting) {
341 const auto url = std::find_if(urls.constBegin(), urls.constEnd(), [&](
const QUrl &url) {
342 if (choice == PASTE_FORMAT_DOWNLOAD) {
343 return !url.isLocalFile();
345 return url.isLocalFile();
351 if (url != urls.constEnd()) {
377 if (qimage.isNull() && useClipboardFallback) {
408 const QByteArray mimeType = QByteArrayLiteral(
"application/x-krita-node-internal-pointer");
409 return d->
clipboard->mimeData()->hasFormat(mimeType);
418 return d->
clipboard->mimeData()->hasFormat(
"application/x-krita-layer-style");
423 const QMimeData *cbData =
d->
clipboard->mimeData();
424 return cbData->hasFormat(
"application/x-krita-node-internal-pointer") ? cbData : 0;
441 {{
"image/png"},
"PNG"},
442 {{
"image/tiff"},
"TIFF"},
443 {{
"image/bmp",
"image/x-bmp",
"image/x-MS-bmp",
"image/x-win-bitmap"},
"BMP"}};
446 QSet<QString> clipboardMimeTypes;
448 Q_FOREACH (
const QString &format, cbData->formats()) {
449 clipboardMimeTypes << format;
453 const QSet<QString> &intersection = item.
mimeTypes & clipboardMimeTypes;
454 if (intersection.isEmpty()) {
458 const QString &format = *intersection.constBegin();
459 const QByteArray &imageData = cbData->data(format);
460 if (imageData.isEmpty()) {
464 if (image.loadFromData(imageData, item.
format.toLatin1())) {
469 if (image.isNull() && cbData->hasImage()) {
470 image = qvariant_cast<QImage>(cbData->imageData());
480 QUrl url(originalUrl);
481 QScopedPointer<QTemporaryFile>
tmp;
483 if (!originalUrl.isLocalFile()) {
484 tmp.reset(
new QTemporaryFile());
485 tmp->setAutoRemove(
true);
491 qWarning() <<
"Fetching" << originalUrl <<
"failed";
494 url = QUrl::fromLocalFile(
tmp->fileName());
497 if (url.isLocalFile()) {
498 QFileInfo fileInfo(url.toLocalFile());
503 if (!mimes.contains(type)) {
506 i18nc(
"@title:window",
"Krita"),
507 i18n(
"Could not open %2.\nReason: %1.", msg, url.toDisplayString()));
516 doc->image()->waitForDone();
520 KisImageSP image =
new KisImage(
nullptr, doc->image()->width(), doc->image()->height(), doc->image()->projection()->colorSpace(),
"clip");
521 image->
setResolution(doc->image()->xRes(), doc->image()->yRes());
528 qWarning() <<
"Failed to import file" << url.toLocalFile();
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
const quint8 OPACITY_OPAQUE_U8
const KoColorSpace * referenceColorSpace
void clipboardDataChanged()
QPair< bool, PasteFormatBehaviour > askUserForSourceWithData(QImage qimage, const QList< QUrl > urls, bool useClipboardFallback=false) const
static KisClipboard * instance()
QPair< bool, PasteFormatBehaviour > askUserForSource(const QMimeData *data, bool useClipboardFallback=false) const
KisPaintDeviceSP clipFromKritaLayers(const KoColorSpace *cs, KisDefaultBoundsBaseSP defaultBounds) const
KisImageSP clipImageFromBoardContents(bool showPopup, int overridePasteBehaviour, QPair< bool, PasteFormatBehaviour > source={false, PasteFormatBehaviour::PASTE_FORMAT_ASK}) const
QImage getImageWithFallback(const QMimeData *cbData, bool useClipboardFallback=false) const
void setLayers(KisNodeList nodes, KisImageSP image, const QRect referenceRect, bool forceCopy=false)
KisImageSP clipFromBoardContentsWithData(QImage image, const QList< QUrl > urls, bool showPopup, int overridePasteBehaviour=-1, QPair< bool, PasteFormatBehaviour > source={false, PasteFormatBehaviour::PASTE_FORMAT_ASK}) const
KisImageSP clipImage(bool showPopup, int overridePasteBehaviour=-1) const
KisImageSP clipImageFromKritaLayers(const KoColorSpace *cs=nullptr) const
const KoColorSpace * referenceColorSpace() const
const QMimeData * layersMimeData() const
QImage getImageFromMimeData(const QMimeData *cbData) const
bool hasLayerStyles() const
KisImageSP fetchImageByURL(const QUrl &originalUrl) const
KisClipboardPrivate *const d
void setPasteFormat(qint32 format)
qint32 pasteFormat(bool defaultValue) const
qint32 pasteBehaviour(bool defaultValue=false) const
void setPasteBehaviour(qint32 behaviour) const
const KoColorProfile * profile
KisClipboard::PasteBehaviour source() const
KisPaintDeviceSP projection() const
void setResolution(double xres, double yres)
QString errorMessage() const
static QStringList supportedMimeTypes(Direction direction)
static KisDisplayConfig displayConfigForMimePastes()
const KoColorSpace * referenceColorSpace() const
KisPaintDeviceSP clipFromKritaLayers(const KoColorSpace *cs, KisDefaultBoundsBaseSP defaultBounds) const
KisImageSP clipImageFromKritaLayers(const KoColorSpace *cs) const
static QMimeData * mimeForLayersDeepCopy(const KisNodeList &nodes, KisImageSP image, const QRect referenceRect, bool forceCopy)
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
void convertFromQImage(const QImage &image, const KoColorProfile *profile, qint32 offsetX=0, qint32 offsetY=0)
static KisPart * instance()
The KisRemoteFileFetcher class can fetch a remote file and blocks until the file is downloaded.
bool fetchFile(const QUrl &remote, QIODevice *io)
fetch the image. Shows a progress dialog
virtual const KoColorProfile * profile() const =0
This file is part of the Krita application in calligra.
#define KIS_SAFE_ASSERT_RECOVER(cond)
void forceAllDelayedNodesUpdate(KisNodeSP root)
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
KisPaintDeviceSP paintDevice
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb8(const QString &profileName=QString())