Krita Source Code Documentation
Loading...
Searching...
No Matches
move_selection_stroke_strategy.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2012 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <klocalizedstring.h>
10#include <KoColorSpace.h>
12#include "kis_image.h"
13#include "kis_paint_layer.h"
14#include "kis_painter.h"
15#include "kis_paint_device.h"
18#include "kis_transaction.h"
21#include "kis_lod_transform.h"
22#include "KisAnimAutoKey.h"
23
24
26 KisSelectionSP selection,
27 KisUpdatesFacade *updatesFacade,
28 KisStrokeUndoFacade *undoFacade)
29 : KisStrokeStrategyUndoCommandBased(kundo2_i18n("Move Selection"), false, undoFacade),
30 m_paintLayer(paintLayer),
31 m_selection(selection),
32 m_updatesFacade(updatesFacade)
33{
41}
42
44 : QObject(),
46 m_paintLayer(rhs.m_paintLayer),
47 m_selection(rhs.m_selection),
48 m_updatesFacade(rhs.m_updatesFacade)
49{
50}
51
53{
55
57
58 KisPaintDeviceSP movedDevice = new KisPaintDevice(m_paintLayer.data(), paintDevice->colorSpace());
59
60 KUndo2Command *autoKeyframeCommand =
63 if (autoKeyframeCommand) {
65 }
66
67 QRect copyRect = m_selection->selectedRect();
68 KisPainter gc(movedDevice);
70 gc.bitBlt(copyRect.topLeft(), paintDevice, copyRect);
71 gc.end();
72
73 KisTransaction cutTransaction(name(), paintDevice);
74 paintDevice->clearSelection(m_selection);
78
81 indirect->setTemporaryTarget(movedDevice);
84 indirect->setTemporarySelection(0);
85 indirect->setTemporaryChannelFlags(QBitArray());
86
87 m_initialDeviceOffset = QPoint(movedDevice->x(), movedDevice->y());
89
90 {
91 QRect handlesRect = movedDevice->exactBounds();
92 KisLodTransform t(paintDevice);
93 handlesRect = t.mapInverted(handlesRect);
94
95 if (!handlesRect.isEmpty()) {
96 Q_EMIT this->sigHandlesRectCalculated(handlesRect);
97 } else {
98 Q_EMIT this->sigStrokeStartedEmpty();
99 }
100
101 }
102}
103
137
139{
142
143 if (indirect) {
144 KisPaintDeviceSP t = indirect->temporaryTarget();
145 if (t) {
146 KisRegion dirtyRegion = t->region();
147
148 indirect->setTemporaryTarget(0);
149
150 m_paintLayer->setDirty(dirtyRegion);
151
154 m_selection->setVisible(true);
156 }
157 }
159}
160
162
164{
165 MoveStrokeStrategy::Data *d = dynamic_cast<MoveStrokeStrategy::Data*>(data);
166 ShowSelectionData *ssd = dynamic_cast<ShowSelectionData*>(data);
167
168 if (d) {
171
172 KisPaintDeviceSP movedDevice = indirect->temporaryTarget();
173
174 QRegion dirtyRegion = movedDevice->region().toQRegion();
175
176 QPoint currentDeviceOffset(movedDevice->x(), movedDevice->y());
177 QPoint newDeviceOffset(m_initialDeviceOffset + d->offset);
178
179 dirtyRegion |= dirtyRegion.translated(newDeviceOffset - currentDeviceOffset);
180
181 movedDevice->setX(newDeviceOffset.x());
182 movedDevice->setY(newDeviceOffset.y());
183 m_finalOffset = d->offset;
184
186
187 m_selection->setX((m_initialSelectionOffset + d->offset).x());
188 m_selection->setY((m_initialSelectionOffset + d->offset).y());
189
190 if (m_selection->isVisible()) {
192 }
193
194 } else if (ssd) {
196 } else {
198 }
199}
200
202{
203 Q_UNUSED(levelOfDetail);
204
205 // Vector selections don't support lod-moves
206 if (m_selection->hasShapeSelection()) return 0;
207
209 connect(clone, SIGNAL(sigHandlesRectCalculated(QRect)), this, SIGNAL(sigHandlesRectCalculated(QRect)));
210 return clone;
211}
212
214{
215 return new ShowSelectionData(*this, levelOfDetail);
216}
217
219 : KisStrokeJobData(rhs),
220 showSelection(rhs.showSelection)
221{
222}
const qreal OPACITY_OPAQUE_F
const QString COMPOSITE_OVER
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
QRectF mapInverted(const QRectF &rc) const
void setX(qint32 x)
KisRegion region() const
QRect exactBounds() const
const KoColorSpace * colorSpace() const
void clearSelection(KisSelectionSP selection)
void setY(qint32 y)
void setSelection(KisSelectionSP selection)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
static KisRegion fromQRegion(const QRegion &region)
QRegion toQRegion() const
void enableJob(JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
void runAndSaveCommand(KUndo2CommandSP command, KisStrokeJobData::Sequentiality sequentiality, KisStrokeJobData::Exclusivity exclusivity)
void doStrokeCallback(KisStrokeJobData *data) override
KUndo2MagicString name() const
KUndo2Command * endAndTake()
virtual void blockUpdates()=0
virtual void unblockUpdates()=0
void doStrokeCallback(KisStrokeJobData *data) override
MoveSelectionStrokeStrategy(KisPaintLayerSP paintLayer, KisSelectionSP selection, KisUpdatesFacade *updatesFacade, KisStrokeUndoFacade *undoFacade)
KisStrokeStrategy * createLodClone(int levelOfDetail) override
void sigHandlesRectCalculated(const QRect &handlesRect)
QSharedPointer< T > toQShared(T *ptr)
QSharedPointer< KUndo2Command > KUndo2CommandSP
Definition kis_types.h:262
KUndo2MagicString kundo2_i18n(const char *text)
KUndo2Command * tryAutoCreateDuplicatedFrame(KisPaintDeviceSP device, AutoCreateKeyframeFlags flags)
create a new duplicated keyframe if auto-keyframe mode is on
void setTemporaryChannelFlags(const QBitArray &channelFlags)
void mergeToLayer(KisNodeSP layer, KUndo2Command *parentCommand, const KUndo2MagicString &transactionText, int timedID)
void setTemporarySelection(KisSelectionSP selection)
void setTemporaryCompositeOp(const QString &id)
virtual void setDirty()
Definition kis_node.cpp:577
KisPaintDeviceSP paintDevice
void setX(qint32 x)
qint32 x() const
void notifySelectionChanged()
void setY(qint32 y)
QRect selectedRect() const
bool hasShapeSelection() const
void setVisible(bool visible)
qint32 y() const
KisStrokeJobData * createLodClone(int levelOfDetail) override