Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_image_from_clipboard_widget.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2005 Thomas Zander <zander@kde.org>
3 * SPDX-FileCopyrightText: 2005 C. Boemann <cbo@boemann.dk>
4 * SPDX-FileCopyrightText: 2007 Boudewijn Rempt <boud@valdyas.org>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
11
12#include <QApplication>
13#include <QClipboard>
14#include <QScreen>
15#include <QFile>
16#include <QMimeData>
17#include <QRect>
18#include <QSlider>
19
20#include <KisPart.h>
21#include <KoColor.h>
23#include <KoColorProfile.h>
25#include <KoID.h>
26#include <KisSqueezedComboBox.h>
27
28#include <kis_debug.h>
29#include <kis_fill_painter.h>
30#include <kis_group_layer.h>
31#include <kis_icon.h>
32#include <kis_image.h>
33#include <kis_layer.h>
34#include <kis_paint_device.h>
35#include <kis_paint_layer.h>
36#include <kis_painter.h>
37
39#include "KisDocument.h"
40#include "kis_clipboard.h"
41#include "kis_import_catcher.h"
43
44KisImageFromClipboardWidget::KisImageFromClipboardWidget(QWidget* parent, qint32 defWidth, qint32 defHeight, double resolution, const QString& defColorModel, const QString& defColorDepth, const QString& defColorProfile, const QString& imageName)
45 : KisCustomImageWidget(parent, defWidth, defHeight, resolution, defColorModel, defColorDepth, defColorProfile, imageName)
46{
47 setObjectName("KisImageFromClipboard");
48
49 lblPreview->hide();
50 grpClipboard->show();
51
53
54 disconnect(newDialogConfirmationButtonBox, &QDialogButtonBox::accepted, nullptr,
55 nullptr); // disable normal signal
56 connect(newDialogConfirmationButtonBox, &QDialogButtonBox::accepted, this, &KisImageFromClipboardWidget::createImage);
57}
58
62
64{
65 newDialogConfirmationButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
66
67 KisPaintDeviceSP clip = KisClipboard::instance()->clip(QRect(), true);
68 if (!clip) {
69 enableImageCreation(QImage());
70 return;
71 }
72
74
75 if (doc) {
76 KisImageSP image = doc->image();
77 if (image && image->root() && image->root()->firstChild()) {
78 KisNodeSP node = image->root()->firstChild();
79 while (node && (!dynamic_cast<KisPaintLayer*>(node.data()) || node->userLocked())) {
80 node = node->nextSibling();
81 }
82
83 if (!node) {
84 KisPaintLayerSP newLayer = new KisPaintLayer(image, image->nextLayerName(), OPACITY_OPAQUE_U8);
85 image->addNode(newLayer);
86 node = newLayer;
87 }
88
90
91 KisPaintLayer * layer = dynamic_cast<KisPaintLayer*>(node.data());
93
95 const QRect r = clip->exactBounds();
97
98 KisPainter::copyAreaOptimized(QPoint(), clip, layer->paintDevice(), r);
99 layer->setDirty();
100 }
101 doc->setModified(true);
102 Q_EMIT m_openPane->documentSelected(doc);
103 m_openPane->accept();
104 }
105
106 newDialogConfirmationButtonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
107}
108
113
122
123
125{
126 if (!KisClipboard::instance()->hasClip()) {
127 enableImageCreation(QImage());
128 }
129
130 KisCursorOverrideLock cursorLock(Qt::BusyCursor);
131
132 QImage qimage = QApplication::clipboard()->image();
133 enableImageCreation(qimage);
134}
135
137{
138 if (qimage.isNull()) {
139 doubleWidth->setValue(0);
140 doubleHeight->setValue(0);
141 newDialogConfirmationButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
142 lblPreview->hide();
143 tabWidget->setEnabled(false);
144
145 lblDocumentInfo->setText(i18n("The clipboard is empty or does not have an image in it."));
146 } else {
147 QSize previewSize = QSize(75, 75) * devicePixelRatioF();
148 QPixmap preview = QPixmap::fromImage(qimage.scaled(previewSize, Qt::KeepAspectRatio));
149 preview.setDevicePixelRatio(devicePixelRatioF());
150 lblPreview->setPixmap(preview);
151 lblPreview->show();
152 newDialogConfirmationButtonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
153
154 doubleWidth->setValue(qimage.width());
155 doubleHeight->setValue(qimage.height());
156
157 tabWidget->setEnabled(true);
158 }
159}
const quint8 OPACITY_OPAQUE_U8
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
static KisClipboard * instance()
void clipChanged()
void showEvent(QShowEvent *) override
void setNumberOfLayers(int layers)
Set the number of layers that will be created.
KisImageSP image
void setModified(bool _mod)
KisImageFromClipboardWidget(QWidget *parent, qint32 defWidth, qint32 defHeight, double resolution, const QString &defColorModel, const QString &defColorDepth, const QString &defColorProfile, const QString &imageName)
void showEvent(QShowEvent *event) override
QString nextLayerName(const QString &baseName="") const
Definition kis_image.cc:715
static void adaptClipToImageColorSpace(KisPaintDeviceSP dev, KisImageSP image)
void documentSelected(KisDocument *)
this signal is emitted (as defined by KisDocument) the moment the document is 'ready'
QRect exactBounds() const
static void copyAreaOptimized(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
void setOpacity(quint8 val)
bool userLocked() const
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeSP nextSibling() const
Definition kis_node.cpp:408
virtual void setDirty()
Definition kis_node.cpp:577
KisPaintDeviceSP paintDevice