diff options
Diffstat (limited to 'tools/mapedit/src/frame.cpp')
| -rw-r--r-- | tools/mapedit/src/frame.cpp | 197 |
1 files changed, 173 insertions, 24 deletions
| diff --git a/tools/mapedit/src/frame.cpp b/tools/mapedit/src/frame.cpp index 66775e1..3646d4e 100644 --- a/tools/mapedit/src/frame.cpp +++ b/tools/mapedit/src/frame.cpp | |||
| @@ -19,6 +19,8 @@ enum { | |||
| 19 | MENU_FILE_CLOSE, | 19 | MENU_FILE_CLOSE, |
| 20 | MENU_MAP_ADD_ROOT, | 20 | MENU_MAP_ADD_ROOT, |
| 21 | MENU_MAP_ADD_CHILD, | 21 | MENU_MAP_ADD_CHILD, |
| 22 | MENU_EDIT_UNDO, | ||
| 23 | MENU_EDIT_REDO, | ||
| 22 | TOOL_FILE_NEW, | 24 | TOOL_FILE_NEW, |
| 23 | TOOL_FILE_OPEN, | 25 | TOOL_FILE_OPEN, |
| 24 | TOOL_FILE_SAVE, | 26 | TOOL_FILE_SAVE, |
| @@ -43,6 +45,8 @@ wxBEGIN_EVENT_TABLE(MapeditFrame, wxFrame) | |||
| 43 | EVT_MENU(MENU_FILE_CLOSE, MapeditFrame::OnClose) | 45 | EVT_MENU(MENU_FILE_CLOSE, MapeditFrame::OnClose) |
| 44 | EVT_MENU(MENU_MAP_ADD_ROOT, MapeditFrame::OnAddRoot) | 46 | EVT_MENU(MENU_MAP_ADD_ROOT, MapeditFrame::OnAddRoot) |
| 45 | EVT_MENU(MENU_MAP_ADD_CHILD, MapeditFrame::OnAddChild) | 47 | EVT_MENU(MENU_MAP_ADD_CHILD, MapeditFrame::OnAddChild) |
| 48 | EVT_MENU(MENU_EDIT_UNDO, MapeditFrame::OnUndo) | ||
| 49 | EVT_MENU(MENU_EDIT_REDO, MapeditFrame::OnRedo) | ||
| 46 | EVT_TOOL(TOOL_FILE_NEW, MapeditFrame::OnNew) | 50 | EVT_TOOL(TOOL_FILE_NEW, MapeditFrame::OnNew) |
| 47 | EVT_TOOL(TOOL_FILE_OPEN, MapeditFrame::OnOpen) | 51 | EVT_TOOL(TOOL_FILE_OPEN, MapeditFrame::OnOpen) |
| 48 | EVT_TOOL(TOOL_FILE_SAVE, MapeditFrame::OnSave) | 52 | EVT_TOOL(TOOL_FILE_SAVE, MapeditFrame::OnSave) |
| @@ -51,7 +55,6 @@ wxBEGIN_EVENT_TABLE(MapeditFrame, wxFrame) | |||
| 51 | EVT_CLOSE(MapeditFrame::OnExit) | 55 | EVT_CLOSE(MapeditFrame::OnExit) |
| 52 | EVT_NOTEBOOK_PAGE_CHANGED(MAP_EDITOR_NOTEBOOK, MapeditFrame::OnTabChange) | 56 | EVT_NOTEBOOK_PAGE_CHANGED(MAP_EDITOR_NOTEBOOK, MapeditFrame::OnTabChange) |
| 53 | EVT_NOTEBOOK_PAGE_CHANGING(MAP_EDITOR_NOTEBOOK, MapeditFrame::OnTabChanging) | 57 | EVT_NOTEBOOK_PAGE_CHANGING(MAP_EDITOR_NOTEBOOK, MapeditFrame::OnTabChanging) |
| 54 | EVT_TREE_SEL_CHANGING(MAP_EDITOR_TREE, MapeditFrame::OnWillSelectMap) | ||
| 55 | EVT_TREE_SEL_CHANGED(MAP_EDITOR_TREE, MapeditFrame::OnDidSelectMap) | 58 | EVT_TREE_SEL_CHANGED(MAP_EDITOR_TREE, MapeditFrame::OnDidSelectMap) |
| 56 | EVT_TREE_BEGIN_DRAG(MAP_EDITOR_TREE, MapeditFrame::OnWillDragMap) | 59 | EVT_TREE_BEGIN_DRAG(MAP_EDITOR_TREE, MapeditFrame::OnWillDragMap) |
| 57 | EVT_TREE_END_DRAG(MAP_EDITOR_TREE, MapeditFrame::OnDidDragMap) | 60 | EVT_TREE_END_DRAG(MAP_EDITOR_TREE, MapeditFrame::OnDidDragMap) |
| @@ -80,12 +83,18 @@ MapeditFrame::MapeditFrame(std::unique_ptr<World> world) : wxFrame(NULL, wxID_AN | |||
| 80 | menuFile->AppendSeparator(); | 83 | menuFile->AppendSeparator(); |
| 81 | menuFile->Append(wxID_EXIT); | 84 | menuFile->Append(wxID_EXIT); |
| 82 | 85 | ||
| 86 | menuEdit = new wxMenu; | ||
| 87 | menuEdit->Append(MENU_EDIT_UNDO, "Undo\tCtrl-Z"); | ||
| 88 | menuEdit->Append(MENU_EDIT_REDO, "Redo\tCtrl-Shift-Z"); | ||
| 89 | UpdateUndoLabels(); | ||
| 90 | |||
| 83 | wxMenu* menuView = new wxMenu; | 91 | wxMenu* menuView = new wxMenu; |
| 84 | menuView->Append(MENU_VIEW_ZOOM_IN, "Zoom In\tCtrl-+"); | 92 | menuView->Append(MENU_VIEW_ZOOM_IN, "Zoom In\tCtrl-+"); |
| 85 | menuView->Append(MENU_VIEW_ZOOM_OUT, "Zoom Out\tCtrl--"); | 93 | menuView->Append(MENU_VIEW_ZOOM_OUT, "Zoom Out\tCtrl--"); |
| 86 | 94 | ||
| 87 | wxMenuBar* menuBar = new wxMenuBar; | 95 | wxMenuBar* menuBar = new wxMenuBar; |
| 88 | menuBar->Append(menuFile, "&File"); | 96 | menuBar->Append(menuFile, "&File"); |
| 97 | menuBar->Append(menuEdit, "&Edit"); | ||
| 89 | menuBar->Append(menuView, "&View"); | 98 | menuBar->Append(menuView, "&View"); |
| 90 | 99 | ||
| 91 | SetMenuBar(menuBar); | 100 | SetMenuBar(menuBar); |
| @@ -118,7 +127,7 @@ MapeditFrame::MapeditFrame(std::unique_ptr<World> world) : wxFrame(NULL, wxID_AN | |||
| 118 | 127 | ||
| 119 | // Set up property editor | 128 | // Set up property editor |
| 120 | wxPanel* propertyEditor = new wxPanel(layout3, wxID_ANY); | 129 | wxPanel* propertyEditor = new wxPanel(layout3, wxID_ANY); |
| 121 | titleBox = new wxTextCtrl(propertyEditor, MAP_TITLE_TEXTBOX, currentMap->getTitle()); | 130 | titleBox = new UndoableTextBox(propertyEditor, MAP_TITLE_TEXTBOX, currentMap->getTitle(), "Edit Map Title", this); |
| 122 | titleBox->SetMaxLength(40); | 131 | titleBox->SetMaxLength(40); |
| 123 | 132 | ||
| 124 | wxStaticText* titleLabel = new wxStaticText(propertyEditor, wxID_ANY, "Title:"); | 133 | wxStaticText* titleLabel = new wxStaticText(propertyEditor, wxID_ANY, "Title:"); |
| @@ -216,8 +225,9 @@ MapeditFrame::MapeditFrame(std::unique_ptr<World> world) : wxFrame(NULL, wxID_AN | |||
| 216 | toolbar->EnableTool(TOOL_FILE_SAVE, this->world->getDirty()); | 225 | toolbar->EnableTool(TOOL_FILE_SAVE, this->world->getDirty()); |
| 217 | toolbar->Realize(); | 226 | toolbar->Realize(); |
| 218 | 227 | ||
| 219 | mapTree->SetFocusedItem(currentMap->getTreeItemId()); | 228 | dontSelectMap = true; |
| 220 | SelectMap(currentMap); | 229 | mapTree->SelectItem(currentMap->getTreeItemId()); |
| 230 | dontSelectMap = false; | ||
| 221 | 231 | ||
| 222 | Maximize(true); | 232 | Maximize(true); |
| 223 | } | 233 | } |
| @@ -324,10 +334,12 @@ void MapeditFrame::OnQuit(wxCommandEvent&) | |||
| 324 | } | 334 | } |
| 325 | } | 335 | } |
| 326 | 336 | ||
| 327 | void MapeditFrame::OnTitleChange(wxCommandEvent&) | 337 | void MapeditFrame::OnTitleChange(wxCommandEvent& event) |
| 328 | { | 338 | { |
| 329 | currentMap->setTitle(titleBox->GetValue().ToStdString()); | 339 | currentMap->setTitle(titleBox->GetValue().ToStdString()); |
| 330 | mapTree->SetItemText(currentMap->getTreeItemId(), currentMap->getTitle()); | 340 | mapTree->SetItemText(currentMap->getTreeItemId(), titleBox->GetValue()); |
| 341 | |||
| 342 | event.Skip(); | ||
| 331 | } | 343 | } |
| 332 | 344 | ||
| 333 | void MapeditFrame::OnTabChange(wxBookCtrlEvent& event) | 345 | void MapeditFrame::OnTabChange(wxBookCtrlEvent& event) |
| @@ -378,33 +390,83 @@ void MapeditFrame::OnCancelAddEntity(wxCommandEvent&) | |||
| 378 | void MapeditFrame::OnAddRoot(wxCommandEvent&) | 390 | void MapeditFrame::OnAddRoot(wxCommandEvent&) |
| 379 | { | 391 | { |
| 380 | auto map = world->newMap(); | 392 | auto map = world->newMap(); |
| 381 | wxTreeItemId node = mapTree->AppendItem(mapTree->GetItemParent(mapTree->GetSelection()), map->getTitle()); | 393 | |
| 382 | map->setTreeItemId(node); | 394 | commitAction(std::make_shared<Undoable>("New Map", [=] () { |
| 383 | mapTree->SetItemData(node, new MapPtrCtr(map.get())); | 395 | map->setHidden(false); |
| 384 | mapTree->SetFocusedItem(node); | 396 | |
| 385 | SelectMap(map.get()); | 397 | wxTreeItemId sel = mapTree->GetSelection(); |
| 398 | wxTreeItemId par = mapTree->GetItemParent(sel); | ||
| 399 | wxTreeItemId node = mapTree->AppendItem(par, map->getTitle()); | ||
| 400 | map->setTreeItemId(node); | ||
| 401 | mapTree->SetItemData(node, new MapPtrCtr(map.get())); | ||
| 402 | |||
| 403 | dontSelectMap = true; | ||
| 404 | mapTree->SelectItem(node); | ||
| 405 | dontSelectMap = false; | ||
| 406 | }, [=] () { | ||
| 407 | map->setHidden(true); | ||
| 408 | |||
| 409 | wxTreeItemId sel = mapTree->GetPrevSibling(map->getTreeItemId()); | ||
| 410 | mapTree->Delete(map->getTreeItemId()); | ||
| 411 | |||
| 412 | dontSelectMap = true; | ||
| 413 | mapTree->SelectItem(sel); | ||
| 414 | dontSelectMap = false; | ||
| 415 | })); | ||
| 416 | |||
| 386 | } | 417 | } |
| 387 | 418 | ||
| 388 | void MapeditFrame::OnAddChild(wxCommandEvent&) | 419 | void MapeditFrame::OnAddChild(wxCommandEvent&) |
| 389 | { | 420 | { |
| 390 | auto map = world->newMap(); | 421 | auto map = world->newMap(); |
| 391 | wxTreeItemId node = mapTree->AppendItem(mapTree->GetSelection(), map->getTitle()); | 422 | |
| 392 | map->setTreeItemId(node); | 423 | commitAction(std::make_shared<Undoable>("New Map", [=] () { |
| 393 | mapTree->SetItemData(node, new MapPtrCtr(map.get())); | 424 | map->setHidden(false); |
| 394 | mapTree->SetFocusedItem(node); | 425 | |
| 395 | mapTree->Expand(mapTree->GetSelection()); | 426 | wxTreeItemId sel = mapTree->GetSelection(); |
| 396 | SelectMap(map.get()); | 427 | wxTreeItemId node = mapTree->AppendItem(sel, map->getTitle()); |
| 428 | map->setTreeItemId(node); | ||
| 429 | mapTree->SetItemData(node, new MapPtrCtr(map.get())); | ||
| 430 | |||
| 431 | mapTree->Expand(sel); | ||
| 432 | |||
| 433 | dontSelectMap = true; | ||
| 434 | mapTree->SelectItem(node); | ||
| 435 | dontSelectMap = false; | ||
| 436 | }, [=] () { | ||
| 437 | map->setHidden(true); | ||
| 438 | |||
| 439 | wxTreeItemId sel = mapTree->GetItemParent(map->getTreeItemId()); | ||
| 440 | mapTree->Delete(map->getTreeItemId()); | ||
| 441 | |||
| 442 | dontSelectMap = true; | ||
| 443 | mapTree->SelectItem(sel); | ||
| 444 | dontSelectMap = false; | ||
| 445 | })); | ||
| 397 | } | 446 | } |
| 398 | 447 | ||
| 399 | void MapeditFrame::OnDidSelectMap(wxTreeEvent& event) | 448 | void MapeditFrame::OnDidSelectMap(wxTreeEvent& event) |
| 400 | { | 449 | { |
| 401 | MapPtrCtr* data = (MapPtrCtr*) mapTree->GetItemData(event.GetItem()); | 450 | MapPtrCtr* data = (MapPtrCtr*) mapTree->GetItemData(event.GetItem()); |
| 402 | SelectMap(data->map); | 451 | SelectMap(data->map); |
| 403 | } | 452 | |
| 404 | 453 | if (!dontSelectMap) | |
| 405 | void MapeditFrame::OnWillSelectMap(wxTreeEvent& event) | 454 | { |
| 406 | { | 455 | commitAfter(std::make_shared<Undoable>("Selecting " + data->map->getTitle(), [=] () { |
| 407 | event.Skip(); | 456 | wxTreeItemId toSelect = event.GetItem(); |
| 457 | dontSelectMap = true; | ||
| 458 | mapTree->SelectItem(toSelect); | ||
| 459 | dontSelectMap = false; | ||
| 460 | SelectMap(data->map); | ||
| 461 | }, [=] () { | ||
| 462 | wxTreeItemId toSelect = event.GetOldItem(); | ||
| 463 | MapPtrCtr* oldData = (MapPtrCtr*) mapTree->GetItemData(toSelect); | ||
| 464 | dontSelectMap = true; | ||
| 465 | mapTree->SelectItem(toSelect); | ||
| 466 | dontSelectMap = false; | ||
| 467 | SelectMap(oldData->map); | ||
| 468 | })); | ||
| 469 | } | ||
| 408 | } | 470 | } |
| 409 | 471 | ||
| 410 | void MapeditFrame::OnWillDragMap(wxTreeEvent& event) | 472 | void MapeditFrame::OnWillDragMap(wxTreeEvent& event) |
| @@ -426,9 +488,24 @@ void MapeditFrame::OnDidDragMap(wxTreeEvent& event) | |||
| 426 | newParent = mapTree->GetRootItem(); | 488 | newParent = mapTree->GetRootItem(); |
| 427 | } | 489 | } |
| 428 | 490 | ||
| 429 | wxTreeItemId newChild = MoveTreeNode(dragMap, newParent); | 491 | wxTreeItemId curParent = mapTree->GetItemParent(event.GetItem()); |
| 492 | wxTreeItemId dragMapCopy = dragMap; | ||
| 430 | dragMap.Unset(); | 493 | dragMap.Unset(); |
| 431 | mapTree->SelectItem(newChild); | 494 | |
| 495 | Map* theMap = ((MapPtrCtr*) mapTree->GetItemData(dragMap))->map; | ||
| 496 | commitAction(std::make_shared<Undoable>("Arranging " + theMap->getTitle(), [=] () { | ||
| 497 | wxTreeItemId newChild = MoveTreeNode(dragMapCopy, newParent); | ||
| 498 | |||
| 499 | dontSelectMap = true; | ||
| 500 | mapTree->SelectItem(newChild); | ||
| 501 | dontSelectMap = false; | ||
| 502 | }, [=] () { | ||
| 503 | wxTreeItemId newChild = MoveTreeNode(dragMapCopy, curParent); | ||
| 504 | |||
| 505 | dontSelectMap = true; | ||
| 506 | mapTree->SelectItem(newChild); | ||
| 507 | dontSelectMap = false; | ||
| 508 | })); | ||
| 432 | } | 509 | } |
| 433 | 510 | ||
| 434 | void MapeditFrame::OnRightClickTree(wxTreeEvent& event) | 511 | void MapeditFrame::OnRightClickTree(wxTreeEvent& event) |
| @@ -451,6 +528,28 @@ void MapeditFrame::OnCancelSetStartpos(wxCommandEvent&) | |||
| 451 | mapEditor->SetIsSettingStart(false); | 528 | mapEditor->SetIsSettingStart(false); |
| 452 | } | 529 | } |
| 453 | 530 | ||
| 531 | void MapeditFrame::OnUndo(wxCommandEvent&) | ||
| 532 | { | ||
| 533 | (*currentAction)->endChanges(); | ||
| 534 | (*currentAction)->undo(); | ||
| 535 | currentAction++; | ||
| 536 | |||
| 537 | UpdateUndoLabels(); | ||
| 538 | } | ||
| 539 | |||
| 540 | void MapeditFrame::OnRedo(wxCommandEvent&) | ||
| 541 | { | ||
| 542 | if (currentAction != end(history)) | ||
| 543 | { | ||
| 544 | (*currentAction)->endChanges(); | ||
| 545 | } | ||
| 546 | |||
| 547 | currentAction--; | ||
| 548 | (*currentAction)->apply(); | ||
| 549 | |||
| 550 | UpdateUndoLabels(); | ||
| 551 | } | ||
| 552 | |||
| 454 | void MapeditFrame::NewWorld() | 553 | void MapeditFrame::NewWorld() |
| 455 | { | 554 | { |
| 456 | LaunchWindow(std::unique_ptr<World>(new World())); | 555 | LaunchWindow(std::unique_ptr<World>(new World())); |
| @@ -531,6 +630,10 @@ void MapeditFrame::SelectMap(Map* map) | |||
| 531 | { | 630 | { |
| 532 | currentMap = map; | 631 | currentMap = map; |
| 533 | mapEditor->SetMap(map); | 632 | mapEditor->SetMap(map); |
| 633 | |||
| 634 | SetIsAddingEntity(false); | ||
| 635 | SetIsSettingStart(false); | ||
| 636 | |||
| 534 | titleBox->ChangeValue(map->getTitle()); | 637 | titleBox->ChangeValue(map->getTitle()); |
| 535 | world->setLastMap(map); | 638 | world->setLastMap(map); |
| 536 | } | 639 | } |
| @@ -592,3 +695,49 @@ void MapeditFrame::SetStartposLabel() | |||
| 592 | 695 | ||
| 593 | startposLabel->SetLabel(mappos_out.str()); | 696 | startposLabel->SetLabel(mappos_out.str()); |
| 594 | } | 697 | } |
| 698 | |||
| 699 | void MapeditFrame::UpdateUndoLabels() | ||
| 700 | { | ||
| 701 | if (currentAction != end(history)) | ||
| 702 | { | ||
| 703 | menuEdit->SetLabel(MENU_EDIT_UNDO, "Undo " + (*currentAction)->getTitle() + "\tCtrl-Z"); | ||
| 704 | menuEdit->Enable(MENU_EDIT_UNDO, true); | ||
| 705 | } else { | ||
| 706 | menuEdit->SetLabel(MENU_EDIT_UNDO, "Undo\tCtrl-Z"); | ||
| 707 | menuEdit->Enable(MENU_EDIT_UNDO, false); | ||
| 708 | } | ||
| 709 | |||
| 710 | if (currentAction != begin(history)) | ||
| 711 | { | ||
| 712 | menuEdit->SetLabel(MENU_EDIT_REDO, "Redo " + (*std::prev(currentAction))->getTitle() + "\tCtrl-Shift-Z"); | ||
| 713 | menuEdit->Enable(MENU_EDIT_REDO, true); | ||
| 714 | } else { | ||
| 715 | menuEdit->SetLabel(MENU_EDIT_REDO, "Redo\tCtrl-Shift-Z"); | ||
| 716 | menuEdit->Enable(MENU_EDIT_REDO, false); | ||
| 717 | } | ||
| 718 | } | ||
| 719 | |||
| 720 | void MapeditFrame::commitAction(std::shared_ptr<Undoable> action) | ||
| 721 | { | ||
| 722 | action->apply(); | ||
| 723 | |||
| 724 | commitAfter(action); | ||
| 725 | } | ||
| 726 | |||
| 727 | void MapeditFrame::commitAfter(std::shared_ptr<Undoable> action) | ||
| 728 | { | ||
| 729 | if (currentAction != end(history)) | ||
| 730 | { | ||
| 731 | (*currentAction)->endChanges(); | ||
| 732 | } | ||
| 733 | |||
| 734 | history.erase(begin(history), currentAction); | ||
| 735 | currentAction = history.insert(begin(history), action); | ||
| 736 | |||
| 737 | UpdateUndoLabels(); | ||
| 738 | |||
| 739 | if (history.size() > 100) | ||
| 740 | { | ||
| 741 | history.pop_back(); | ||
| 742 | } | ||
| 743 | } | ||
