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