ACF $AcfVersion:0$
TSingleModelObserverBase.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// STL includes
6#include <typeinfo>
7
8// Qt includes
9#include <QtCore/QString>
10
11// ACF includes
13#include <imod/IModel.h>
14
15
16namespace imod
17{
18
19
26template <class ModelInterface>
28{
29public:
31 typedef ModelInterface ModelType;
32
34
38 ModelInterface* GetObservedObject() const;
43 ModelInterface* GetObjectPtr() const;
44
48 bool AttachOrSetObject(ModelInterface* objectPtr);
49
50 // reimplemented (imod::IObserver)
51 virtual bool OnModelAttached(imod::IModel* modelPtr, istd::IChangeable::ChangeSet& changeMask) override;
52 virtual bool OnModelDetached(imod::IModel* modelPtr) override;
53
54protected:
55 virtual ModelInterface* CastFromModel(imod::IModel* modelPtr) const;
56
57private:
58 ModelInterface* m_observedObjectPtr;
59};
60
61
62// public methods
63
64template <class ModelInterface>
69
70
71template <class ModelInterface>
73{
74 return m_observedObjectPtr;
75}
76
77
78template <class ModelInterface>
80{
81 return m_observedObjectPtr;
82}
83
84
85template <class ModelInterface>
87{
88 EnsureModelDetached();
89
90 imod::IModel* modelPtr = dynamic_cast<imod::IModel*>(objectPtr);
91
92 bool retVal = false;
93 if ((modelPtr != NULL) && modelPtr->AttachObserver(this)){
94 retVal = true;
95 }
96
97 m_observedObjectPtr = objectPtr;
98
99 return retVal;
100}
101
102
103// reimplemented (imod::IObserver)
104
105template <class ModelInterface>
107{
108 m_observedObjectPtr = CastFromModel(modelPtr);
109
111 if (m_observedObjectPtr == NULL){
112 QString exptectedObjectInterface = typeid(ModelInterface).name();
113
114 qDebug("Data model interface is not supported by this observer. Expected interface is: %s", qPrintable(exptectedObjectInterface));
115 }
116 )
117
118 if ((m_observedObjectPtr != NULL) && BaseClass::OnModelAttached(modelPtr, changeMask)){
119 return true;
120 }
121
122 BaseClass::EnsureModelDetached();
123
124 return false;
125}
126
127
128template <class ModelInterface>
130{
131 if (BaseClass::OnModelDetached(modelPtr)){
132 // If model was correctly attached m_observedObjectPtr cannot be NULL. OnDetach returns true only if model was correctly attached.
133 Q_ASSERT(m_observedObjectPtr != NULL);
134
135 m_observedObjectPtr = NULL;
136
137 return true;
138 }
139
140 return false;
141}
142
143
144// protected methods
145
146template <class ModelInterface>
148{
149 return dynamic_cast<ModelInterface*>(modelPtr);
150}
151
152
153} // namespace imod
154
155
156
157
Basic implementation for a single model observer.
Common interface for model objects, that supports Model/Observer design pattern.
Definition IModel.h:25
virtual bool AttachObserver(IObserver *observerPtr)=0
Attaches model object to observer observerPtr.
Basic implementation for a single model observer with binding to concrete data object interface.
ModelInterface * GetObjectPtr() const
Get instance of observed object.
virtual bool OnModelDetached(imod::IModel *modelPtr) override
Callback invoked when an observable model is about to be detached from this observer.
bool AttachOrSetObject(ModelInterface *objectPtr)
Attach to model of object or set object pointer, if no connection is possible.
virtual ModelInterface * CastFromModel(imod::IModel *modelPtr) const
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.
ModelInterface * GetObservedObject() const
Get instance of observed object.
Set of change flags (its IDs).
Definition IChangeable.h:36
#define NULL
Definition istd.h:74
#define I_IF_DEBUG(instructions)
Definition istd.h:59
This namespace containes basic implementation of Model/Observer design pattern This package is system...
Definition CModelBase.h:16