ImagingTools Core SDK
CGraphicsControllerComp.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// ACF includes
6#include <imod/TSingleModelObserverBase.h>
7#include <imod/CMultiModelDispatcherBase.h>
8#include <imod/TModelWrap.h>
9#include <icomp/CComponentBase.h>
10
11// ImtCore includes
12#include <imtbase/IObjectCollection.h>
13#include <imtbase/ITimeRangeProvider.h>
14#include <imtloggui/IGraphicsController.h>
15#include <imtloggui/IGraphicsSceneProvider.h>
16#include <imtloggui/IViewPropertyProvider.h>
17#include <imtloggui/IViewPropertyManager.h>
18#include <imtloggui/IEventNavigationController.h>
19#include <imtloggui/IEventScenePositionProvider.h>
20#include <imtloggui/CTimeAxis.h>
21#include <imtloggui/CEventGroupLabelItem.h>
22
23
24namespace imtloggui
25{
26
27
28class CGraphicsControllerComp:
29 public QObject,
30 public icomp::CComponentBase,
31 virtual public IGraphicsController,
32 virtual public IEventNavigationController
33{
34 Q_OBJECT
35
36public:
37 typedef icomp::CComponentBase BaseClass;
38
39 I_BEGIN_COMPONENT(CGraphicsControllerComp)
40 I_REGISTER_INTERFACE(IGraphicsController);
41 I_REGISTER_INTERFACE(IEventNavigationController);
42 I_REGISTER_SUBELEMENT(ScenePositionProvider);
43 I_REGISTER_SUBELEMENT_INTERFACE(ScenePositionProvider, IEventScenePositionProvider, ExtractPositionProvider);
44 I_REGISTER_SUBELEMENT(VisibleTimeRangeProvider);
45 I_REGISTER_SUBELEMENT_INTERFACE(VisibleTimeRangeProvider, imtbase::ITimeRangeProvider, ExtractVisibleTimeRangeProvider);
46 I_REGISTER_SUBELEMENT_INTERFACE(VisibleTimeRangeProvider, istd::IChangeable, ExtractVisibleTimeRangeProvider);
47 I_REGISTER_SUBELEMENT_INTERFACE(VisibleTimeRangeProvider, imod::IModel, ExtractVisibleTimeRangeProvider);
48 I_ASSIGN(m_graphicsSceneProviderCompPtr, "GraphicsSceneProvider", "Graphics scene provider", true, "GraphicsSceneProvider");
49 I_ASSIGN(m_groupProviderCompPtr, "GroupProvider", "Event groups provider", true, "GroupProvider");
50 I_ASSIGN(m_groupViewProviderCompPtr, "GroupViewProvider", "Event groups view provider", true, "GroupViewProvider");
51 I_ASSIGN(m_groupViewVisualSettingsCompPtr, "GroupVisualSettingsCollection", "Collection of visual settings for group view", false, "GroupVisualSettingsCollection");
52 I_ASSIGN(m_viewportGeometryProviderCompPtr, "ViewportGeometryProvider", "Graphics view property provider", true, "ViewportGeometryProvider");
53 I_ASSIGN_TO(m_viewportGeometryManagerModelCompPtr, m_viewportGeometryProviderCompPtr, true);
54 I_ASSIGN_TO(m_viewportGeometryManagerCompPtr, m_viewportGeometryProviderCompPtr, true);
55 I_ASSIGN(m_timeRangeProviderCompPtr, "EventHistoryTimeRangeProvider", "Time range provider for the time axis of the whole event history", true, "EventHistoryTimeRangeProvider");
56 I_ASSIGN_TO(m_timeRangeModelCompPtr, m_timeRangeProviderCompPtr, true);
57 I_END_COMPONENT
58
59 CGraphicsControllerComp();
60
61 // reimplemented (imtloggui::IEventNavigationController)
62 virtual void JumpToFirstEvent() const override;
63 virtual void JumpToPreviousEvent() const override;
64 virtual void JumpToNextEvent() const override;
65 virtual void JumpToLastEvent() const override;
66
67 // reimplemented (imtloggui::IGraphicsController)
68 virtual void InitScene() override;
69
70 // reimplemented (icomp::CComponentBase)
71 virtual void OnComponentCreated() override;
72 virtual void OnComponentDestroyed() override;
73
74private Q_SLOTS:
75 void OnAxisBeginTimeChanged(const QDateTime& oldTime, const QDateTime& newTime);
76 void OnAxisEndTimeChanged(const QDateTime& oldTime, const QDateTime& newTime);
77
78private:
79 void OnViewportGeometryUpdate(IViewPropertyProvider* propertyPtr, const istd::IChangeable::ChangeSet& changeSet);
80 void ConnectObserversToModels();
81 void DisconnectObserversFromModels();
82 void OnGroupChanged(int modelId);
83
84private:
85 typedef istd::TSmartPtr<QGraphicsItem> GraphicsItemPtr;
86 typedef QList<GraphicsItemPtr> GraphicsItemList;
87
88 template <typename InterfaceType>
89 static InterfaceType* ExtractPositionProvider(CGraphicsControllerComp& component)
90 {
91 return component.m_timeAxisPtr;
92 }
93
94 template <typename InterfaceType>
95 static InterfaceType* ExtractVisibleTimeRangeProvider(CGraphicsControllerComp& component)
96 {
97 return &component.m_visibleTimeRangeProvider;
98 }
99
100private:
101 class ViewportObserver: public imod::TSingleModelObserverBase<IViewPropertyProvider>
102 {
103 public:
104 ViewportObserver();
105
106 void SetParent(CGraphicsControllerComp* parent);
107
108 protected:
109 // reimplemented (imod::CSingleModelObserverBase)
110 virtual void OnUpdate(const istd::IChangeable::ChangeSet& changeSet) override;
111
112 private:
113 CGraphicsControllerComp* m_parent;
114 };
115
116 class TimeRangeObserver: public imod::TSingleModelObserverBase<imtbase::ITimeRangeProvider>
117 {
118 public:
119 TimeRangeObserver();
120
121 void SetParent(CGraphicsControllerComp* parent);
122
123 protected:
124 // reimplemented (imod::CSingleModelObserverBase)
125 virtual void OnUpdate(const istd::IChangeable::ChangeSet& changeSet) override;
126
127 private:
128 CGraphicsControllerComp* m_parent;
129 };
130
131 class TimeRangeProvider: public imtbase::ITimeRangeProvider
132 {
133 public:
134 TimeRangeProvider();
135
136 void SetParent(CGraphicsControllerComp* parent);
137 void SetTimeRange(const imtbase::CTimeRange& timeRange);
138
139 // reimplemented (imtbase::ITimeRangeProvider)
140 virtual imtbase::CTimeRange GetTimeRange() const override;
141
142 private:
143 CGraphicsControllerComp* m_parent;
144 imtbase::CTimeRange m_timeRange;
145 };
146
147 struct GroupItem
148 {
149 CEventGroupLabelItem* labelPtr;
150 QGraphicsRectItem* backgroundPtr;
151 };
152
153 class GroupsDispatcher: public imod::CMultiModelDispatcherBase
154 {
155 public:
156 GroupsDispatcher(CGraphicsControllerComp* parentPtr)
157 :m_parentPtr(parentPtr)
158 {
159 }
160
161 protected:
162 // reimplemented (imod::CMultiModelDispatcherBase)
163 virtual void OnModelChanged(int modelId, const istd::IChangeable::ChangeSet& changeSet) override;
164
165 private:
166 CGraphicsControllerComp* m_parentPtr;
167 };
168
169private:
170 I_REF(imtbase::IObjectCollection, m_groupProviderCompPtr);
171 I_REF(imtbase::IObjectCollection, m_groupViewProviderCompPtr);
172 I_REF(imtbase::IObjectCollection, m_groupViewVisualSettingsCompPtr);
173 I_REF(IGraphicsSceneProvider, m_graphicsSceneProviderCompPtr);
174 I_REF(IEventScenePositionProvider, m_positionProviderCompPtr);
175 I_REF(IViewPropertyProvider, m_viewportGeometryProviderCompPtr);
176 I_REF(imod::IModel, m_viewportGeometryManagerModelCompPtr);
177 I_REF(IViewPropertyManager, m_viewportGeometryManagerCompPtr);
178 I_REF(imtbase::ITimeRangeProvider, m_timeRangeProviderCompPtr);
179 I_REF(imod::IModel, m_timeRangeModelCompPtr);
180
181 CTimeAxis* m_timeAxisPtr;
182
183 ViewportObserver m_viewportObserver;
184 TimeRangeObserver m_timeRangeObserver;
185 imod::TModelWrap<TimeRangeProvider> m_visibleTimeRangeProvider;
186
187 GroupsDispatcher m_groupDispatcher;
188
189 QMap<QByteArray, GroupItem> m_groupStaticItems;
190};
191
192
193} // namespace imtloggui
194
195