1#ifndef GAME_EDITOR_EDITOR_TRACKERS_H
2#define GAME_EDITOR_EDITOR_TRACKERS_H
3
4#include <game/client/ui.h>
5#include <game/editor/map_object.h>
6#include <game/editor/mapitems.h>
7#include <game/mapitems.h>
8
9#include <map>
10#include <memory>
11#include <vector>
12
13class CLayer;
14class CLayerGroup;
15class CLayerQuads;
16class CLayerSounds;
17class CLayerTiles;
18class CSoundSource;
19
20class CQuadEditTracker : public CMapObject
21{
22public:
23 explicit CQuadEditTracker(CEditorMap *pMap);
24
25 bool QuadPointChanged(const std::vector<CPoint> &vCurrentPoints, int QuadIndex);
26 bool QuadColorChanged(const std::vector<CColor> &vCurrentColors, int QuadIndex);
27
28 void BeginQuadTrack(const std::shared_ptr<CLayerQuads> &pLayer, const std::vector<int> &vSelectedQuads, int GroupIndex = -1, int LayerIndex = -1);
29 void EndQuadTrack();
30
31 void BeginQuadPropTrack(const std::shared_ptr<CLayerQuads> &pLayer, const std::vector<int> &vSelectedQuads, EQuadProp Prop, int GroupIndex = -1, int LayerIndex = -1);
32 void EndQuadPropTrack(EQuadProp Prop);
33
34 void BeginQuadPointPropTrack(const std::shared_ptr<CLayerQuads> &pLayer, const std::vector<int> &vSelectedQuads, int SelectedQuadPoints, int GroupIndex = -1, int LayerIndex = -1);
35 void AddQuadPointPropTrack(EQuadPointProp Prop);
36 void EndQuadPointPropTrack(EQuadPointProp Prop);
37 void EndQuadPointPropTrackAll();
38
39private:
40 std::vector<int> m_vSelectedQuads;
41 int m_SelectedQuadPoints;
42 std::map<int, std::vector<CPoint>> m_InitialPoints;
43 std::map<int, std::vector<CColor>> m_InitialColors;
44
45 bool m_Tracking = false;
46 std::shared_ptr<CLayerQuads> m_pLayer;
47
48 EQuadProp m_TrackedProp;
49 std::vector<EQuadPointProp> m_vTrackedProps;
50 std::map<int, int> m_PreviousValues;
51 std::map<int, std::vector<std::map<EQuadPointProp, int>>> m_PreviousValuesPoint;
52 int m_LayerIndex;
53 int m_GroupIndex;
54};
55
56enum class EEnvelopeEditorOp
57{
58 NONE = 0,
59 SELECT,
60 DRAG_POINT,
61 DRAG_POINT_X,
62 DRAG_POINT_Y,
63 CONTEXT_MENU,
64 BOX_SELECT,
65 DRAG_TIME_BAR,
66 SCALE,
67};
68
69enum class ESoundSourceOp
70{
71 NONE = 0,
72 MOVE,
73 CONTEXT_MENU,
74};
75
76class CEnvelopeEditorOperationTracker : public CMapObject
77{
78public:
79 explicit CEnvelopeEditorOperationTracker(CEditorMap *pMap) :
80 CMapObject(pMap) {}
81
82 void Begin(EEnvelopeEditorOp Operation);
83 void Stop(bool Switch = true);
84 void Reset() { m_TrackedOp = EEnvelopeEditorOp::NONE; }
85
86private:
87 EEnvelopeEditorOp m_TrackedOp = EEnvelopeEditorOp::NONE;
88
89 class CPointData
90 {
91 public:
92 bool m_Used;
93 CFixedTime m_Time;
94 std::map<int, int> m_Values;
95 };
96
97 std::map<int, CPointData> m_SavedValues;
98
99 void HandlePointDragStart();
100 void HandlePointDragEnd(bool Switch);
101};
102
103class CSoundSourceOperationTracker : public CMapObject
104{
105public:
106 explicit CSoundSourceOperationTracker(CEditorMap *pMap);
107
108 void Begin(const CSoundSource *pSource, ESoundSourceOp Operation, int LayerIndex);
109 void End();
110
111private:
112 const CSoundSource *m_pSource;
113 ESoundSourceOp m_TrackedOp;
114 int m_LayerIndex;
115
116 class CData
117 {
118 public:
119 CPoint m_OriginalPoint;
120 };
121 CData m_Data;
122};
123
124class CPropTrackerHelper
125{
126public:
127 static int GetDefaultGroupIndex(CEditorMap *pMap);
128 static int GetDefaultLayerIndex(CEditorMap *pMap);
129};
130
131template<typename T, typename E>
132class CPropTracker : public CMapObject
133{
134public:
135 explicit CPropTracker(CEditorMap *pMap) :
136 CMapObject(pMap),
137 m_OriginalValue(0),
138 m_pObject(nullptr),
139 m_OriginalLayerIndex(-1),
140 m_OriginalGroupIndex(-1),
141 m_CurrentLayerIndex(-1),
142 m_CurrentGroupIndex(-1),
143 m_Tracking(false) {}
144
145 void Begin(const T *pObject, E Prop, EEditState State, int GroupIndex = -1, int LayerIndex = -1)
146 {
147 if(m_Tracking || Prop == static_cast<E>(-1))
148 return;
149 m_pObject = pObject;
150
151 m_OriginalGroupIndex = GroupIndex < 0 ? CPropTrackerHelper::GetDefaultGroupIndex(pMap: Map()) : GroupIndex;
152 m_OriginalLayerIndex = LayerIndex < 0 ? CPropTrackerHelper::GetDefaultLayerIndex(pMap: Map()) : LayerIndex;
153 m_CurrentGroupIndex = m_OriginalGroupIndex;
154 m_CurrentLayerIndex = m_OriginalLayerIndex;
155
156 int Value = PropToValue(Prop);
157 if(State == EEditState::START || State == EEditState::ONE_GO)
158 {
159 m_Tracking = true;
160 m_OriginalValue = Value;
161 OnStart(Prop);
162 }
163 }
164
165 void End(E Prop, EEditState State, int GroupIndex = -1, int LayerIndex = -1)
166 {
167 if(!m_Tracking || Prop == static_cast<E>(-1))
168 return;
169
170 m_CurrentGroupIndex = GroupIndex < 0 ? CPropTrackerHelper::GetDefaultGroupIndex(pMap: Map()) : GroupIndex;
171 m_CurrentLayerIndex = LayerIndex < 0 ? CPropTrackerHelper::GetDefaultLayerIndex(pMap: Map()) : LayerIndex;
172
173 if(State == EEditState::END || State == EEditState::ONE_GO)
174 {
175 m_Tracking = false;
176 int Value = PropToValue(Prop);
177 if(EndChecker(Prop, Value))
178 OnEnd(Prop, Value);
179 }
180 }
181
182protected:
183 virtual void OnStart(E Prop) {}
184 virtual void OnEnd(E Prop, int Value) {}
185 virtual int PropToValue(E Prop) { return 0; }
186 virtual bool EndChecker(E Prop, int Value)
187 {
188 return Value != m_OriginalValue;
189 }
190
191 int m_OriginalValue;
192 const T *m_pObject;
193 int m_OriginalLayerIndex;
194 int m_OriginalGroupIndex;
195 int m_CurrentLayerIndex;
196 int m_CurrentGroupIndex;
197 bool m_Tracking;
198};
199
200class CLayerPropTracker : public CPropTracker<CLayer, ELayerProp>
201{
202public:
203 explicit CLayerPropTracker(CEditorMap *pMap) :
204 CPropTracker<CLayer, ELayerProp>(pMap) {}
205
206protected:
207 void OnEnd(ELayerProp Prop, int Value) override;
208 int PropToValue(ELayerProp Prop) override;
209};
210
211class CLayerTilesPropTracker : public CPropTracker<CLayerTiles, ETilesProp>
212{
213public:
214 explicit CLayerTilesPropTracker(CEditorMap *pMap) :
215 CPropTracker<CLayerTiles, ETilesProp>(pMap) {}
216
217protected:
218 void OnStart(ETilesProp Prop) override;
219 void OnEnd(ETilesProp Prop, int Value) override;
220 bool EndChecker(ETilesProp Prop, int Value) override;
221
222 int PropToValue(ETilesProp Prop) override;
223
224private:
225 std::map<int, std::shared_ptr<CLayer>> m_SavedLayers;
226};
227
228class CLayerTilesCommonPropTracker : public CPropTracker<CLayerTiles, ETilesCommonProp>
229{
230public:
231 explicit CLayerTilesCommonPropTracker(CEditorMap *pMap) :
232 CPropTracker<CLayerTiles, ETilesCommonProp>(pMap) {}
233
234protected:
235 void OnStart(ETilesCommonProp Prop) override;
236 void OnEnd(ETilesCommonProp Prop, int Value) override;
237 bool EndChecker(ETilesCommonProp Prop, int Value) override;
238
239 int PropToValue(ETilesCommonProp Prop) override;
240
241private:
242 std::map<std::shared_ptr<CLayerTiles>, std::map<int, std::shared_ptr<CLayer>>> m_SavedLayers;
243
244public:
245 std::vector<std::shared_ptr<CLayerTiles>> m_vpLayers;
246 std::vector<int> m_vLayerIndices;
247};
248
249class CLayerGroupPropTracker : public CPropTracker<CLayerGroup, EGroupProp>
250{
251public:
252 explicit CLayerGroupPropTracker(CEditorMap *pMap) :
253 CPropTracker<CLayerGroup, EGroupProp>(pMap) {}
254
255protected:
256 void OnEnd(EGroupProp Prop, int Value) override;
257 int PropToValue(EGroupProp Prop) override;
258};
259
260class CLayerQuadsPropTracker : public CPropTracker<CLayerQuads, ELayerQuadsProp>
261{
262public:
263 explicit CLayerQuadsPropTracker(CEditorMap *pMap) :
264 CPropTracker<CLayerQuads, ELayerQuadsProp>(pMap) {}
265
266protected:
267 void OnEnd(ELayerQuadsProp Prop, int Value) override;
268 int PropToValue(ELayerQuadsProp Prop) override;
269};
270
271class CLayerSoundsPropTracker : public CPropTracker<CLayerSounds, ELayerSoundsProp>
272{
273public:
274 explicit CLayerSoundsPropTracker(CEditorMap *pMap) :
275 CPropTracker<CLayerSounds, ELayerSoundsProp>(pMap) {}
276
277protected:
278 void OnEnd(ELayerSoundsProp Prop, int Value) override;
279 int PropToValue(ELayerSoundsProp Prop) override;
280};
281
282class CSoundSourcePropTracker : public CPropTracker<CSoundSource, ESoundProp>
283{
284public:
285 explicit CSoundSourcePropTracker(CEditorMap *pMap) :
286 CPropTracker<CSoundSource, ESoundProp>(pMap) {}
287
288protected:
289 void OnEnd(ESoundProp Prop, int Value) override;
290 int PropToValue(ESoundProp Prop) override;
291};
292
293class CSoundSourceRectShapePropTracker : public CPropTracker<CSoundSource, ERectangleShapeProp>
294{
295public:
296 explicit CSoundSourceRectShapePropTracker(CEditorMap *pMap) :
297 CPropTracker<CSoundSource, ERectangleShapeProp>(pMap) {}
298
299protected:
300 void OnEnd(ERectangleShapeProp Prop, int Value) override;
301 int PropToValue(ERectangleShapeProp Prop) override;
302};
303
304class CSoundSourceCircleShapePropTracker : public CPropTracker<CSoundSource, ECircleShapeProp>
305{
306public:
307 explicit CSoundSourceCircleShapePropTracker(CEditorMap *pMap) :
308 CPropTracker<CSoundSource, ECircleShapeProp>(pMap) {}
309
310protected:
311 void OnEnd(ECircleShapeProp Prop, int Value) override;
312 int PropToValue(ECircleShapeProp Prop) override;
313};
314
315#endif
316