diff options
Diffstat (limited to 'tools/mapedit/src/frame.cpp')
| -rw-r--r-- | tools/mapedit/src/frame.cpp | 321 |
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 | ||
| 9 | static std::list<wxWindow*> openWindows; | 10 | static 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 | ||
| 23 | wxBEGIN_EVENT_TABLE(MapeditFrame, wxFrame) | 33 | wxBEGIN_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) | ||
| 35 | wxEND_EVENT_TABLE() | 58 | wxEND_EVENT_TABLE() |
| 36 | 59 | ||
| 37 | MapeditFrame::MapeditFrame(Map map, std::string filename) : wxFrame(NULL, wxID_ANY, "Map Editor", wxDefaultPosition, wxSize(GAME_WIDTH*3, GAME_HEIGHT*2)), map(map), filename(filename) | 60 | MapeditFrame::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 | ||
| 158 | void MapeditFrame::OnExit(wxCloseEvent& event) | 202 | void 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 | ||
| 205 | void MapeditFrame::OnNew(wxCommandEvent&) | 250 | void MapeditFrame::OnNew(wxCommandEvent&) |
| 206 | { | 251 | { |
| 207 | NewMap(); | 252 | NewWorld(); |
| 208 | } | 253 | } |
| 209 | 254 | ||
| 210 | void MapeditFrame::OnOpen(wxCommandEvent&) | 255 | void 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 | ||
| 221 | void MapeditFrame::OnSave(wxCommandEvent&) | 266 | void 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 | ||
| 237 | void MapeditFrame::OnClose(wxCommandEvent&) | 282 | void MapeditFrame::OnClose(wxCommandEvent&) |
| @@ -252,24 +297,8 @@ void MapeditFrame::OnQuit(wxCommandEvent&) | |||
| 252 | 297 | ||
| 253 | void MapeditFrame::OnTitleChange(wxCommandEvent&) | 298 | void 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 | |||
| 258 | void MapeditFrame::NewMap() | ||
| 259 | { | ||
| 260 | LaunchWindow(Map(), ""); | ||
| 261 | } | ||
| 262 | |||
| 263 | void MapeditFrame::OpenMap(const char* filename) | ||
| 264 | { | ||
| 265 | LaunchWindow(Map(filename), filename); | ||
| 266 | } | ||
| 267 | |||
| 268 | void 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 | ||
| 275 | void MapeditFrame::OnTabChange(wxBookCtrlEvent& event) | 304 | void MapeditFrame::OnTabChange(wxBookCtrlEvent& event) |
| @@ -317,11 +346,113 @@ void MapeditFrame::OnCancelAddEntity(wxCommandEvent&) | |||
| 317 | mapEditor->CancelAddingEntity(); | 346 | mapEditor->CancelAddingEntity(); |
| 318 | } | 347 | } |
| 319 | 348 | ||
| 349 | void 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 | |||
| 359 | void 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 | |||
| 370 | void MapeditFrame::OnDidSelectMap(wxTreeEvent& event) | ||
| 371 | { | ||
| 372 | MapPtrCtr* data = (MapPtrCtr*) mapTree->GetItemData(event.GetItem()); | ||
| 373 | SelectMap(data->map); | ||
| 374 | } | ||
| 375 | |||
| 376 | void MapeditFrame::OnWillSelectMap(wxTreeEvent& event) | ||
| 377 | { | ||
| 378 | if (addingEntity) | ||
| 379 | { | ||
| 380 | event.Veto(); | ||
| 381 | return; | ||
| 382 | } | ||
| 383 | |||
| 384 | event.Skip(); | ||
| 385 | } | ||
| 386 | |||
| 387 | void MapeditFrame::OnWillDragMap(wxTreeEvent& event) | ||
| 388 | { | ||
| 389 | if (!addingEntity) | ||
| 390 | { | ||
| 391 | event.Allow(); | ||
| 392 | dragMap = event.GetItem(); | ||
| 393 | } | ||
| 394 | } | ||
| 395 | |||
| 396 | void 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 | |||
| 414 | void MapeditFrame::NewWorld() | ||
| 415 | { | ||
| 416 | LaunchWindow(std::unique_ptr<World>(new World())); | ||
| 417 | } | ||
| 418 | |||
| 419 | void 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 | |||
| 432 | void 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 | |||
| 320 | void MapeditFrame::StartAddingEntity() | 439 | void 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 | ||
| 327 | void MapeditFrame::FinishAddingEntity() | 458 | void 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 | ||
| 334 | void MapeditFrame::MapDirtyDidChange(bool dirty) | 478 | void 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 | |||
| 494 | void 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 | |||
| 511 | void MapeditFrame::SelectMap(Map* map) | ||
| 512 | { | ||
| 513 | currentMap = map; | ||
| 514 | mapEditor->SetMap(map); | ||
| 515 | titleBox->ChangeValue(map->getTitle()); | ||
| 516 | } | ||
| 517 | |||
| 518 | wxTreeItemId 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 | } |
