ACF $AcfVersion:0$
CSerializedUndoManagerComp.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ACF-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QList>
7
8// ACF includes
9#include <istd/TDelPtr.h>
10#include <iser/ISerializable.h>
14#include <idoc/IUndoManager.h>
15
16
17namespace idoc
18{
19
20
106 public imod::TSingleModelObserverBase<iser::ISerializable>,
107 virtual public IUndoManager
108{
109public:
112
113 I_BEGIN_COMPONENT(CSerializedUndoManagerComp);
114 I_REGISTER_INTERFACE(idoc::IUndoManager);
115 I_REGISTER_INTERFACE(idoc::IDocumentStateComparator);
116 I_REGISTER_INTERFACE(imod::IObserver);
117 I_ASSIGN(m_maxBufferSizeAttrPtr, "MaxBufferSize", "Maximal memory size of the Undo-buffer in MByte", false, 100);
118 I_END_COMPONENT;
119
121
122 // reimplemented (idoc::IUndoManager)
123 virtual int GetAvailableUndoSteps() const override;
124 virtual int GetAvailableRedoSteps() const override;
125 virtual QString GetUndoLevelDescription(int stepIndex) const override;
126 virtual QString GetRedoLevelDescription(int stepIndex) const override;
127 virtual void ResetUndo() override;
128 virtual bool DoUndo(int steps = 1) override;
129 virtual bool DoRedo(int steps = 1) override;
130
131 // reimplemented (imod::IObserver)
132 virtual bool OnModelAttached(imod::IModel* modelPtr, istd::IChangeable::ChangeSet& changeMask) override;
133 virtual bool OnModelDetached(imod::IModel* modelPtr) override;
134
135protected:
142 typedef QList<UndoStepInfo> UndoList;
143
144 bool DoListShift(int steps, UndoList& fromList, UndoList& toList);
145
146 // reimplemented (imod::TSingleModelObserverBase<iser::ISerializable>)
147 virtual iser::ISerializable* CastFromModel(imod::IModel* modelPtr) const override;
148
149 // reimplemented (imod::IObserver)
150 virtual void BeforeUpdate(imod::IModel* modelPtr) override;
151 virtual void AfterUpdate(imod::IModel* modelPtr, const istd::IChangeable::ChangeSet& changeSet) override;
152
153 // reimplemented (idoc::IDocumentStateComparator)
154 virtual bool HasStoredDocumentState() const override;
155 virtual bool StoreDocumentState() override;
156 virtual bool RestoreDocumentState() override;
158
159 // reimplemented (icomp::CComponentBase)
160 virtual void OnComponentDestroyed() override;
161
162private:
163 qint64 GetUsedMemorySize() const;
164
165 UndoList m_undoList;
166 UndoList m_redoList;
167
168 UndoArchivePtr m_beginStateArchivePtr;
169
170 bool m_hasStoredDocumentState;
171 bool m_isBlocked;
172
173 iser::CMemoryWriteArchive m_storedStateArchive;
174
175 mutable DocumentChangeFlag m_stateChangedFlag;
176 mutable bool m_isStateChangedFlagValid;
177
178 I_ATTR(int, m_maxBufferSizeAttrPtr);
179};
180
181
182} // namespace idoc
183
184
185
186
Base class for component implementation.
Implements multi-level UNDO mechanism based on storing complete object state at each step using seria...
virtual int GetAvailableUndoSteps() const override
Get number of available UNDO levels.
istd::TDelPtr< iser::CMemoryWriteArchive > UndoArchivePtr
virtual bool OnModelDetached(imod::IModel *modelPtr) override
Callback invoked when an observable model is about to be detached from this observer.
virtual int GetAvailableRedoSteps() const override
Get number of available REDO levels.
imod::TSingleModelObserverBase< iser::ISerializable > BaseClass2
virtual void ResetUndo() override
Reset all UNDO and REDO steps.
bool DoListShift(int steps, UndoList &fromList, UndoList &toList)
virtual bool HasStoredDocumentState() const override
Check if there is stored document state available.
virtual iser::ISerializable * CastFromModel(imod::IModel *modelPtr) const override
virtual void AfterUpdate(imod::IModel *modelPtr, const istd::IChangeable::ChangeSet &changeSet) override
Callback invoked after an update of the observer's content occurs.
virtual QString GetUndoLevelDescription(int stepIndex) const override
Get description of single UNDO level.
virtual DocumentChangeFlag GetDocumentChangeFlag() const override
Check if document state is the same as stored state.
virtual bool DoRedo(int steps=1) override
Process REDO steps.
virtual bool StoreDocumentState() override
Store state of the document.
virtual void OnComponentDestroyed() override
virtual bool OnModelAttached(imod::IModel *modelPtr, istd::IChangeable::ChangeSet &changeMask) override
Callback invoked when an observable model is about to be attached to this observer.
virtual QString GetRedoLevelDescription(int stepIndex) const override
Get description of single REDO level.
virtual void BeforeUpdate(imod::IModel *modelPtr) override
Callback invoked before an update of the observer's content occurs.
virtual bool DoUndo(int steps=1) override
Process UNDO steps.
virtual bool RestoreDocumentState() override
Restore last stored document state.
Allows to store some document state used as reference for comparison.
DocumentChangeFlag
Flag indicating the relationship between current and stored document state.
Interface providing UNDO/REDO functionality.
Common interface for model objects, that supports Model/Observer design pattern.
Definition IModel.h:25
Common interface for all classes implementing the Observer functionality in the Model/Observer design...
Definition IObserver.h:156
Basic implementation for a single model observer with binding to concrete data object interface.
Implementation of archive using memory buffer to store the persistent objects.
Common class for all classes which objects can be archived or restored from archive.
Set of change flags (its IDs).
Definition IChangeable.h:36
Pointer wrapper providing automatic deleting pointed object during destruction.
Definition TDelPtr.h:21
Contains the system independent basic implementations of Document/View design pattern.