Krita Source Code Documentation
Loading...
Searching...
No Matches
KisTransactionData Class Reference

#include <kis_transaction_data.h>

+ Inheritance diagram for KisTransactionData:

Public Member Functions

KisDataManagerSP dataManager ()
 
virtual void endTransaction ()
 
 KisTransactionData (const KUndo2MagicString &name, KisPaintDeviceSP device, bool resetSelectionOutlineCache, KisTransactionWrapperFactory *interstrokeDataFactory, KUndo2Command *parent, bool suppressUpdates)
 
void moveDevice (const QPoint newOffset)
 
void possiblySwitchCurrentTime ()
 
void redo () override
 
void undo () override
 
 ~KisTransactionData () override
 
- Public Member Functions inherited from KUndo2Command
QString actionText () const
 
virtual bool canAnnihilateWith (const KUndo2Command *other) const
 
const KUndo2Commandchild (int index) const
 
int childCount () const
 
virtual QTime endTime () const
 
KUndo2CommandExtraDataextraData () const
 
bool hasParent () const
 
virtual int id () const
 
virtual bool isMerged () const
 
 KUndo2Command (const KUndo2MagicString &text, KUndo2Command *parent=0)
 
 KUndo2Command (KUndo2Command *parent=0)
 
virtual QVector< KUndo2Command * > mergeCommandsVector () const
 
virtual bool mergeWith (const KUndo2Command *other)
 
virtual void redoMergedCommands ()
 
void setEndTime ()
 
virtual void setEndTime (const QTime &time)
 
void setExtraData (KUndo2CommandExtraData *data)
 
void setText (const KUndo2MagicString &text)
 
void setTime ()
 
virtual void setTime (const QTime &time)
 
virtual void setTimedID (int timedID)
 
KUndo2MagicString text () const
 
virtual QTime time () const
 
virtual int timedId () const
 
virtual bool timedMergeWith (KUndo2Command *other)
 
virtual void undoMergedCommands ()
 
virtual ~KUndo2Command ()
 

Public Attributes

bool defaultPixelChanged = false
 
KisPaintDeviceSP device
 
bool firstRedo
 
QScopedPointer< KUndo2CommandflattenUndoCommand
 
QScopedPointer< OptionalInterstrokeInfointerstrokeInfo
 
KisMementoSP memento
 
QPoint newOffset
 
KoColor oldDefaultPixel
 
QPoint oldOffset
 
bool resetSelectionOutlineCache
 
KisDataManagerSP savedDataManager
 
QPainterPath savedOutlineCache
 
bool savedOutlineCacheValid
 
bool suppressUpdates = false
 
bool transactionFinished
 
int transactionFrameId
 
int transactionTime
 

Protected Member Functions

virtual void restoreSelectionOutlineCache (bool undo)
 
virtual void saveSelectionOutlineCache ()
 

Private Member Functions

void doFlattenUndoRedo (bool undo)
 
void init (KisPaintDeviceSP device)
 
void possiblyFlattenSelection (KisPaintDeviceSP device)
 
void possiblyNotifySelectionChanged ()
 
void possiblyResetOutlineCache ()
 
void startUpdates ()
 
- Private Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Private Attributes

Private *const m_d
 
- Private Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Detailed Description

A tile based undo command.

Ordinary KUndo2Command subclasses store parameters and apply the action in the redo() command, however, Krita doesn't work like this. Undo replaces the current tiles in a paint device with the old tiles, redo replaces them again with the new tiles without actually executing the command that changed the image data again.

Definition at line 37 of file kis_transaction_data.cpp.

Constructor & Destructor Documentation

◆ KisTransactionData()

KisTransactionData::KisTransactionData ( const KUndo2MagicString & name,
KisPaintDeviceSP device,
bool resetSelectionOutlineCache,
KisTransactionWrapperFactory * interstrokeDataFactory,
KUndo2Command * parent,
bool suppressUpdates )

Definition at line 67 of file kis_transaction_data.cpp.

