1 #include "MapView.h"
2
3 #define IMAGECLASS MapViewImg
4 #define IMAGEFILE <Map/MapView.iml>
5 #include <Draw/iml_source.h>
6
7 #define SetButtonStyle(but,im1,im2) \
8 static Button::Style but##_style = Button::StyleNormal(); \
9 but##_style.look[0] = MapViewImg::im1(); \
10 but##_style.look[1] = MapViewImg::im1(); \
11 but##_style.look[2] = MapViewImg::im2(); \
12 but##_style.look[3] = MapViewImg::im2(); \
13 but.SetStyle(but##_style);
14
MapView()15 MapView::MapView()
16 {
17 CtrlLayout(*this, t_("MapCtrl View"));
18 MinimizeBox().MinimizeBox().Sizeable();
19
20 // init values
21 _mousePos = Point(0, 0);
22 _drag = false;
23 _move = false;
24 _level = -1;
25
26 HideZoomSlider();
27 HideSearch();
28
29 // init layout
30 ZoomInBtn .NoWantFocus();
31 ZoomOutBtn .NoWantFocus();
32
33 MoveUpBtn .NoWantFocus();
34 MoveDownBtn .NoWantFocus();
35 MoveLeftBtn .NoWantFocus();
36 MoveRightBtn.NoWantFocus();
37
38 LevelUpBtn .NoWantFocus();
39 LevelDownBtn.NoWantFocus();
40
41 MoveUpBtn .WhenPush = MoveUpBtn .WhenRepeat = THISBACK(OnMoveUp);
42 MoveDownBtn .WhenPush = MoveDownBtn .WhenRepeat = THISBACK(OnMoveDown);
43 MoveLeftBtn .WhenPush = MoveLeftBtn .WhenRepeat = THISBACK(OnMoveLeft);
44 MoveRightBtn.WhenPush = MoveRightBtn.WhenRepeat = THISBACK(OnMoveRight);
45
46 ZoomInBtn .WhenPush = ZoomInBtn .WhenRepeat = THISBACK(OnZoomIn);
47 ZoomOutBtn.WhenPush = ZoomOutBtn.WhenRepeat = THISBACK(OnZoomOut);
48 ZoomSlider.WhenAction = THISBACK(OnZoomSlide);
49
50 LevelUpBtn .WhenPush = THISBACK(OnLevelUp);
51 LevelDownBtn.WhenPush = THISBACK(OnLevelDown);
52
53 Search.WhenAction = THISBACK(OnSearch);
54 Search.WhenEnter = THISBACK(OnSearch);
55 ClearSearchBtn <<= THISBACK(OnSearchClear);
56
57 SetButtonStyle(MoveUpBtn, map_button_up_1, map_button_up_2);
58 SetButtonStyle(MoveDownBtn, map_button_down_1, map_button_down_2);
59 SetButtonStyle(MoveLeftBtn, map_button_left_1, map_button_left_2);
60 SetButtonStyle(MoveRightBtn, map_button_right_1, map_button_right_2);
61
62 SetButtonStyle(ZoomInBtn, map_button_zoom_in_1, map_button_zoom_in_2);
63 SetButtonStyle(ZoomOutBtn, map_button_zoom_out_1, map_button_zoom_out_2);
64
65 SetButtonStyle(LevelUpBtn, map_button_zoom_in_1, map_button_zoom_in_2);
66 SetButtonStyle(LevelDownBtn, map_button_zoom_out_1, map_button_zoom_out_2);
67 }
68
OnLevelUp()69 void MapView::OnLevelUp()
70 {
71 _level++;
72 SetCurrentLevel(_level);
73 UpdateButtons();
74 }
75
OnLevelDown()76 void MapView::OnLevelDown()
77 {
78 _level--;
79 SetCurrentLevel(_level);
80 UpdateButtons();
81 }
82
OnMoveUp()83 void MapView::OnMoveUp()
84 {
85 if (GetCurrentLevel())
86 GetCurrentLevel()->MoveBy(Point(0, -100));
87 }
88
OnMoveDown()89 void MapView::OnMoveDown()
90 {
91 if (GetCurrentLevel())
92 GetCurrentLevel()->MoveBy(Point(0, 100));
93 }
94
OnMoveLeft()95 void MapView::OnMoveLeft()
96 {
97 if (GetCurrentLevel())
98 GetCurrentLevel()->MoveBy(Point(-100, 0));
99 }
100
OnMoveRight()101 void MapView::OnMoveRight()
102 {
103 if (GetCurrentLevel())
104 GetCurrentLevel()->MoveBy(Point( 100, 0));
105 }
106
OnZoomIn()107 void MapView::OnZoomIn()
108 {
109 MapLevel* level = GetCurrentLevel();
110 if (!level) return;
111
112 level->ZoomIn();
113 UpdateButtons();
114 ZoomSlider <<= level->GetCurrentZoom();
115 }
116
OnZoomOut()117 void MapView::OnZoomOut()
118 {
119 MapLevel* level = GetCurrentLevel();
120 if (!level) return;
121
122 level->ZoomOut();
123 UpdateButtons();
124 ZoomSlider <<= level->GetCurrentZoom();
125 }
126
OnZoomSlide()127 void MapView::OnZoomSlide()
128 {
129 MapLevel* level = GetCurrentLevel();
130 if (!level) return;
131
132 int zoom = ~ZoomSlider;
133 level->ZoomTo(zoom);
134 UpdateButtons();
135 }
136
UpdateButtons()137 void MapView::UpdateButtons()
138 {
139 MapLevel* level = GetCurrentLevel();
140 if (!level)
141 {
142 ZoomInBtn .Disable();
143 ZoomOutBtn .Disable();
144 LevelUpBtn .Disable();
145 LevelDownBtn.Disable();
146
147 MoveUpBtn .Disable();
148 MoveDownBtn .Disable();
149 MoveLeftBtn .Disable();
150 MoveRightBtn.Disable();
151 return;
152 }
153
154 int total = level->GetZoomCount();
155 int zoom = level->GetCurrentZoom();
156
157 ZoomInBtn .Enable(zoom >= 0 && zoom < total - 1);
158 ZoomOutBtn.Enable(zoom >= 1 && zoom < total);
159
160 LevelUpBtn .Enable(_level < _levels.GetCount() - 1);
161 LevelDownBtn.Enable(_level > 0);
162 }
163
ShowZoomSlider(bool flag)164 void MapView::ShowZoomSlider(bool flag)
165 {
166 ZoomSlider.Show(flag);
167 }
168
ShowNavButtons(bool flag)169 void MapView::ShowNavButtons(bool flag)
170 {
171 MoveUpBtn .Show(flag);
172 MoveDownBtn .Show(flag);
173 MoveLeftBtn .Show(flag);
174 MoveRightBtn.Show(flag);
175 }
176
ShowLevelsCtrl(bool flag)177 void MapView::ShowLevelsCtrl(bool flag)
178 {
179 LevelName .Show(flag);
180 LevelUpBtn .Show(flag);
181 LevelDownBtn.Show(flag);
182 }
183
ShowSearch(bool flag)184 void MapView::ShowSearch(bool flag)
185 {
186 Search .Show(flag);
187 ClearSearchBtn.Show(flag);
188 }
189
SetCurrentLevel(int level)190 void MapView::SetCurrentLevel(int level)
191 {
192 MapLevel* p = GetLevel(level);
193 if (!p)
194 {
195 _level = -1;
196 return;
197 }
198
199 _level = level;
200
201 for (int i = 0; i < _levels.GetCount(); ++i)
202 _levels[i].Hide();
203
204 p->Show();
205 ZoomSlider.Range(p->GetZoomCount() - 1).Step(1);
206 ZoomSlider <<= p->GetCurrentZoom();
207 LevelName.SetLabel(p->GetLevelName());
208 UpdateButtons();
209 }
210
LoadMap(Map & map,bool editMode)211 bool MapView::LoadMap(Map& map, bool editMode)
212 {
213 for (int i = 0; i < _levels.GetCount(); ++i)
214 RemoveChild(&_levels[i]);
215 _levels.Clear();
216
217 for (int i = 0; i < map.GetLevels().GetCount(); ++i)
218 {
219 MapLevel& level = _levels.Add();
220 AddChildBefore(&level.SizePos(), GetFirstChild());
221 level.IgnoreMouse();
222 level.Hide();
223
224 String fp = AppendFileName(
225 AppendFileName( GetFileDirectory(GetExeFilePath()), "Mipmaps"),
226 NFormat("%s-%d.xml", map.GetName(), i + 1)
227 );
228
229 level.SetLevelName(map.GetLevels()[i].GetName());
230 level.SetLevelDesc(map.GetLevels()[i].GetDesc());
231 level.LoadMap(fp);
232 level.EditMode(editMode);
233
234 for (int j = 0; j < map.GetLevels()[i].GetLayers().GetCount(); ++j)
235 {
236 Ptr<IMapRender> layer = level.AddItem<IMapRender>();
237
238 /* Array<Room>& rooms = map.GetLevels()[i].GetLayers()[j].GetRooms();
239 for (int r = 0; r < rooms.GetCount(); ++r)
240 {
241 Ptr<PolygonItem> room = layer->AddItem<PolygonItem>();
242 for (int v = 0; v < rooms[r].GetVertices().GetCount(); ++v)
243 room->AddVertice(rooms[r].GetVertices()[v]);
244 room->SetRoom(rooms[r]);
245 if (editMode)
246 room->StateOn(STATE_EDIT);
247 }*/
248
249 for (int rx = 0; rx < 10; ++rx)
250 for (int ry = 0; ry < 10; ++ry)
251 {
252 Ptr<PolygonItem> room = layer->AddItem<PolygonItem>();
253 room->AddVertice( 0 * rx, 0 * ry);
254 room->AddVertice(40 * rx, 0 * ry);
255 room->AddVertice(40 * rx, 40 * ry);
256 room->AddVertice( 0 * rx, 40 * ry);
257 room->SetRoom(rooms[r]);
258 if (editMode)
259 room->StateOn(STATE_EDIT);
260 }
261 }
262 }
263
264 SetCurrentLevel(_levels.GetCount() ? 0 : -1);
265 return true;
266 }
267
LoadMap(const char * fp,bool editMode)268 bool MapView::LoadMap(const char* fp, bool editMode)
269 {
270 Map map;
271 if (!LoadFromXMLFile(map, fp))
272 return false;
273
274 return LoadMap(map, editMode);
275 }
276
UpdateLevel(Level & level,int pos,bool editMode)277 bool MapView::UpdateLevel(Level& level, int pos, bool editMode)
278 {
279 if (pos < 0 || pos >= _levels.GetCount())
280 return false;
281
282 MapLevel& mapLevel = _levels[pos];
283 mapLevel.EditMode(editMode);
284
285 if (mapLevel.GetItems().GetCount() != level.GetLayers().GetCount())
286 mapLevel.Clear();
287
288 Vector<Ptr<IMapItem> >& mapLayers = mapLevel.GetItems();
289
290 for (int j = 0; j < level.GetLayers().GetCount(); ++j)
291 {
292 IMapRender* mapLayer =
293 (j < mapLayers.GetCount())
294 ? dynamic_cast<IMapRender*>(~mapLayers[j])
295 : ~mapLevel.AddItem<IMapRender>();
296
297 Vector<Ptr<IMapItem> >& mapRooms = mapLayer->GetItems();
298 Array<Room>& rooms = level.GetLayers()[j].GetRooms();
299 mapLayer->Clear();
300
301 for (int r = 0; r < rooms.GetCount(); ++r)
302 {
303 Ptr<PolygonItem> mapRoom =
304 mapLayer->AddItem<PolygonItem>();
305
306 mapRoom->GetVertices().Clear();
307 for (int v = 0; v < rooms[r].GetVertices().GetCount(); ++v)
308 mapRoom->AddVertice(rooms[r].GetVertices()[v]);
309 mapRoom->SetRoom(rooms[r]);
310 if (editMode)
311 mapRoom->StateOn(STATE_EDIT);
312 }
313 }
314
315 Refresh();
316 }
317