summary refs log tree commit diff stats
path: root/tools/mapedit/src/frame.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/mapedit/src/frame.cpp')
-rw-r--r--tools/mapedit/src/frame.cpp321
1 files changed, 265 insertions, 56 deletions
diff --git a/tools/mapedit/src/frame.cpp b/tools/mapedit/src/frame.cpp index a38b861..9d489b8 100644 --- a/tools/mapedit/src/frame.cpp +++ b/tools/mapedit/src/frame.cpp
@@ -5,6 +5,7 @@
5#include <wx/statline.h> 5#include <wx/statline.h>
6#include "panel.h" 6#include "panel.h"
7#include <list> 7#include <list>
8#include <exception>
8 9
9static std::list<wxWindow*> openWindows; 10static std::list<wxWindow*> openWindows;
10 11
@@ -15,9 +16,18 @@ enum {
15 MENU_FILE_OPEN, 16 MENU_FILE_OPEN,
16 MENU_FILE_SAVE, 17 MENU_FILE_SAVE,
17 MENU_FILE_CLOSE, 18 MENU_FILE_CLOSE,
19 MENU_MAP_ADD_ROOT,
20 MENU_MAP_ADD_CHILD,
18 TOOL_FILE_NEW, 21 TOOL_FILE_NEW,
19 TOOL_FILE_OPEN, 22 TOOL_FILE_OPEN,
20 TOOL_FILE_SAVE 23 TOOL_FILE_SAVE,
24 TOOL_MAP_ADD_ROOT,
25 TOOL_MAP_ADD_CHILD,
26 MAP_EDITOR_NOTEBOOK,
27 MAP_EDITOR_TREE,
28 MAP_TITLE_TEXTBOX,
29 ADD_ENTITY_BUTTON,
30 CANCEL_ENTITY_BUTTON
21}; 31};
22 32
23wxBEGIN_EVENT_TABLE(MapeditFrame, wxFrame) 33wxBEGIN_EVENT_TABLE(MapeditFrame, wxFrame)
@@ -27,22 +37,41 @@ wxBEGIN_EVENT_TABLE(MapeditFrame, wxFrame)
27 EVT_MENU(MENU_FILE_NEW, MapeditFrame::OnNew) 37 EVT_MENU(MENU_FILE_NEW, MapeditFrame::OnNew)
28 EVT_MENU(MENU_FILE_OPEN, MapeditFrame::OnOpen) 38 EVT_MENU(MENU_FILE_OPEN, MapeditFrame::OnOpen)
29 EVT_MENU(MENU_FILE_SAVE, MapeditFrame::OnSave) 39 EVT_MENU(MENU_FILE_SAVE, MapeditFrame::OnSave)
40 EVT_MENU(MENU_FILE_CLOSE, MapeditFrame::OnClose)
41 EVT_MENU(MENU_MAP_ADD_ROOT, MapeditFrame::OnAddRoot)
42 EVT_MENU(MENU_MAP_ADD_CHILD, MapeditFrame::OnAddChild)
30 EVT_TOOL(TOOL_FILE_NEW, MapeditFrame::OnNew) 43 EVT_TOOL(TOOL_FILE_NEW, MapeditFrame::OnNew)
31 EVT_TOOL(TOOL_FILE_OPEN, MapeditFrame::OnOpen) 44 EVT_TOOL(TOOL_FILE_OPEN, MapeditFrame::OnOpen)
32 EVT_TOOL(TOOL_FILE_SAVE, MapeditFrame::OnSave) 45 EVT_TOOL(TOOL_FILE_SAVE, MapeditFrame::OnSave)
33 EVT_MENU(MENU_FILE_CLOSE, MapeditFrame::OnClose) 46 EVT_TOOL(TOOL_MAP_ADD_ROOT, MapeditFrame::OnAddRoot)
47 EVT_TOOL(TOOL_MAP_ADD_CHILD, MapeditFrame::OnAddChild)
34 EVT_CLOSE(MapeditFrame::OnExit) 48 EVT_CLOSE(MapeditFrame::OnExit)
49 EVT_NOTEBOOK_PAGE_CHANGED(MAP_EDITOR_NOTEBOOK, MapeditFrame::OnTabChange)
50 EVT_NOTEBOOK_PAGE_CHANGING(MAP_EDITOR_NOTEBOOK, MapeditFrame::OnTabChanging)
51 EVT_TREE_SEL_CHANGING(MAP_EDITOR_TREE, MapeditFrame::OnWillSelectMap)
52 EVT_TREE_SEL_CHANGED(MAP_EDITOR_TREE, MapeditFrame::OnDidSelectMap)
53 EVT_TREE_BEGIN_DRAG(MAP_EDITOR_TREE, MapeditFrame::OnWillDragMap)
54 EVT_TREE_END_DRAG(MAP_EDITOR_TREE, MapeditFrame::OnDidDragMap)
55 EVT_TEXT(MAP_TITLE_TEXTBOX, MapeditFrame::OnTitleChange)
56 EVT_BUTTON(ADD_ENTITY_BUTTON, MapeditFrame::OnAddEntity)
57 EVT_BUTTON(CANCEL_ENTITY_BUTTON, MapeditFrame::OnCancelAddEntity)
35wxEND_EVENT_TABLE() 58wxEND_EVENT_TABLE()
36 59
37MapeditFrame::MapeditFrame(Map map, std::string filename) : wxFrame(NULL, wxID_ANY, "Map Editor", wxDefaultPosition, wxSize(GAME_WIDTH*3, GAME_HEIGHT*2)), map(map), filename(filename) 60MapeditFrame::MapeditFrame(std::unique_ptr<World> world) : wxFrame(NULL, wxID_ANY, "Map Editor", wxDefaultPosition, wxSize(GAME_WIDTH*2+TILE_WIDTH*6*6+10+10+150, GAME_HEIGHT*3))
38{ 61{
39 this->map.frame = this; 62 this->world = std::move(world);
63 this->world->setParent(this);
64 currentMap = this->world->getLastMap();
40 65
41 wxMenu* menuFile = new wxMenu; 66 menuFile = new wxMenu;
42 menuFile->Append(MENU_FILE_NEW, "New\tCtrl-N"); 67 menuFile->Append(MENU_FILE_NEW, "New\tCtrl-N");
43 menuFile->Append(MENU_FILE_OPEN, "Open\tCtrl-O"); 68 menuFile->Append(MENU_FILE_OPEN, "Open\tCtrl-O");
44 menuFile->Append(MENU_FILE_SAVE, "Save\tCtrl-S"); 69 menuFile->Append(MENU_FILE_SAVE, "Save\tCtrl-S");
45 menuFile->Append(MENU_FILE_CLOSE, "Close\tCtrl-W"); 70 menuFile->Append(MENU_FILE_CLOSE, "Close\tCtrl-W");
71 menuFile->AppendSeparator();
72 menuFile->Append(MENU_MAP_ADD_ROOT, "New Map\tCtrl-Alt-N");
73 menuFile->Append(MENU_MAP_ADD_CHILD, "New Child Map\tCtrl-Alt-Shift-N");
74 menuFile->AppendSeparator();
46 menuFile->Append(wxID_EXIT); 75 menuFile->Append(wxID_EXIT);
47 76
48 wxMenu* menuView = new wxMenu; 77 wxMenu* menuView = new wxMenu;
@@ -59,22 +88,27 @@ MapeditFrame::MapeditFrame(Map map, std::string filename) : wxFrame(NULL, wxID_A
59 // Layout 2: Non-splitter between layout 3 and notebook 88 // Layout 2: Non-splitter between layout 3 and notebook
60 // Layout 3: Splitter between map editor and properties editor 89 // Layout 3: Splitter between map editor and properties editor
61 90
62 wxSplitterWindow* layout3 = new wxSplitterWindow(this, wxID_ANY); 91 wxSplitterWindow* layout1 = new wxSplitterWindow(this, wxID_ANY);
92 mapTree = new wxTreeCtrl(layout1, MAP_EDITOR_TREE, wxDefaultPosition, wxSize(200, 0), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS);
93 wxTreeItemId mapTreeRoot = mapTree->AddRoot("root");
94 populateMapTree(mapTreeRoot, this->world->getRootMaps());
95
96 wxPanel* layout2 = new wxPanel(layout1, wxID_ANY);
97
98 wxSplitterWindow* layout3 = new wxSplitterWindow(layout2, wxID_ANY);
63 layout3->SetSashGravity(1.0); 99 layout3->SetSashGravity(1.0);
64 layout3->SetMinimumPaneSize(20);
65 100
66 notebook = new wxNotebook(this, wxID_ANY); 101 notebook = new wxNotebook(layout2, MAP_EDITOR_NOTEBOOK);
67 102
68 tileEditor = new TileWidget(notebook, wxID_ANY, 6, 6, wxPoint(0,0), wxSize(TILE_WIDTH*6*6,TILE_HEIGHT*10*6)); 103 tileEditor = new TileWidget(notebook, wxID_ANY, 6, 6, wxPoint(0,0), wxSize(TILE_WIDTH*6*6,TILE_HEIGHT*10*6));
69 notebook->AddPage(tileEditor, "Tile Chooser", true); 104 notebook->AddPage(tileEditor, "Tile Chooser", false);
70 105
71 mapEditor = new MapeditWidget(layout3, wxID_ANY, &this->map, tileEditor, wxPoint(0,0), wxSize(GAME_WIDTH*2, GAME_HEIGHT*2)); 106 mapEditor = new MapeditWidget(layout3, wxID_ANY, currentMap, tileEditor, wxPoint(0,0), wxSize(GAME_WIDTH*2, GAME_HEIGHT*2));
72 mapEditor->frame = this; 107 mapEditor->frame = this;
73 108
74 // Set up property editor 109 // Set up property editor
75 wxPanel* propertyEditor = new wxPanel(layout3, wxID_ANY); 110 wxPanel* propertyEditor = new wxPanel(layout3, wxID_ANY);
76 titleBox = new wxTextCtrl(propertyEditor, wxID_ANY, map.getTitle()); 111 titleBox = new wxTextCtrl(propertyEditor, MAP_TITLE_TEXTBOX, currentMap->getTitle());
77 titleBox->Bind(wxEVT_TEXT, &MapeditFrame::OnTitleChange, this);
78 112
79 wxStaticText* titleLabel = new wxStaticText(propertyEditor, wxID_ANY, "Title:"); 113 wxStaticText* titleLabel = new wxStaticText(propertyEditor, wxID_ANY, "Title:");
80 114
@@ -103,12 +137,9 @@ MapeditFrame::MapeditFrame(Map map, std::string filename) : wxFrame(NULL, wxID_A
103 entityTypeBox->Append(entry.second->getType(), entry.second.get()); 137 entityTypeBox->Append(entry.second->getType(), entry.second.get());
104 } 138 }
105 139
106 addEntityButton = new wxButton(entityEditor, wxID_ANY, "Add Entity"); 140 addEntityButton = new wxButton(entityEditor, ADD_ENTITY_BUTTON, "Add Entity");
107 addEntityButton->Bind(wxEVT_BUTTON, &MapeditFrame::OnAddEntity, this); 141 cancelEntityButton = new wxButton(entityEditor, CANCEL_ENTITY_BUTTON, "Cancel");
108
109 cancelEntityButton = new wxButton(entityEditor, wxID_ANY, "Cancel");
110 cancelEntityButton->Disable(); 142 cancelEntityButton->Disable();
111 cancelEntityButton->Bind(wxEVT_BUTTON, &MapeditFrame::OnCancelAddEntity, this);
112 143
113 wxStaticText* entityInfoLabel = new wxStaticText(entityEditor, wxID_ANY, "Click and drag an entity to move it.\nRight click an entity to delete it."); 144 wxStaticText* entityInfoLabel = new wxStaticText(entityEditor, wxID_ANY, "Click and drag an entity to move it.\nRight click an entity to delete it.");
114 145
@@ -129,51 +160,65 @@ MapeditFrame::MapeditFrame(Map map, std::string filename) : wxFrame(NULL, wxID_A
129 160
130 // Finish setting up the layouts 161 // Finish setting up the layouts
131 layout3->SplitHorizontally(mapEditor, propertyEditor); 162 layout3->SplitHorizontally(mapEditor, propertyEditor);
163 layout1->SplitVertically(mapTree, layout2);
132 164
133 notebook->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, &MapeditFrame::OnTabChange, this); 165 wxBoxSizer* sizer1 = new wxBoxSizer(wxHORIZONTAL);
134 notebook->Bind(wxEVT_NOTEBOOK_PAGE_CHANGING, &MapeditFrame::OnTabChanging, this); 166 sizer1->Add(layout1, 1, wxEXPAND, 0);
167 sizer1->Add(mapTree, 0, wxALIGN_TOP | wxALIGN_LEFT, 0);
168 sizer1->Add(layout2, 1, wxEXPAND, 0);
169 layout1->SetSizer(sizer1);
170 sizer1->SetSizeHints(layout1);
135 171
136 wxBoxSizer* sizer2 = new wxBoxSizer(wxHORIZONTAL); 172 wxBoxSizer* sizer2 = new wxBoxSizer(wxHORIZONTAL);
137 sizer2->Add(layout3, 1, wxEXPAND, 0); 173 sizer2->Add(layout3, 1, wxEXPAND, 0);
138 sizer2->Add(notebook, 0, wxALIGN_TOP | wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxEXPAND, 2); 174 sizer2->Add(notebook, 0, wxALIGN_TOP | wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxEXPAND, 2);
139 this->SetSizer(sizer2); 175 layout2->SetSizer(sizer2);
140 sizer2->SetSizeHints(this); 176 sizer2->SetSizeHints(layout2);
141 177
142 wxBoxSizer* splitterSizer = new wxBoxSizer(wxVERTICAL); 178 wxBoxSizer* splitterSizer = new wxBoxSizer(wxVERTICAL);
143 splitterSizer->Add(layout3, 1, wxEXPAND, 0); 179 splitterSizer->Add(layout3, 1, wxEXPAND, 0);
144 splitterSizer->Add(mapEditor, 1, wxEXPAND, 0); 180 splitterSizer->Add(mapEditor, 1, wxEXPAND, 0);
145 splitterSizer->Add(propertyEditor, 0, wxALIGN_TOP, wxALIGN_LEFT, 0); 181 splitterSizer->Add(propertyEditor, 0, wxALIGN_TOP | wxALIGN_LEFT, 0);
146 layout3->SetSizer(splitterSizer); 182 layout3->SetSizer(splitterSizer);
147 splitterSizer->SetSizeHints(layout3); 183 splitterSizer->SetSizeHints(layout3);
148 184
149 // Toolbar time! 185 // Toolbar time!
150 toolbar = CreateToolBar(); 186 toolbar = CreateToolBar();
151 toolbar->AddTool(TOOL_FILE_NEW, "New", wxBitmap(wxImage("res/page_add.png"))); 187 toolbar->AddTool(TOOL_FILE_NEW, "New", wxBitmap(wxImage("res/page.png")));
152 toolbar->AddTool(TOOL_FILE_OPEN, "Open", wxBitmap(wxImage("res/folder_page.png"))); 188 toolbar->AddTool(TOOL_FILE_OPEN, "Open", wxBitmap(wxImage("res/folder_page.png")));
153 toolbar->AddTool(TOOL_FILE_SAVE, "Save", wxBitmap(wxImage("res/disk.png"))); 189 toolbar->AddTool(TOOL_FILE_SAVE, "Save", wxBitmap(wxImage("res/disk.png")));
154 toolbar->EnableTool(TOOL_FILE_SAVE, this->map.getDirty()); 190 toolbar->AddSeparator();
191 toolbar->AddTool(TOOL_MAP_ADD_ROOT, "Add Map", wxBitmap(wxImage("res/page_add.png")));
192 toolbar->AddTool(TOOL_MAP_ADD_CHILD, "Add Child Map", wxBitmap(wxImage("res/page_white_add.png")));
193 toolbar->EnableTool(TOOL_FILE_SAVE, this->world->getDirty());
155 toolbar->Realize(); 194 toolbar->Realize();
195
196 mapTree->SetFocusedItem(currentMap->getTreeItemId());
197 SelectMap(currentMap);
198
199 Maximize(true);
156} 200}
157 201
158void MapeditFrame::OnExit(wxCloseEvent& event) 202void MapeditFrame::OnExit(wxCloseEvent& event)
159{ 203{
160 if (event.CanVeto() && map.hasUnsavedChanges()) 204 if (event.CanVeto() && world->getDirty())
161 { 205 {
162 switch (wxMessageBox("Current map has unsaved changes. Save before closing?", "Please confirm", wxICON_QUESTION|wxYES_NO|wxCANCEL, this)) 206 switch (wxMessageBox("One or more maps have unsaved changes. Save before closing?", "Please confirm", wxICON_QUESTION|wxYES_NO|wxCANCEL, this))
163 { 207 {
164 case wxYES: 208 case wxYES:
165 if (filename == "") 209 if (world->getFilename() == "")
166 { 210 {
167 wxFileDialog saveFileDialog(this, "Save map", "", "", "XML files (*.xml)|*.xml", wxFD_SAVE); 211 wxFileDialog saveFileDialog(this, "Save world", "", "", "XML files (*.xml)|*.xml", wxFD_SAVE);
168 if (saveFileDialog.ShowModal() == wxID_CANCEL) 212 if (saveFileDialog.ShowModal() == wxID_CANCEL)
169 { 213 {
170 return; 214 return;
171 } 215 }
172 216
173 filename = saveFileDialog.GetPath().ToStdString(); 217 world->save(saveFileDialog.GetPath().ToStdString(), mapTree);
218 } else {
219 world->save(world->getFilename(), mapTree);
174 } 220 }
175 221
176 map.save(filename);
177 break; 222 break;
178 223
179 case wxCANCEL: 224 case wxCANCEL:
@@ -204,34 +249,34 @@ void MapeditFrame::ZoomOut(wxCommandEvent&)
204 249
205void MapeditFrame::OnNew(wxCommandEvent&) 250void MapeditFrame::OnNew(wxCommandEvent&)
206{ 251{
207 NewMap(); 252 NewWorld();
208} 253}
209 254
210void MapeditFrame::OnOpen(wxCommandEvent&) 255void MapeditFrame::OnOpen(wxCommandEvent&)
211{ 256{
212 wxFileDialog openFileDialog(this, "Open map", "", "", "XML files (*.xml)|*.xml", wxFD_OPEN|wxFD_FILE_MUST_EXIST); 257 wxFileDialog openFileDialog(this, "Open world", "", "", "XML files (*.xml)|*.xml", wxFD_OPEN|wxFD_FILE_MUST_EXIST);
213 if (openFileDialog.ShowModal() == wxID_CANCEL) 258 if (openFileDialog.ShowModal() == wxID_CANCEL)
214 { 259 {
215 return; 260 return;
216 } 261 }
217 262
218 OpenMap(openFileDialog.GetPath().c_str()); 263 OpenWorld(openFileDialog.GetPath().ToStdString());
219} 264}
220 265
221void MapeditFrame::OnSave(wxCommandEvent&) 266void MapeditFrame::OnSave(wxCommandEvent&)
222{ 267{
223 if (filename == "") 268 if (world->getFilename() == "")
224 { 269 {
225 wxFileDialog saveFileDialog(this, "Save map", "", "", "XML files (*.xml)|*.xml", wxFD_SAVE); 270 wxFileDialog saveFileDialog(this, "Save world", "", "", "XML files (*.xml)|*.xml", wxFD_SAVE);
226 if (saveFileDialog.ShowModal() == wxID_CANCEL) 271 if (saveFileDialog.ShowModal() == wxID_CANCEL)
227 { 272 {
228 return; 273 return;
229 } 274 }
230 275
231 filename = saveFileDialog.GetPath().ToStdString(); 276 world->save(saveFileDialog.GetPath().ToStdString(), mapTree);
277 } else {
278 world->save(world->getFilename(), mapTree);
232 } 279 }
233
234 map.save(filename);
235} 280}
236 281
237void MapeditFrame::OnClose(wxCommandEvent&) 282void MapeditFrame::OnClose(wxCommandEvent&)
@@ -252,24 +297,8 @@ void MapeditFrame::OnQuit(wxCommandEvent&)
252 297
253void MapeditFrame::OnTitleChange(wxCommandEvent&) 298void MapeditFrame::OnTitleChange(wxCommandEvent&)
254{ 299{
255 map.setTitle(titleBox->GetLineText(0).ToStdString()); 300 currentMap->setTitle(titleBox->GetValue().ToStdString());
256} 301 mapTree->SetItemText(currentMap->getTreeItemId(), currentMap->getTitle());
257
258void MapeditFrame::NewMap()
259{
260 LaunchWindow(Map(), "");
261}
262
263void MapeditFrame::OpenMap(const char* filename)
264{
265 LaunchWindow(Map(filename), filename);
266}
267
268void MapeditFrame::LaunchWindow(Map map, const char* filename)
269{
270 MapeditFrame* frame = new MapeditFrame(map, filename);
271 frame->closer = openWindows.insert(end(openWindows), frame);
272 frame->Show(true);
273} 302}
274 303
275void MapeditFrame::OnTabChange(wxBookCtrlEvent& event) 304void MapeditFrame::OnTabChange(wxBookCtrlEvent& event)
@@ -317,11 +346,113 @@ void MapeditFrame::OnCancelAddEntity(wxCommandEvent&)
317 mapEditor->CancelAddingEntity(); 346 mapEditor->CancelAddingEntity();
318} 347}
319 348
349void MapeditFrame::OnAddRoot(wxCommandEvent&)
350{
351 auto map = world->newMap();
352 wxTreeItemId node = mapTree->AppendItem(mapTree->GetItemParent(mapTree->GetSelection()), map->getTitle());
353 map->setTreeItemId(node);
354 mapTree->SetItemData(node, new MapPtrCtr(map.get()));
355 mapTree->SetFocusedItem(node);
356 SelectMap(map.get());
357}
358
359void MapeditFrame::OnAddChild(wxCommandEvent&)
360{
361 auto map = world->newMap();
362 wxTreeItemId node = mapTree->AppendItem(mapTree->GetSelection(), map->getTitle());
363 map->setTreeItemId(node);
364 mapTree->SetItemData(node, new MapPtrCtr(map.get()));
365 mapTree->SetFocusedItem(node);
366 mapTree->Expand(mapTree->GetSelection());
367 SelectMap(map.get());
368}
369
370void MapeditFrame::OnDidSelectMap(wxTreeEvent& event)
371{
372 MapPtrCtr* data = (MapPtrCtr*) mapTree->GetItemData(event.GetItem());
373 SelectMap(data->map);
374}
375
376void MapeditFrame::OnWillSelectMap(wxTreeEvent& event)
377{
378 if (addingEntity)
379 {
380 event.Veto();
381 return;
382 }
383
384 event.Skip();
385}
386
387void MapeditFrame::OnWillDragMap(wxTreeEvent& event)
388{
389 if (!addingEntity)
390 {
391 event.Allow();
392 dragMap = event.GetItem();
393 }
394}
395
396void MapeditFrame::OnDidDragMap(wxTreeEvent& event)
397{
398 if (!dragMap.IsOk())
399 {
400 return;
401 }
402
403 wxTreeItemId newParent = event.GetItem();
404 if (!newParent.IsOk())
405 {
406 newParent = mapTree->GetRootItem();
407 }
408
409 wxTreeItemId newChild = MoveTreeNode(dragMap, newParent);
410 dragMap.Unset();
411 mapTree->SelectItem(newChild);
412}
413
414void MapeditFrame::NewWorld()
415{
416 LaunchWindow(std::unique_ptr<World>(new World()));
417}
418
419void MapeditFrame::OpenWorld(std::string filename)
420{
421 try
422 {
423 auto world = std::unique_ptr<World>(new World(filename));
424
425 LaunchWindow(std::move(world));
426 } catch (std::exception& ex)
427 {
428 wxMessageBox(ex.what(), "Error loading world", wxOK | wxCENTRE | wxICON_ERROR);
429 }
430}
431
432void MapeditFrame::LaunchWindow(std::unique_ptr<World> world)
433{
434 MapeditFrame* frame = new MapeditFrame(std::move(world));
435 frame->closer = openWindows.insert(end(openWindows), frame);
436 frame->Show(true);
437}
438
320void MapeditFrame::StartAddingEntity() 439void MapeditFrame::StartAddingEntity()
321{ 440{
322 addingEntity = true; 441 addingEntity = true;
323 addEntityButton->Disable(); 442 addEntityButton->Disable();
324 cancelEntityButton->Enable(); 443 cancelEntityButton->Enable();
444
445 toolbar->EnableTool(TOOL_FILE_NEW, false);
446 toolbar->EnableTool(TOOL_FILE_OPEN, false);
447 toolbar->EnableTool(TOOL_FILE_SAVE, false);
448 toolbar->EnableTool(TOOL_MAP_ADD_ROOT, false);
449 toolbar->EnableTool(TOOL_MAP_ADD_CHILD, false);
450
451 menuFile->Enable(MENU_FILE_NEW, false);
452 menuFile->Enable(MENU_FILE_OPEN, false);
453 menuFile->Enable(MENU_FILE_SAVE, false);
454 menuFile->Enable(MENU_MAP_ADD_ROOT, false);
455 menuFile->Enable(MENU_MAP_ADD_CHILD, false);
325} 456}
326 457
327void MapeditFrame::FinishAddingEntity() 458void MapeditFrame::FinishAddingEntity()
@@ -329,9 +460,87 @@ void MapeditFrame::FinishAddingEntity()
329 addingEntity = false; 460 addingEntity = false;
330 addEntityButton->Enable(); 461 addEntityButton->Enable();
331 cancelEntityButton->Disable(); 462 cancelEntityButton->Disable();
463 toolbar->Enable();
464
465 toolbar->EnableTool(TOOL_FILE_NEW, true);
466 toolbar->EnableTool(TOOL_FILE_OPEN, true);
467 toolbar->EnableTool(TOOL_FILE_SAVE, world->getDirty());
468 toolbar->EnableTool(TOOL_MAP_ADD_ROOT, true);
469 toolbar->EnableTool(TOOL_MAP_ADD_CHILD, true);
470
471 menuFile->Enable(MENU_FILE_NEW, true);
472 menuFile->Enable(MENU_FILE_OPEN, true);
473 menuFile->Enable(MENU_FILE_SAVE, world->getDirty());
474 menuFile->Enable(MENU_MAP_ADD_ROOT, true);
475 menuFile->Enable(MENU_MAP_ADD_CHILD, true);
332} 476}
333 477
334void MapeditFrame::MapDirtyDidChange(bool dirty) 478void MapeditFrame::MapDirtyDidChange(bool dirty)
335{ 479{
336 toolbar->EnableTool(TOOL_FILE_SAVE, dirty); 480 toolbar->EnableTool(TOOL_FILE_SAVE, dirty);
481 menuFile->Enable(MENU_FILE_SAVE, dirty);
482
483 if (dirty)
484 {
485 mapTree->SetItemBold(currentMap->getTreeItemId(), true);
486 } else {
487 for (auto map : world->getMaps())
488 {
489 mapTree->SetItemBold(map.second->getTreeItemId(), false);
490 }
491 }
492}
493
494void MapeditFrame::populateMapTree(wxTreeItemId node, std::list<std::shared_ptr<Map>> maps)
495{
496 for (auto map : maps)
497 {
498 wxTreeItemId childNode = mapTree->AppendItem(node, map->getTitle());
499 mapTree->SetItemData(childNode, new MapPtrCtr(map.get()));
500 map->setTreeItemId(childNode);
501
502 populateMapTree(childNode, map->getChildren());
503
504 if (map->getExpanded())
505 {
506 mapTree->Expand(childNode);
507 }
508 }
509}
510
511void MapeditFrame::SelectMap(Map* map)
512{
513 currentMap = map;
514 mapEditor->SetMap(map);
515 titleBox->ChangeValue(map->getTitle());
516}
517
518wxTreeItemId MapeditFrame::MoveTreeNode(wxTreeItemId toCopy, wxTreeItemId newParent)
519{
520 MapPtrCtr* ctl1 = (MapPtrCtr*) mapTree->GetItemData(toCopy);
521 MapPtrCtr* ctl2 = new MapPtrCtr(ctl1->map);
522
523 wxTreeItemId copied = mapTree->AppendItem(newParent, mapTree->GetItemText(toCopy), -1, -1, ctl2);
524 if (mapTree->IsBold(toCopy))
525 {
526 mapTree->SetItemBold(toCopy, true);
527 }
528
529 if (mapTree->ItemHasChildren(toCopy))
530 {
531 wxTreeItemIdValue cookie;
532 for (wxTreeItemId it = mapTree->GetFirstChild(toCopy, cookie); it.IsOk(); it = mapTree->GetNextChild(toCopy, cookie))
533 {
534 MoveTreeNode(it, copied);
535 }
536 }
537
538 if (mapTree->IsExpanded(toCopy))
539 {
540 mapTree->Expand(copied);
541 }
542
543 mapTree->Delete(toCopy);
544
545 return copied;
337} 546}