68 : KUndo2Command(name, parent)
69 , m_d(new Private())
70{
71 m_d->resetSelectionOutlineCache = resetSelectionOutlineCache;
72 m_d->suppressUpdates = suppressUpdates;
73 setTimedID(-1);
74
75 if (!interstrokeDataFactory && device->interstrokeData()) {
76 interstrokeDataFactory = new KisInterstrokeDataTransactionWrapperFactory(0);
77 }
78
79 if (interstrokeDataFactory) {
80 m_d->interstrokeInfo.reset(new OptionalInterstrokeInfo());
81 m_d->interstrokeInfo->factory.reset(interstrokeDataFactory);
82 }
83
85 init(device);
87}
virtual void setTimedID(int timedID)
KUndo2Command(KUndo2Command *parent=0)
KisInterstrokeDataSP interstrokeData() const
void init(KisPaintDeviceSP device)
virtual void saveSelectionOutlineCache()
void possiblyFlattenSelection(KisPaintDeviceSP device)

References device, init(), KisPaintDevice::interstrokeData(), m_d, possiblyFlattenSelection(), resetSelectionOutlineCache, saveSelectionOutlineCache(), KUndo2Command::setTimedID(), and suppressUpdates.

◆ ~KisTransactionData()

KisTransactionData::~KisTransactionData ( )
override

Definition at line 115 of file kis_transaction_data.cpp.

116{
117 Q_ASSERT(m_d->memento);
118 m_d->savedDataManager->purgeHistory(m_d->memento);
119
120 delete m_d;
121}

References m_d.

Member Function Documentation

◆ dataManager()

KisDataManagerSP KisTransactionData::dataManager ( )

◆ doFlattenUndoRedo()

void KisTransactionData::doFlattenUndoRedo ( bool undo)
private

Definition at line 226 of file kis_transaction_data.cpp.

227{
228 KisPixelSelectionSP pixelSelection =
229 dynamic_cast<KisPixelSelection*>(m_d->device.data());
230
231 if (pixelSelection) {
232 if (m_d->flattenUndoCommand) {
233 if (undo) {
234 m_d->flattenUndoCommand->undo();
235 } else {
236 m_d->flattenUndoCommand->redo();
237 }
238 }
239 }
240}

References m_d, and undo().

◆ endTransaction()

void KisTransactionData::endTransaction ( )
virtual

Definition at line 132 of file kis_transaction_data.cpp.

133{
134 if(!m_d->transactionFinished) {
135 // make sure the time didn't change during the transaction
137 m_d->transactionTime == m_d->device->defaultBounds()->currentTime());
138
139 DEBUG_ACTION("Transaction ended");
140 m_d->transactionFinished = true;
141 m_d->savedDataManager->commit();
142 m_d->newOffset = QPoint(m_d->device->x(), m_d->device->y());
143 m_d->defaultPixelChanged = m_d->oldDefaultPixel != m_d->device->defaultPixel();
144
145 if (m_d->interstrokeInfo) {
146 m_d->interstrokeInfo->endTransactionCommand.reset(m_d->interstrokeInfo->factory->createEndTransactionCommand());
147 if (m_d->interstrokeInfo->endTransactionCommand) {
148 m_d->interstrokeInfo->endTransactionCommand->redo();
149 }
150 m_d->interstrokeInfo->factory.reset();
151 }
152 }
153}
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
#define DEBUG_ACTION(action)

References DEBUG_ACTION, KIS_ASSERT_RECOVER_RETURN, and m_d.

◆ init()

void KisTransactionData::init ( KisPaintDeviceSP device)
private

Definition at line 89 of file kis_transaction_data.cpp.

90{
91 m_d->device = device;
92 DEBUG_ACTION("Transaction started");
93
94 m_d->oldOffset = QPoint(device->x(), device->y());
95 m_d->oldDefaultPixel = device->defaultPixel();
96 m_d->firstRedo = true;
97 m_d->transactionFinished = false;
98
99 m_d->transactionTime = device->defaultBounds()->currentTime();
100
101 if (m_d->interstrokeInfo) {
102 m_d->interstrokeInfo->beginTransactionCommand.reset(m_d->interstrokeInfo->factory->createBeginTransactionCommand(m_d->device));
103 if (m_d->interstrokeInfo->beginTransactionCommand) {
104 m_d->interstrokeInfo->beginTransactionCommand->redo();
105 }
106 }
107
108 m_d->transactionFrameId = device->framesInterface() ? device->framesInterface()->currentFrameId() : -1;
109 m_d->savedDataManager = m_d->transactionFrameId >= 0 ?
110 m_d->device->framesInterface()->frameDataManager(m_d->transactionFrameId) :
111 m_d->device->dataManager();
112 m_d->memento = m_d->savedDataManager->getMemento();
113}
virtual int currentTime() const =0
KisPaintDeviceFramesInterface * framesInterface()
KoColor defaultPixel() const
KisDefaultBoundsBaseSP defaultBounds() const

