ACF $AcfVersion:0$
CModelBase.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/QMap>
7#include <QtCore/QMutex>
8
9// ACF includes
10#include <imod/imod.h>
11#include <imod/IModel.h>
12#include <imod/IObserver.h>
13
14
15namespace imod
16{
17
18
24class CModelBase: virtual public imod::IModel
25{
26public:
27 typedef QSet<IObserver*> Observers;
28
30 virtual ~CModelBase();
31
35 virtual int GetObserverCount() const;
36
40 virtual Observers GetObservers() const;
41
43
44 // reimplemented (imod::IModel)
45 virtual bool AttachObserver(imod::IObserver* observerPtr) override;
46 virtual void DetachObserver(imod::IObserver* observerPtr) override;
47 virtual void DetachAllObservers() override;
48 virtual bool IsAttached(const imod::IObserver* observerPtr) const override;
49
50protected:
55 void NotifyBeforeChange(const istd::IChangeable::ChangeSet& changeSet, bool isGroup);
61
65 virtual void OnBeginGlobalChanges() = 0;
69 virtual void OnEndGlobalChanges(const istd::IChangeable::ChangeSet& changeSet) = 0;
70
71private:
72 Q_DISABLE_COPY(CModelBase);
73
74 void CleanupObserverState();
75
76private:
80 enum AttachingState
81 {
85 AS_ATTACHING,
86
90 AS_ATTACHED,
94 AS_ATTACHED_UPDATING,
98 AS_DETACHING,
99
103 AS_DETACHED
104 };
105
106 struct ObserverInfo
107 {
108 AttachingState state;
110 };
111
112 typedef QMap<IObserver*, ObserverInfo> ObserversMap;
113 ObserversMap m_observers;
114
115 int m_blockCounter;
116 bool m_isDuringChanges;
117 istd::IChangeable::ChangeSet m_cumulatedChangeIds;
118
119#if QT_VERSION >= 0x060000
120 mutable QRecursiveMutex m_mutex;
121#else
122 mutable QMutex m_mutex;
123#endif
124};
125
126
127// public inline methods
128
130{
131 QMutexLocker lock(&m_mutex);
132
133 return m_cumulatedChangeIds;
134}
135
136
137} // namespace imod
138
139
140
Basic implementation of a model.
Definition CModelBase.h:25
virtual int GetObserverCount() const
Returns count of connected observers.
virtual void DetachObserver(imod::IObserver *observerPtr) override
Detaches model object from observer observerPtr.
virtual bool AttachObserver(imod::IObserver *observerPtr) override
Attaches model object to observer observerPtr.
virtual bool IsAttached(const imod::IObserver *observerPtr) const override
Returns true if observer observer is attached to this model object.
virtual ~CModelBase()
istd::IChangeable::ChangeSet GetCumulatedChanges() const
Definition CModelBase.h:129
void NotifyBeforeChange(const istd::IChangeable::ChangeSet &changeSet, bool isGroup)
Called before each change.
void NotifyAfterChange(const istd::IChangeable::ChangeSet &changeSet)
Called after each change.
virtual void OnBeginGlobalChanges()=0
Called before global changes will be started.
QSet< IObserver * > Observers
Definition CModelBase.h:27
virtual Observers GetObservers() const
Returns set of all observers.
virtual void OnEndGlobalChanges(const istd::IChangeable::ChangeSet &changeSet)=0
Called after global changes are finished.
virtual void DetachAllObservers() override
Detaches all attached observers.
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
Set of change flags (its IDs).
Definition IChangeable.h:36
This namespace containes basic implementation of Model/Observer design pattern This package is system...
Definition CModelBase.h:16