#include "MapView.h" #define IMAGECLASS MapViewImg #define IMAGEFILE #include #define SetButtonStyle(but,im1,im2) \ static Button::Style but##_style = Button::StyleNormal(); \ but##_style.look[0] = MapViewImg::im1(); \ but##_style.look[1] = MapViewImg::im1(); \ but##_style.look[2] = MapViewImg::im2(); \ but##_style.look[3] = MapViewImg::im2(); \ but.SetStyle(but##_style); MapView::MapView() { CtrlLayout(*this, t_("MapCtrl View")); MinimizeBox().MinimizeBox().Sizeable(); // init values _mousePos = Point(0, 0); _drag = false; _move = false; _level = -1; HideZoomSlider(); HideSearch(); // init layout ZoomInBtn .NoWantFocus(); ZoomOutBtn .NoWantFocus(); MoveUpBtn .NoWantFocus(); MoveDownBtn .NoWantFocus(); MoveLeftBtn .NoWantFocus(); MoveRightBtn.NoWantFocus(); LevelUpBtn .NoWantFocus(); LevelDownBtn.NoWantFocus(); MoveUpBtn .WhenPush = MoveUpBtn .WhenRepeat = THISBACK(OnMoveUp); MoveDownBtn .WhenPush = MoveDownBtn .WhenRepeat = THISBACK(OnMoveDown); MoveLeftBtn .WhenPush = MoveLeftBtn .WhenRepeat = THISBACK(OnMoveLeft); MoveRightBtn.WhenPush = MoveRightBtn.WhenRepeat = THISBACK(OnMoveRight); ZoomInBtn .WhenPush = ZoomInBtn .WhenRepeat = THISBACK(OnZoomIn); ZoomOutBtn.WhenPush = ZoomOutBtn.WhenRepeat = THISBACK(OnZoomOut); ZoomSlider.WhenAction = THISBACK(OnZoomSlide); LevelUpBtn .WhenPush = THISBACK(OnLevelUp); LevelDownBtn.WhenPush = THISBACK(OnLevelDown); Search.WhenAction = THISBACK(OnSearch); Search.WhenEnter = THISBACK(OnSearch); ClearSearchBtn <<= THISBACK(OnSearchClear); SetButtonStyle(MoveUpBtn, map_button_up_1, map_button_up_2); SetButtonStyle(MoveDownBtn, map_button_down_1, map_button_down_2); SetButtonStyle(MoveLeftBtn, map_button_left_1, map_button_left_2); SetButtonStyle(MoveRightBtn, map_button_right_1, map_button_right_2); SetButtonStyle(ZoomInBtn, map_button_zoom_in_1, map_button_zoom_in_2); SetButtonStyle(ZoomOutBtn, map_button_zoom_out_1, map_button_zoom_out_2); SetButtonStyle(LevelUpBtn, map_button_zoom_in_1, map_button_zoom_in_2); SetButtonStyle(LevelDownBtn, map_button_zoom_out_1, map_button_zoom_out_2); } void MapView::OnLevelUp() { _level++; SetCurrentLevel(_level); UpdateButtons(); } void MapView::OnLevelDown() { _level--; SetCurrentLevel(_level); UpdateButtons(); } void MapView::OnMoveUp() { if (GetCurrentLevel()) GetCurrentLevel()->MoveBy(Point(0, -100)); } void MapView::OnMoveDown() { if (GetCurrentLevel()) GetCurrentLevel()->MoveBy(Point(0, 100)); } void MapView::OnMoveLeft() { if (GetCurrentLevel()) GetCurrentLevel()->MoveBy(Point(-100, 0)); } void MapView::OnMoveRight() { if (GetCurrentLevel()) GetCurrentLevel()->MoveBy(Point( 100, 0)); } void MapView::OnZoomIn() { MapLevel* level = GetCurrentLevel(); if (!level) return; level->ZoomIn(); UpdateButtons(); ZoomSlider <<= level->GetCurrentZoom(); } void MapView::OnZoomOut() { MapLevel* level = GetCurrentLevel(); if (!level) return; level->ZoomOut(); UpdateButtons(); ZoomSlider <<= level->GetCurrentZoom(); } void MapView::OnZoomSlide() { MapLevel* level = GetCurrentLevel(); if (!level) return; int zoom = ~ZoomSlider; level->ZoomTo(zoom); UpdateButtons(); } void MapView::UpdateButtons() { MapLevel* level = GetCurrentLevel(); if (!level) { ZoomInBtn .Disable(); ZoomOutBtn .Disable(); LevelUpBtn .Disable(); LevelDownBtn.Disable(); MoveUpBtn .Disable(); MoveDownBtn .Disable(); MoveLeftBtn .Disable(); MoveRightBtn.Disable(); return; } int total = level->GetZoomCount(); int zoom = level->GetCurrentZoom(); ZoomInBtn .Enable(zoom >= 0 && zoom < total - 1); ZoomOutBtn.Enable(zoom >= 1 && zoom < total); LevelUpBtn .Enable(_level < _levels.GetCount() - 1); LevelDownBtn.Enable(_level > 0); } void MapView::ShowZoomSlider(bool flag) { ZoomSlider.Show(flag); } void MapView::ShowNavButtons(bool flag) { MoveUpBtn .Show(flag); MoveDownBtn .Show(flag); MoveLeftBtn .Show(flag); MoveRightBtn.Show(flag); } void MapView::ShowLevelsCtrl(bool flag) { LevelName .Show(flag); LevelUpBtn .Show(flag); LevelDownBtn.Show(flag); } void MapView::ShowSearch(bool flag) { Search .Show(flag); ClearSearchBtn.Show(flag); } void MapView::SetCurrentLevel(int level) { MapLevel* p = GetLevel(level); if (!p) { _level = -1; return; } _level = level; for (int i = 0; i < _levels.GetCount(); ++i) _levels[i].Hide(); p->Show(); ZoomSlider.Range(p->GetZoomCount() - 1).Step(1); ZoomSlider <<= p->GetCurrentZoom(); LevelName.SetLabel(p->GetLevelName()); UpdateButtons(); } bool MapView::LoadMap(Map& map, bool editMode) { for (int i = 0; i < _levels.GetCount(); ++i) RemoveChild(&_levels[i]); _levels.Clear(); for (int i = 0; i < map.GetLevels().GetCount(); ++i) { MapLevel& level = _levels.Add(); AddChildBefore(&level.SizePos(), GetFirstChild()); level.IgnoreMouse(); level.Hide(); String fp = AppendFileName( AppendFileName( GetFileDirectory(GetExeFilePath()), "Mipmaps"), NFormat("%s-%d.xml", map.GetName(), i + 1) ); level.SetLevelName(map.GetLevels()[i].GetName()); level.SetLevelDesc(map.GetLevels()[i].GetDesc()); level.LoadMap(fp); level.EditMode(editMode); for (int j = 0; j < map.GetLevels()[i].GetLayers().GetCount(); ++j) { Ptr layer = level.AddItem(); /* Array& rooms = map.GetLevels()[i].GetLayers()[j].GetRooms(); for (int r = 0; r < rooms.GetCount(); ++r) { Ptr room = layer->AddItem(); for (int v = 0; v < rooms[r].GetVertices().GetCount(); ++v) room->AddVertice(rooms[r].GetVertices()[v]); room->SetRoom(rooms[r]); if (editMode) room->StateOn(STATE_EDIT); }*/ for (int rx = 0; rx < 10; ++rx) for (int ry = 0; ry < 10; ++ry) { Ptr room = layer->AddItem(); room->AddVertice( 0 * rx, 0 * ry); room->AddVertice(40 * rx, 0 * ry); room->AddVertice(40 * rx, 40 * ry); room->AddVertice( 0 * rx, 40 * ry); room->SetRoom(rooms[r]); if (editMode) room->StateOn(STATE_EDIT); } } } SetCurrentLevel(_levels.GetCount() ? 0 : -1); return true; } bool MapView::LoadMap(const char* fp, bool editMode) { Map map; if (!LoadFromXMLFile(map, fp)) return false; return LoadMap(map, editMode); } bool MapView::UpdateLevel(Level& level, int pos, bool editMode) { if (pos < 0 || pos >= _levels.GetCount()) return false; MapLevel& mapLevel = _levels[pos]; mapLevel.EditMode(editMode); if (mapLevel.GetItems().GetCount() != level.GetLayers().GetCount()) mapLevel.Clear(); Vector >& mapLayers = mapLevel.GetItems(); for (int j = 0; j < level.GetLayers().GetCount(); ++j) { IMapRender* mapLayer = (j < mapLayers.GetCount()) ? dynamic_cast(~mapLayers[j]) : ~mapLevel.AddItem(); Vector >& mapRooms = mapLayer->GetItems(); Array& rooms = level.GetLayers()[j].GetRooms(); mapLayer->Clear(); for (int r = 0; r < rooms.GetCount(); ++r) { Ptr mapRoom = mapLayer->AddItem(); mapRoom->GetVertices().Clear(); for (int v = 0; v < rooms[r].GetVertices().GetCount(); ++v) mapRoom->AddVertice(rooms[r].GetVertices()[v]); mapRoom->SetRoom(rooms[r]); if (editMode) mapRoom->StateOn(STATE_EDIT); } } Refresh(); }