References KisPaintDeviceFramesInterface::currentFrameId(), KisDefaultBoundsBase::currentTime(), DEBUG_ACTION, KisPaintDevice::defaultBounds(), KisPaintDevice::defaultPixel(), device, KisPaintDevice::framesInterface(), m_d, KisPaintDevice::x(), and KisPaintDevice::y().

◆ moveDevice()

void KisTransactionData::moveDevice ( const QPoint newOffset)

◆ possiblyFlattenSelection()

void KisTransactionData::possiblyFlattenSelection ( KisPaintDeviceSP device)
private

Definition at line 209 of file kis_transaction_data.cpp.

210{
211 KisPixelSelectionSP pixelSelection =
212 dynamic_cast<KisPixelSelection*>(device.data());
213
214 if (pixelSelection) {
215 KisSelection *selection = pixelSelection->parentSelection().data();
216 if (selection) {
217 m_d->flattenUndoCommand.reset(selection->flatten());
218
219 if (m_d->flattenUndoCommand) {
220 m_d->flattenUndoCommand->redo();
221 }
222 }
223 }
224}
KisSelectionWSP parentSelection
KUndo2Command * flatten()
flatten creates a new pixel selection component from the shape selection and throws away the shape se...

References KisSharedPtr< T >::data(), KisWeakSharedPtr< T >::data(), device, KisSelection::flatten(), m_d, and KisPixelSelection::parentSelection.

◆ possiblyNotifySelectionChanged()

void KisTransactionData::possiblyNotifySelectionChanged ( )
private

Definition at line 186 of file kis_transaction_data.cpp.

187{
188 KisPixelSelectionSP pixelSelection =
189 dynamic_cast<KisPixelSelection*>(m_d->device.data());
190
191 KisSelectionSP selection;
192 if (pixelSelection && (selection = pixelSelection->parentSelection())) {
193 selection->notifySelectionChanged();
194 }
195}
void notifySelectionChanged()

References m_d, KisSelection::notifySelectionChanged(), and KisPixelSelection::parentSelection.

◆ possiblyResetOutlineCache()

void KisTransactionData::possiblyResetOutlineCache ( )
private

Definition at line 197 of file kis_transaction_data.cpp.

198{
199 KisPixelSelectionSP pixelSelection;
200
201 if (m_d->resetSelectionOutlineCache &&
202 (pixelSelection =
203 dynamic_cast<KisPixelSelection*>(m_d->device.data()))) {
204
205 pixelSelection->invalidateOutlineCache();
206 }
207}

References KisPixelSelection::invalidateOutlineCache(), and m_d.

◆ possiblySwitchCurrentTime()

void KisTransactionData::possiblySwitchCurrentTime ( )

◆ redo()

void KisTransactionData::redo ( )
overridevirtual

Applies a change to the document. This function must be implemented in the derived class. Calling KUndo2QStack::push(), KUndo2QStack::undo() or KUndo2QStack::redo() from this function leads to undefined behavior.

The default implementation calls redo() on all child commands.

See also
undo()

Reimplemented from KUndo2Command.

Definition at line 249 of file kis_transaction_data.cpp.

