ICF 3.1.1.10
Technical documentation of ICF Libraries
TObjectShapeBase.h
Go to the documentation of this file.
1/********************************************************************************
2** This file is part of the ICF Framework. Copyright (C) Witold Gantzke & Kirill Lepskiy
3** ICF Framework may be used under the terms of the LGPL License v. 2.1 by the Free Software Foundation.
4********************************************************************************/
5
6#pragma once
7
8
9// Qt includes
10#include <QtCore/QtGlobal>
11#include <QtWidgets/QGraphicsSceneMouseEvent>
12
13// ICF includes
14#include <istd/CChangeGroup.h>
16#include <i2d/IObject2d.h>
17#include <icmpstr/TShapeBase.h>
18
19
20namespace icmpstr
21{
22
23
24template <class GraphicsItemClass, class ObjectClass>
26 public TShapeBase<GraphicsItemClass>,
27 public imod::TSingleModelObserverBase<ObjectClass>
28{
29public:
32
33 TObjectShapeBase(bool isEditable = false, const ISceneProvider* providerPtr = nullptr);
34
35protected:
37
38 // reimplemented (TShapeBase)
39 void OnSelectionChanged(bool isSelected) override;
40 void OnPositionChanged(const QPointF& position) override;
41
42 // reimplemented (QGraphicsItem)
43 QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) override;
44 void mousePressEvent(QGraphicsSceneMouseEvent* eventPtr) override;
45 void mouseReleaseEvent(QGraphicsSceneMouseEvent* eventPtr) override;
46 void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* eventPtr) override;
47
48 // reimplemented (imod::IObserver)
49 bool OnModelAttached(imod::IModel* modelPtr, istd::IChangeable::ChangeSet& changeMask) override;
50 void AfterModelChange(imod::IModel* modelPtr, const istd::IChangeable::ChangeSet& changeSet) override;
51
52 // abstract methods
53 virtual void UpdateGraphicsItem(const ObjectClass& object) = 0;
54
55private:
56 QPointF m_lastPosition;
57
58 bool m_isShapeUpdateBlocked;
59
60 std::unique_ptr<istd::CChangeGroup> m_dragNotifierPtr;
61
62 static const istd::IChangeable::ChangeSet s_moveObjectChangeSet;
63};
64
65
66// public methods
67
68template <class GraphicsItemClass, class ObjectClass>
70: BaseClass(isEditable, providerPtr),
71 m_isShapeUpdateBlocked(false)
72{
73 BaseClass::SetPen(BaseClass::InactiveColor, QPen(Qt::darkGreen, 0));
75 BaseClass::SetPen(BaseClass::SelectedColor, QPen(Qt::yellow, 0));
76
77 if (isEditable){
78 BaseClass::setFlags(BaseClass::ItemIsMovable | BaseClass::ItemIsSelectable | BaseClass::ItemSendsGeometryChanges);
79 BaseClass::setCursor(QCursor(Qt::ArrowCursor));
80
82 }
83 else{
85 }
86}
87
88
89// protected methods
90
91template <class GraphicsItemClass, class ObjectClass>
93{
94 if (auto* objectPtr = BaseClass2::GetObservedObject()){
95 m_isShapeUpdateBlocked = true;
96
97 UpdateGraphicsItem(*objectPtr);
98
99 m_isShapeUpdateBlocked = false;
100
101 BaseClass::update();
102 }
103}
104
105
106// reimplemented (TShapeBase<GraphicsItemClass, ObjectClass>)
107
108template <class GraphicsItemClass, class ObjectClass>
110{
111 if (isSelected){
112 BaseClass::SwitchColorSheme(BaseClass::SelectedColor);
113 }
114 else{
115 if (BaseClass::IsEditable()){
116 BaseClass::SwitchColorSheme(BaseClass::EditableColor);
117 }
118 else{
119 BaseClass::SwitchColorSheme(BaseClass::InactiveColor);
120 }
121 }
122}
123
124
125template <class GraphicsItemClass, class ObjectClass>
127{
128 i2d::IObject2d* objectPtr = BaseClass2::GetObservedObject();
129 if (objectPtr != nullptr){
130 QPointF offset = position - m_lastPosition;
131
132 objectPtr->MoveCenterTo(i2d::CVector2d(offset) + objectPtr->GetCenter());
133
134 m_lastPosition = position;
135 }
136
137 BaseClass::OnPositionChanged(position);
138}
139
140
141template <class GraphicsItemClass, class ObjectClass>
142QVariant TObjectShapeBase<GraphicsItemClass, ObjectClass>::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value)
143{
144 if (!m_isShapeUpdateBlocked){
145 return BaseClass::itemChange(change, value);
146 }
147
148 return value;
149}
150
151
152template <class GraphicsItemClass, class ObjectClass>
154{
155 BaseClass::mousePressEvent(eventPtr);
156
157 if (BaseClass::IsEditable() && (eventPtr->button() == Qt::LeftButton)){
158 m_lastPosition = BaseClass::pos();
159
160 m_dragNotifierPtr = std::make_unique<istd::CChangeGroup>(BaseClass2::GetObservedObject(), &s_moveObjectChangeSet);
161 }
162}
163
164
165template <class GraphicsItemClass, class ObjectClass>
167{
168 BaseClass::mouseReleaseEvent(eventPtr);
169
170 m_dragNotifierPtr = nullptr;
171}
172
173
174template <class GraphicsItemClass, class ObjectClass>
176{
177 BaseClass::mouseDoubleClickEvent(eventPtr);
178
179 m_dragNotifierPtr = nullptr;
180}
181
182
183// reimplemented (imod::IObserver)
184
185template <class GraphicsItemClass, class ObjectClass>
187{
188 if (BaseClass2::OnModelAttached(modelPtr, changeMask)) {
189 DoShapeUpdate();
190
191 return true;
192 }
193
194 return false;
195}
196
197
198template <class GraphicsItemClass, class ObjectClass>
200{
201 Q_ASSERT(!m_isShapeUpdateBlocked);
202
204 DoShapeUpdate();
205 }
206
207 BaseClass2::AfterModelChange(modelPtr, changeSet);
208}
209
210
211// static attributes
212
213template <class GraphicsItemClass, class ObjectClass>
215
216
217} // namespace icmpstr
218
219
Definition of position or mathematical vector on 2D plane.
Definition CVector2d.h:29
Common interface for describing the 2D-objects.
Definition IObject2d.h:30
virtual void MoveCenterTo(const CVector2d &position)=0
Move object to position position.
virtual CVector2d GetCenter() const =0
Returns center of this 2D-object.
Interface for GUI objects managing scene.
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *eventPtr) override
void OnPositionChanged(const QPointF &position) override
QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override
void AfterModelChange(imod::IModel *modelPtr, const istd::IChangeable::ChangeSet &changeSet) override
This function will be called after update of the observer contents occures.
bool OnModelAttached(imod::IModel *modelPtr, istd::IChangeable::ChangeSet &changeMask) override
This call back function will be called, if an observable object is about to be attached.
void mouseReleaseEvent(QGraphicsSceneMouseEvent *eventPtr) override
TShapeBase< GraphicsItemClass > BaseClass
void mousePressEvent(QGraphicsSceneMouseEvent *eventPtr) override
virtual void UpdateGraphicsItem(const ObjectClass &object)=0
TObjectShapeBase(bool isEditable=false, const ISceneProvider *providerPtr=nullptr)
void OnSelectionChanged(bool isSelected) override
imod::TSingleModelObserverBase< ObjectClass > BaseClass2
virtual void SwitchColorSheme(int colorSheme)
Definition TShapeBase.h:165
virtual void SetPen(int colorSheme, const QPen &pen)
Definition TShapeBase.h:115
@ InactiveColor
Color for a shape, that can not be edited on the graphics view.
Definition TShapeBase.h:50
@ SelectedColor
Color for a selected shape.
Definition TShapeBase.h:40
@ EditableColor
Color for a shape, that can be edited on the graphics view.
Definition TShapeBase.h:45
Common interface for model objects, that supports Model/Observer design pattern.
Definition IModel.h:29
Basic implementation for a single model observer with binding to concrete data object interface.
Set of change flags (its IDs).
Definition IChangeable.h:38
bool ContainsExplicit(int changeId, bool singleOnly=false) const
Check if there is specific change flag in the set explicit set by user.
@ CF_DESTROYING
Change flag indicate that model is during destruction.
This package contains (Qt based) implementations of compositor components.

© Witold Gantzke and Kirill Lepskiy