Skip to content

RTransaction

Class in Core Module
Header: #include <src/core/RTransaction.h>

Transaction implementation.

A transaction encapsulates a change of state of a document. Every change of a drawing document is wrapped in a transaction and handled by the QCAD Application Framework as one change. A transaction might add one or multiple objects, modify existing objects or delete objects. Combinations in the same transaction are also possible.

Each transactions should contain a locical change to a drawing. For example if a selection is moved from one place to another, all entities that are part of the selection are moved in the same transaction. This is important for the undo / redo mechanism of QCAD. If each entity would be moved in a separate transaction, the user would have to issue an undo command for each entity to get back to the state before the entities were moved.

Transactions can be applied to a document and are handled by an RTransactionStack for undo / redo functionality. Transactions are stored in a storage.

Transactions in the QCAD Application Framework are a low level concept. They are unaware of graphics views or widgets that need to be updated.

Transaction listeners may be used to intercept, complete or inspect transactions: RTransactionListener, RInterTransactionListener.

Scriptable: This class is available in script environments.

Copyable: Objects are cleaned up automatically by the garbage collector of the script engine.

enum Type { Generic, CurrentLayerChange, CurrentLayerSelectionChange, LayerLockStatusChange, LayerVisibilityStatusChange, SaveWorkingSet, ChangeDocumentSetting, Undo, Redo, LayerCollapseStatusChange }
Transaction type for optimizations.
RTransaction()
RTransaction(RStorage &storage)
Constructs an empty, invalid transaction.
RTransaction(RStorage &storage, const QString &text, bool undoable=true)
Constructor for new transactions.
RTransaction(RStorage &storage, int transactionId, const QString &text, const QList< RObject::Id > &affectedObjectIds, const QMap< RObject::Id, QList< RPropertyChange > > &propertyChanges)
Constructor for existing transactions.
virtual ~RTransaction()
void addAffectedObject(QSharedPointer< RObject > object)
void addAffectedObject(RObject::Id objectId)
Adds the given object to the list of objects that are affected by this transaction.
void addAffectedObjects(const QSet< RObject::Id > &objectIds)
Adds the given objects to the list of objects that are affected by this transaction.
bool addObject(QSharedPointer< RObject > obj, bool useCurrentAttributes=true, bool forceNew=false, const QSet< RPropertyTypeId > &modifiedPropertyTypeIds=RDEFAULT_QSET_RPROPERTYTYPEID)
Adds the given object to the transaction.
void deleteObject(QSharedPointer< RObject > object, bool force=false)
void deleteObject(RObject::Id objectId, bool force=false)
void end()
void endCycle()
Ends the current transaction cycle.
void fail()
QList< RObject::Id > getAffectedObjects() const
int getGroup() const
int getId() const
RObject::Id getNewObjectId(RObject::Id oldId) const
QMap< RObject::Id, QList< RPropertyChange > > getPropertyChanges() const
QList< RPropertyChange > getPropertyChanges(RObject::Id id) const
QSet< RObject::Id > getStatusChanges() const
QString getText() const
QSet< RObject::Id > getTranslatedObjectIds() const
RVector getTranslation() const
RTransaction::Types getTypes() const
bool hasOnlyChanges() const
bool hasPropertyChanges(const RPropertyTypeId &propertyTypeId) const
bool hasStatusChange(RObject::Id id) const
bool isFailed() const
bool isPreview() const
bool isRedoing()
bool isTranslation() const
bool isType(RTransaction::Type type) const
bool isUndoable() const
bool isUndoing()
bool overwriteBlock(QSharedPointer< RBlock > block)
Overwrites a potentially existing block with the given block.
virtual void redo()
Redo undone changes.
void setAllowAll(bool on)
void setAllowInvisible(bool on)
void setBlockRecursionDetectionDisabled(bool on)
void setExistingBlockDetectionDisabled(bool on)
void setExistingLayerDetectionDisabled(bool on)
void setExistingLinetypeDetectionDisabled(bool on)
void setGroup(int group)
Set group.
void setId(int id)
Sets the ID of this transaction.
void setKeepChildren(bool on)
Keep child entities (e.g.
void setKeepHandles(bool on)
void setRecordAffectedObjects(bool on)
void setSpatialIndexDisabled(bool on)
void setTranslation(const RVector &offset)
Marks this transaction as a pure translation of entities by the given offset.
void setType(RTransaction::Type type, bool on=true)
void setTypes(RTransaction::Types t)
virtual void undo()
Reverts a change to the document.
void updateAffectedBlockReferences()
bool addPropertyChange(RObject::Id objectId, const RPropertyChange &propertyChange)
Adds the given property change for the given object to this transaction.
void commit()
Saves this command to the storage of the document.
void rollback()
QSet< RObject::Id > affectedBlockReferenceIds
List of IDs of all block references that need to be updated.
QList< RObject::Id > affectedObjectIds
List of IDs of all objects that are affected by this transaction.
QSet< RObject::Id > affectedObjectIdsSet
bool allowAll
True if all transactions are allowed, even transactions on locked or invisible layers.
bool allowInvisible
True if all transactions on invisible entities are allowed, typically transactions on invisible layers.
bool blockRecursionDetectionDisabled
True to disable block recursion detection (performance gain for loading).
QMap< RObject::Id, RObject::Id > cloneIds
bool deletingBlock
True if a block is being deleted to prevent recursion in deleteObject.
bool existingBlockDetectionDisabled
True to disable detection of existing blocks (performance gain).
bool existingLayerDetectionDisabled
True to disable detection of existing layers (performance gain).
bool existingLinetypeDetectionDisabled
True to disable detection of existing linetypes (performance gain).
bool failed
True if this transaction failed.
bool keepChildren
True to keep and not delete child entities (block attributes for block references).
bool keepHandles
True to keep existing object handles (importers).
bool onlyChanges
True if this transaction only changed objects, no additions, no deletes.
QMap< RObject::Id, QList< RPropertyChange > > propertyChanges
Map of properties that are changed by this transaction.
bool recordAffectedObjects
True if caller is interested in list of objects that are affected by this transaction.
bool recordingTranslation
True while objects added to this transaction are recorded as translated objects.
bool redoing
bool spatialIndexDisabled
True to ignore spatial index.
QSet< RObject::Id > statusChanges
Contains affected objects that have been created or deleted in this transaction.
RStorage * storage
A transaction always belongs to the storage of a document.
QString text
Log entry for this transaction.
int transactionGroup
Transaction group or -1.
int transactionId
Unique ID of this transaction.
QSet< RObject::Id > translatedObjectIds
IDs of objects that have been purely translated by this transaction.
RVector translation
Translation offset if this transaction is a pure translation, invalid vector otherwise.
RTransaction::Types types
bool undoable
Child transactions of this transaction.
bool undoing
QStringList usedBlockNames
List of block names that have been already used in this transaction.

enum Type

Transaction type for optimizations.

Value Description
Generic = 0x0000
CurrentLayerChange = 0x0001
CurrentLayerSelectionChange = 0x0002
LayerLockStatusChange = 0x0004
LayerVisibilityStatusChange = 0x0008
SaveWorkingSet = 0x0010
ChangeDocumentSetting = 0x0020
Undo = 0x0040
Redo = 0x0080
LayerCollapseStatusChange = 0x0100

RTransaction::RTransaction()

All rights reserved.

This file is part of the QCAD project.

QCAD is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

QCAD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with QCAD.

RTransaction::RTransaction(RStorage &storage)

Constructs an empty, invalid transaction.

RTransaction::RTransaction(RStorage &storage, const QString &text, bool undoable=true)

Constructor for new transactions.

RTransaction::RTransaction(RStorage &storage, int transactionId, const QString &text, const QList< RObject::Id > &affectedObjectIds, const QMap< RObject::Id, QList< RPropertyChange > > &propertyChanges)

Constructor for existing transactions.

This is used by storage implementations to instantiate transactions from a storage (e.g. DB).

virtual RTransaction::~RTransaction()

virtual

void RTransaction::addAffectedObject(QSharedPointer< RObject > object)

void RTransaction::addAffectedObject(RObject::Id objectId)

Adds the given object to the list of objects that are affected by this transaction.

void RTransaction::addAffectedObjects(const QSet< RObject::Id > &objectIds)

Adds the given objects to the list of objects that are affected by this transaction.

bool RTransaction::addObject(QSharedPointer< RObject > obj, bool useCurrentAttributes=true, bool forceNew=false, const QSet< RPropertyTypeId > &modifiedPropertyTypeIds=RDEFAULT_QSET_RPROPERTYTYPEID)

Adds the given object to the transaction.

Adding an object to a transaction means that this transaction modifies or adds the object. Entities that are added with an invalid layer or block ID are placed on the current layer / block.

Parameters:

  • modifiedPropertyTypeId: Property IDs that have changed if known by caller, empty set otherwise.

void RTransaction::deleteObject(QSharedPointer< RObject > object, bool force=false)

void RTransaction::deleteObject(RObject::Id objectId, bool force=false)

void RTransaction::end()

void RTransaction::endCycle()

Ends the current transaction cycle.

A cycle typcially creates one copy of a selection. This function is necessary to fix IDs in parent / child related entities (block references / attributes).

void RTransaction::fail()

QList< RObject::Id > RTransaction::getAffectedObjects() const

inline const

Returns: List of object IDs of objects that are affected by this transaction.

int RTransaction::getGroup() const

inline const

Returns: Group of this transaction.

int RTransaction::getId() const

inline const

Returns: Unique ID of this transaction.

RObject::Id RTransaction::getNewObjectId(RObject::Id oldId) const

const

QMap< RObject::Id, QList< RPropertyChange > > RTransaction::getPropertyChanges() const

inline const

Returns: Map of properties that are changed by this transaction.

QList< RPropertyChange > RTransaction::getPropertyChanges(RObject::Id id) const

const

Returns: List of property changes by this transaction for the given object.

QSet< RObject::Id > RTransaction::getStatusChanges() const

inline const

Returns: Set of object IDs of objects that have been created or deleted by this transaction.

QString RTransaction::getText() const

inline const

Returns: Logged text for this transaction.

QSet< RObject::Id > RTransaction::getTranslatedObjectIds() const

inline const

Returns: Set of IDs of existing objects that have been translated by this transaction (see setTranslation).

RVector RTransaction::getTranslation() const

inline const

Returns: Translation offset of this transaction or an invalid vector if this transaction is not a pure translation.

RTransaction::Types RTransaction::getTypes() const

inline const

bool RTransaction::hasOnlyChanges() const

inline const

bool RTransaction::hasPropertyChanges(const RPropertyTypeId &propertyTypeId) const

const

Returns: True if this transaction contains at least one change of the given property for any object.

bool RTransaction::hasStatusChange(RObject::Id id) const

inline const

bool RTransaction::isFailed() const

inline const

bool RTransaction::isPreview() const

const

bool RTransaction::isRedoing()

inline

bool RTransaction::isTranslation() const

inline const

Returns: True if this transaction is a pure translation of the objects returned by getTranslatedObjectIds.

bool RTransaction::isType(RTransaction::Type type) const

const

bool RTransaction::isUndoable() const

inline const

Returns: True if this transaction should store undo / redo information for later undo / redo functionality.

bool RTransaction::isUndoing()

inline

bool RTransaction::overwriteBlock(QSharedPointer< RBlock > block)

Overwrites a potentially existing block with the given block.

virtual void RTransaction::redo()

virtual

Redo undone changes.

(Re-)applies this transaction to the document.

void RTransaction::setAllowAll(bool on)

inline

void RTransaction::setAllowInvisible(bool on)

inline

void RTransaction::setBlockRecursionDetectionDisabled(bool on)

inline

void RTransaction::setExistingBlockDetectionDisabled(bool on)

inline

void RTransaction::setExistingLayerDetectionDisabled(bool on)

inline

void RTransaction::setExistingLinetypeDetectionDisabled(bool on)

inline

void RTransaction::setGroup(int group)

inline

Set group.

void RTransaction::setId(int id)

inline

Sets the ID of this transaction.

Typically called by a storage which manages transaction IDs.

void RTransaction::setKeepChildren(bool on)

inline

Keep child entities (e.g.

keep block attributes when deleting block references)

void RTransaction::setKeepHandles(bool on)

inline

void RTransaction::setRecordAffectedObjects(bool on)

inline

void RTransaction::setSpatialIndexDisabled(bool on)

inline

void RTransaction::setTranslation(const RVector &offset)

Marks this transaction as a pure translation of entities by the given offset.

Objects added to the transaction after this call and before the transaction is committed are recorded as translated (see getTranslatedObjectIds). Objects that are modified later (e.g. by inter transaction listeners) are removed from that set. Graphics scenes can use this information to translate cached graphical representations instead of regenerating them.

void RTransaction::setType(RTransaction::Type type, bool on=true)

void RTransaction::setTypes(RTransaction::Types t)

inline

virtual void RTransaction::undo()

virtual

Reverts a change to the document.

Undoes this transaction.

After undo() is called, the state of the document should be the same as before redo() was called.

void RTransaction::updateAffectedBlockReferences()

bool RTransaction::addPropertyChange(RObject::Id objectId, const RPropertyChange &propertyChange)

protected

Adds the given property change for the given object to this transaction.

void RTransaction::commit()

protected

Saves this command to the storage of the document.

void RTransaction::rollback()

protected

QSet<RObject::Id> RTransaction::affectedBlockReferenceIds

protected

List of IDs of all block references that need to be updated.

QList<RObject::Id> RTransaction::affectedObjectIds

protected

List of IDs of all objects that are affected by this transaction.

Needs to be in order (not a set):

QSet<RObject::Id> RTransaction::affectedObjectIdsSet

protected

bool RTransaction::allowAll

protected

True if all transactions are allowed, even transactions on locked or invisible layers.

Typically the case for importers.

bool RTransaction::allowInvisible

protected

True if all transactions on invisible entities are allowed, typically transactions on invisible layers.

Used to move entities to an invisible layer.

bool RTransaction::blockRecursionDetectionDisabled

protected

True to disable block recursion detection (performance gain for loading).

QMap<RObject::Id, RObject::Id> RTransaction::cloneIds

protected

bool RTransaction::deletingBlock

protected

True if a block is being deleted to prevent recursion in deleteObject.

bool RTransaction::existingBlockDetectionDisabled

protected

True to disable detection of existing blocks (performance gain).

bool RTransaction::existingLayerDetectionDisabled

protected

True to disable detection of existing layers (performance gain).

bool RTransaction::existingLinetypeDetectionDisabled

protected

True to disable detection of existing linetypes (performance gain).

bool RTransaction::failed

protected

True if this transaction failed.

bool RTransaction::keepChildren

protected

True to keep and not delete child entities (block attributes for block references).

bool RTransaction::keepHandles

protected

True to keep existing object handles (importers).

bool RTransaction::onlyChanges

protected

True if this transaction only changed objects, no additions, no deletes.

QMap<RObject::Id, QList<RPropertyChange> > RTransaction::propertyChanges

protected

Map of properties that are changed by this transaction.

For every undoable, a whole list of properties might have changed in a fixed order.

bool RTransaction::recordAffectedObjects

protected

True if caller is interested in list of objects that are affected by this transaction.

bool RTransaction::recordingTranslation

protected

True while objects added to this transaction are recorded as translated objects.

bool RTransaction::redoing

protected

bool RTransaction::spatialIndexDisabled

protected

True to ignore spatial index.

Used for importers which regenerate the spatial index in the end.

QSet<RObject::Id> RTransaction::statusChanges

protected

Contains affected objects that have been created or deleted in this transaction.

RStorage* RTransaction::storage

protected

A transaction always belongs to the storage of a document.

QString RTransaction::text

protected

Log entry for this transaction.

int RTransaction::transactionGroup

protected

Transaction group or -1.

Transaction groups are undone / redone together.

int RTransaction::transactionId

protected

Unique ID of this transaction.

QSet<RObject::Id> RTransaction::translatedObjectIds

protected

IDs of objects that have been purely translated by this transaction.

RVector RTransaction::translation

protected

Translation offset if this transaction is a pure translation, invalid vector otherwise.

RTransaction::Types RTransaction::types

protected

bool RTransaction::undoable

protected

Child transactions of this transaction.

True if this transaction can be undone.

bool RTransaction::undoing

protected

QStringList RTransaction::usedBlockNames

protected

List of block names that have been already used in this transaction.