250{
251 //KUndo2QStack calls redo(), so the first call needs to be blocked
252 if (m_d->firstRedo) {
253 m_d->firstRedo = false;
254
255
258 return;
259 }
260
261
262
263 doFlattenUndoRedo(false);
265
266 DEBUG_ACTION("Redo()");
267
268 if (m_d->interstrokeInfo && m_d->interstrokeInfo->beginTransactionCommand) {
269 m_d->interstrokeInfo->beginTransactionCommand->redo();
270 }
271
272 Q_ASSERT(m_d->memento);
273 m_d->savedDataManager->rollforward(m_d->memento);
274
275 if (m_d->newOffset != m_d->oldOffset) {
276 m_d->moveDevice(m_d->newOffset);
277 }
278
279 if (m_d->interstrokeInfo && m_d->interstrokeInfo->endTransactionCommand) {
280 m_d->interstrokeInfo->endTransactionCommand->redo();
281 }
282
283 m_d->possiblySwitchCurrentTime();
284 startUpdates();
286}
void doFlattenUndoRedo(bool undo)
virtual void restoreSelectionOutlineCache(bool undo)

References DEBUG_ACTION, doFlattenUndoRedo(), m_d, possiblyNotifySelectionChanged(), possiblyResetOutlineCache(), restoreSelectionOutlineCache(), and startUpdates().

◆ restoreSelectionOutlineCache()

void KisTransactionData::restoreSelectionOutlineCache ( bool undo)
protectedvirtual

Definition at line 332 of file kis_transaction_data.cpp.

333{
334 Q_UNUSED(undo);
335 KisPixelSelectionSP pixelSelection =
336 dynamic_cast<KisPixelSelection*>(m_d->device.data());
337
338 if (pixelSelection) {
340 QPainterPath savedOutlineCache;
341
342 savedOutlineCacheValid = pixelSelection->outlineCacheValid();
344 savedOutlineCache = pixelSelection->outlineCache();
345 }
346
347 if (m_d->savedOutlineCacheValid) {
348 pixelSelection->setOutlineCache(m_d->savedOutlineCache);
349 } else {
350 pixelSelection->invalidateOutlineCache();
351 }
352
353 m_d->savedOutlineCacheValid = savedOutlineCacheValid;
354 if (m_d->savedOutlineCacheValid) {
355 m_d->savedOutlineCache = savedOutlineCache;
356 }
357 }
358}
void setOutlineCache(const QPainterPath &cache)

References KisPixelSelection::invalidateOutlineCache(), m_d, KisPixelSelection::outlineCache, KisPixelSelection::outlineCacheValid, savedOutlineCache, savedOutlineCacheValid, KisPixelSelection::setOutlineCache(), and undo().

◆ saveSelectionOutlineCache()

void KisTransactionData::saveSelectionOutlineCache ( )
protectedvirtual

Definition at line 315 of file kis_transaction_data.cpp.

316{
317 m_d->savedOutlineCacheValid = false;
318
319 KisPixelSelectionSP pixelSelection =
320 dynamic_cast<KisPixelSelection*>(m_d->device.data());
321
322 if (pixelSelection) {
323 m_d->savedOutlineCacheValid = pixelSelection->outlineCacheValid();
324 if (m_d->savedOutlineCacheValid) {
325 m_d->savedOutlineCache = pixelSelection->outlineCache();
326
328 }
329 }
330}

References m_d, KisPixelSelection::outlineCache, KisPixelSelection::outlineCacheValid, and possiblyResetOutlineCache().

◆ startUpdates()

void KisTransactionData::startUpdates ( )
private

Definition at line 155 of file kis_transaction_data.cpp.

156{
157 if (m_d->suppressUpdates) return;
158
159 if (m_d->transactionFrameId == -1 ||
160 m_d->transactionFrameId ==
161 m_d->device->framesInterface()->currentFrameId()) {
162
163 QRect rc;
164 QRect mementoExtent = m_d->memento->extent();
165
166 if (m_d->newOffset == m_d->oldOffset) {
167 rc = mementoExtent.translated(m_d->device->x(), m_d->device->y());
168 } else {
169 QRect totalExtent =
170 m_d->savedDataManager->extent() | mementoExtent;
171
172 rc = totalExtent.translated(m_d->oldOffset) |
173 totalExtent.translated(m_d->newOffset);
174 }
175
176 if (m_d->defaultPixelChanged) {
177 rc |= m_d->device->defaultBounds()->bounds();
178 }
179
180 m_d->device->setDirty(rc);
181 } else {
182 m_d->device->framesInterface()->invalidateFrameCache(m_d->transactionFrameId);
183 }
184}

References m_d.

◆ undo()

void KisTransactionData::undo ( )
overridevirtual

Reverts a change to the document. After undo() is called, the state of the document should be the same as before redo() was called. This function must be implemented in the derived class. Calling KUndo2QStack::push(), KUndo2QStack::undo() or KUndo2QStack::redo() from this function leads to undefined behavior.

The default implementation calls undo() on all child commands in reverse order.

See also
redo()

Reimplemented from KUndo2Command.

Definition at line 288 of file kis_transaction_data.cpp.

289{
290 DEBUG_ACTION("Undo()");
291
292 if (m_d->interstrokeInfo && m_d->interstrokeInfo->endTransactionCommand) {
293 m_d->interstrokeInfo->endTransactionCommand->undo();
294 }
295
296 Q_ASSERT(m_d->memento);
297 m_d->savedDataManager->rollback(m_d->memento);
298
299 if (m_d->newOffset != m_d->oldOffset) {
300 m_d->moveDevice(m_d->oldOffset);
301 }
302
303 if (m_d->interstrokeInfo && m_d->interstrokeInfo->beginTransactionCommand) {
304 m_d->interstrokeInfo->beginTransactionCommand->undo();
305 }
306
308 doFlattenUndoRedo(true);
309
310 m_d->possiblySwitchCurrentTime();
311 startUpdates();
313}

References DEBUG_ACTION, doFlattenUndoRedo(), m_d, possiblyNotifySelectionChanged(), restoreSelectionOutlineCache(), and startUpdates().

Member Data Documentation

◆ defaultPixelChanged

bool KisTransactionData::defaultPixelChanged = false

Definition at line 48 of file kis_transaction_data.cpp.

◆ device

KisPaintDeviceSP KisTransactionData::device

Definition at line 40 of file kis_transaction_data.cpp.

◆ firstRedo

bool KisTransactionData::firstRedo

Definition at line 42 of file kis_transaction_data.cpp.

◆ flattenUndoCommand

QScopedPointer<KUndo2Command> KisTransactionData::flattenUndoCommand

Definition at line 52 of file kis_transaction_data.cpp.

◆ interstrokeInfo

QScopedPointer<OptionalInterstrokeInfo> KisTransactionData::interstrokeInfo

Definition at line 59 of file kis_transaction_data.cpp.

◆ m_d

Private* const KisTransactionData::m_d
private

Definition at line 51 of file kis_transaction_data.h.

◆ memento

KisMementoSP KisTransactionData::memento

Definition at line 41 of file kis_transaction_data.cpp.

◆ newOffset

QPoint KisTransactionData::newOffset

Definition at line 45 of file kis_transaction_data.cpp.

◆ oldDefaultPixel

KoColor KisTransactionData::oldDefaultPixel

Definition at line 47 of file kis_transaction_data.cpp.

◆ oldOffset

QPoint KisTransactionData::oldOffset

Definition at line 44 of file kis_transaction_data.cpp.

◆ resetSelectionOutlineCache

bool KisTransactionData::resetSelectionOutlineCache

Definition at line 53 of file kis_transaction_data.cpp.

◆ savedDataManager

KisDataManagerSP KisTransactionData::savedDataManager

Definition at line 57 of file kis_transaction_data.cpp.

◆ savedOutlineCache

QPainterPath KisTransactionData::savedOutlineCache

Definition at line 51 of file kis_transaction_data.cpp.

◆ savedOutlineCacheValid

bool KisTransactionData::savedOutlineCacheValid

Definition at line 50 of file kis_transaction_data.cpp.

◆ suppressUpdates

bool KisTransactionData::suppressUpdates = false

Definition at line 60 of file kis_transaction_data.cpp.

◆ transactionFinished

bool KisTransactionData::transactionFinished

Definition at line 43 of file kis_transaction_data.cpp.

◆ transactionFrameId

int KisTransactionData::transactionFrameId

Definition at line 56 of file kis_transaction_data.cpp.

◆ transactionTime

int KisTransactionData::transactionTime

Definition at line 55 of file kis_transaction_data.cpp.


The documentation for this class was generated from the following files: