diff options
Diffstat (limited to 'tools/mapedit/src/widget.cpp')
| -rw-r--r-- | tools/mapedit/src/widget.cpp | 86 |
1 files changed, 61 insertions, 25 deletions
| diff --git a/tools/mapedit/src/widget.cpp b/tools/mapedit/src/widget.cpp index fa0af39..8d74b39 100644 --- a/tools/mapedit/src/widget.cpp +++ b/tools/mapedit/src/widget.cpp | |||
| @@ -16,6 +16,8 @@ BEGIN_EVENT_TABLE(MapeditWidget, wxScrolledCanvas) | |||
| 16 | EVT_LEAVE_WINDOW(MapeditWidget::OnMouseOut) | 16 | EVT_LEAVE_WINDOW(MapeditWidget::OnMouseOut) |
| 17 | EVT_SCROLLWIN(MapeditWidget::OnScroll) | 17 | EVT_SCROLLWIN(MapeditWidget::OnScroll) |
| 18 | END_EVENT_TABLE() | 18 | END_EVENT_TABLE() |
| 19 | |||
| 20 | wxDEFINE_EVENT(EVT_MAP_SELECTED_ENTITY, wxCommandEvent); | ||
| 19 | 21 | ||
| 20 | MapeditWidget::MapeditWidget() | 22 | MapeditWidget::MapeditWidget() |
| 21 | { | 23 | { |
| @@ -107,12 +109,12 @@ void MapeditWidget::OnPaint(wxPaintEvent&) | |||
| 107 | { | 109 | { |
| 108 | tiles_dc.SelectObject(wxNullBitmap); | 110 | tiles_dc.SelectObject(wxNullBitmap); |
| 109 | 111 | ||
| 110 | wxBitmap sprite = object->object->getSprite(); | 112 | wxBitmap sprite = object->getObject().getSprite(); |
| 111 | tiles_dc.SelectObject(sprite); | 113 | tiles_dc.SelectObject(sprite); |
| 112 | 114 | ||
| 113 | wxPoint pos {(object->position.first + EDITOR_SPACING_X)*scale-vX, (object->position.second + EDITOR_SPACING_Y)*scale-vY}; | 115 | wxPoint pos {(object->getPosition().first + EDITOR_SPACING_X)*scale-vX, (object->getPosition().second + EDITOR_SPACING_Y)*scale-vY}; |
| 114 | wxSize size {object->object->getWidth()*scale, object->object->getHeight()*scale}; | 116 | wxSize size {object->getObject().getWidth()*scale, object->getObject().getHeight()*scale}; |
| 115 | dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, object->object->getWidth(), object->object->getHeight()); | 117 | dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, object->getObject().getWidth(), object->getObject().getHeight()); |
| 116 | 118 | ||
| 117 | if (editMode == EditEntities) | 119 | if (editMode == EditEntities) |
| 118 | { | 120 | { |
| @@ -197,14 +199,14 @@ void MapeditWidget::OnPaint(wxPaintEvent&) | |||
| 197 | dc.DrawRectangle(pos.x, pos.y, size.GetWidth(), size.GetHeight()); | 199 | dc.DrawRectangle(pos.x, pos.y, size.GetWidth(), size.GetHeight()); |
| 198 | } else if ((editMode == EditEntities) && (movingEntity != nullptr)) | 200 | } else if ((editMode == EditEntities) && (movingEntity != nullptr)) |
| 199 | { | 201 | { |
| 200 | wxBitmap sprite = movingEntity->object->getSprite(); | 202 | wxBitmap sprite = movingEntity->getObject().getSprite(); |
| 201 | tiles_dc.SelectObject(wxNullBitmap); | 203 | tiles_dc.SelectObject(wxNullBitmap); |
| 202 | tiles_dc.SelectObject(sprite); | 204 | tiles_dc.SelectObject(sprite); |
| 203 | 205 | ||
| 204 | wxPoint pos {mousePos.x - movingEntity->object->getWidth()/2*scale, mousePos.y - movingEntity->object->getHeight()/2*scale}; | 206 | wxPoint pos {mousePos.x - movingEntity->getObject().getWidth()/2*scale, mousePos.y - movingEntity->getObject().getHeight()/2*scale}; |
| 205 | wxSize size {movingEntity->object->getWidth()*scale, movingEntity->object->getHeight()*scale}; | 207 | wxSize size {movingEntity->getObject().getWidth()*scale, movingEntity->getObject().getHeight()*scale}; |
| 206 | 208 | ||
| 207 | dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, movingEntity->object->getWidth(), movingEntity->object->getHeight()); | 209 | dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, movingEntity->getObject().getWidth(), movingEntity->getObject().getHeight()); |
| 208 | 210 | ||
| 209 | wxPen pen(*wxGREEN, 2); | 211 | wxPen pen(*wxGREEN, 2); |
| 210 | dc.SetPen(pen); | 212 | dc.SetPen(pen); |
| @@ -254,17 +256,23 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
| 254 | int x = (event.GetPosition().x + vX - EDITOR_SPACING_X*scale) / scale - (addingEntity->getWidth() / 2); | 256 | int x = (event.GetPosition().x + vX - EDITOR_SPACING_X*scale) / scale - (addingEntity->getWidth() / 2); |
| 255 | int y = (event.GetPosition().y + vY - EDITOR_SPACING_Y*scale) / scale - (addingEntity->getHeight() / 2); | 257 | int y = (event.GetPosition().y + vY - EDITOR_SPACING_Y*scale) / scale - (addingEntity->getHeight() / 2); |
| 256 | 258 | ||
| 257 | auto data = std::make_shared<MapObjectEntry>(); | 259 | auto data = std::make_shared<MapObjectEntry>(*addingEntity, x, y); |
| 258 | data->object = addingEntity; | 260 | frame->commitAction(std::make_shared<Undoable>("Add " + addingEntity->getName(), [=] () { |
| 259 | data->position = std::make_pair(x,y); | ||
| 260 | |||
| 261 | frame->commitAction(std::make_shared<Undoable>("Add " + addingEntity->getType(), [=] () { | ||
| 262 | map->addObject(data); | 261 | map->addObject(data); |
| 263 | 262 | ||
| 264 | Refresh(); | 263 | Refresh(); |
| 265 | }, [=] () { | 264 | }, [=] () { |
| 266 | map->removeObject(data); | 265 | map->removeObject(data); |
| 267 | 266 | ||
| 267 | if (data == selectedEntity) | ||
| 268 | { | ||
| 269 | selectedEntity.reset(); | ||
| 270 | |||
| 271 | wxCommandEvent sev {EVT_MAP_SELECTED_ENTITY}; | ||
| 272 | sev.SetClientData(0); | ||
| 273 | ProcessEvent(sev); | ||
| 274 | } | ||
| 275 | |||
| 268 | Refresh(); | 276 | Refresh(); |
| 269 | })); | 277 | })); |
| 270 | 278 | ||
| @@ -272,17 +280,17 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
| 272 | addingEntity = nullptr; | 280 | addingEntity = nullptr; |
| 273 | } else if (movingEntity != nullptr) | 281 | } else if (movingEntity != nullptr) |
| 274 | { | 282 | { |
| 275 | int x = (event.GetPosition().x + vX - EDITOR_SPACING_X*scale) / scale - (movingEntity->object->getWidth() / 2); | 283 | int x = (event.GetPosition().x + vX - EDITOR_SPACING_X*scale) / scale - (movingEntity->getObject().getWidth() / 2); |
| 276 | int y = (event.GetPosition().y + vY - EDITOR_SPACING_Y*scale) / scale - (movingEntity->object->getHeight() / 2); | 284 | int y = (event.GetPosition().y + vY - EDITOR_SPACING_Y*scale) / scale - (movingEntity->getObject().getHeight() / 2); |
| 277 | auto oldPos = movingEntity->position; | 285 | auto oldPos = movingEntity->getPosition(); |
| 278 | MapObjectEntry* me = movingEntity; | 286 | MapObjectEntry* me = movingEntity; |
| 279 | 287 | ||
| 280 | frame->commitAction(std::make_shared<Undoable>("Move " + movingEntity->object->getType(), [=] () { | 288 | frame->commitAction(std::make_shared<Undoable>("Move " + movingEntity->getObject().getName(), [=] () { |
| 281 | me->position = std::make_pair(x,y); | 289 | me->setPosition(x, y); |
| 282 | 290 | ||
| 283 | Refresh(); | 291 | Refresh(); |
| 284 | }, [=] () { | 292 | }, [=] () { |
| 285 | me->position = oldPos; | 293 | me->setPosition(oldPos.first, oldPos.second); |
| 286 | 294 | ||
| 287 | Refresh(); | 295 | Refresh(); |
| 288 | })); | 296 | })); |
| @@ -295,24 +303,34 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
| 295 | 303 | ||
| 296 | if (selectedEntity) | 304 | if (selectedEntity) |
| 297 | { | 305 | { |
| 298 | if ((x > selectedEntity->position.first) && (x < selectedEntity->position.first + selectedEntity->object->getWidth()) | 306 | if ((x > selectedEntity->getPosition().first) |
| 299 | && (y > selectedEntity->position.second) && (y < selectedEntity->position.second + selectedEntity->object->getHeight())) | 307 | && (x < selectedEntity->getPosition().first + selectedEntity->getObject().getWidth()) |
| 308 | && (y > selectedEntity->getPosition().second) | ||
| 309 | && (y < selectedEntity->getPosition().second + selectedEntity->getObject().getHeight())) | ||
| 300 | { | 310 | { |
| 301 | movingEntity = selectedEntity.get(); | 311 | movingEntity = selectedEntity.get(); |
| 302 | frame->SetIsAddingEntity(true); | 312 | frame->SetIsAddingEntity(true); |
| 303 | } else { | 313 | } else { |
| 304 | selectedEntity.reset(); | 314 | selectedEntity.reset(); |
| 315 | |||
| 316 | wxCommandEvent sev {EVT_MAP_SELECTED_ENTITY}; | ||
| 317 | sev.SetClientData(0); | ||
| 318 | ProcessEvent(sev); | ||
| 305 | } | 319 | } |
| 306 | 320 | ||
| 307 | Refresh(); | 321 | Refresh(); |
| 308 | } else { | 322 | } else { |
| 309 | for (auto object : map->getObjects()) | 323 | for (auto object : map->getObjects()) |
| 310 | { | 324 | { |
| 311 | if ((x >= object->position.first) && (x <= object->position.first + object->object->getWidth()) | 325 | if ((x >= object->getPosition().first) && (x <= object->getPosition().first + object->getObject().getWidth()) |
| 312 | && (y >= object->position.second) && (y <= object->position.second + object->object->getHeight())) | 326 | && (y >= object->getPosition().second) && (y <= object->getPosition().second + object->getObject().getHeight())) |
| 313 | { | 327 | { |
| 314 | selectedEntity = object; | 328 | selectedEntity = object; |
| 315 | 329 | ||
| 330 | wxCommandEvent sev {EVT_MAP_SELECTED_ENTITY}; | ||
| 331 | sev.SetClientData(object.get()); | ||
| 332 | ProcessEvent(sev); | ||
| 333 | |||
| 316 | Refresh(); | 334 | Refresh(); |
| 317 | 335 | ||
| 318 | break; | 336 | break; |
| @@ -364,12 +382,18 @@ void MapeditWidget::OnRightClick(wxMouseEvent& event) | |||
| 364 | int x = (event.GetPosition().x + vX - EDITOR_SPACING_X*scale) / scale; | 382 | int x = (event.GetPosition().x + vX - EDITOR_SPACING_X*scale) / scale; |
| 365 | int y = (event.GetPosition().y + vY - EDITOR_SPACING_Y*scale) / scale; | 383 | int y = (event.GetPosition().y + vY - EDITOR_SPACING_Y*scale) / scale; |
| 366 | 384 | ||
| 367 | if ((x > selectedEntity->position.first) && (x < selectedEntity->position.first + selectedEntity->object->getWidth()) | 385 | if ((x > selectedEntity->getPosition().first) |
| 368 | && (y > selectedEntity->position.second) && (y < selectedEntity->position.second + selectedEntity->object->getHeight())) | 386 | && (x < selectedEntity->getPosition().first + selectedEntity->getObject().getWidth()) |
| 387 | && (y > selectedEntity->getPosition().second) | ||
| 388 | && (y < selectedEntity->getPosition().second + selectedEntity->getObject().getHeight())) | ||
| 369 | { | 389 | { |
| 370 | map->removeObject(selectedEntity); | 390 | map->removeObject(selectedEntity); |
| 371 | selectedEntity.reset(); | 391 | selectedEntity.reset(); |
| 372 | 392 | ||
| 393 | wxCommandEvent sev {EVT_MAP_SELECTED_ENTITY}; | ||
| 394 | sev.SetClientData(0); | ||
| 395 | ProcessEvent(sev); | ||
| 396 | |||
| 373 | Refresh(); | 397 | Refresh(); |
| 374 | } | 398 | } |
| 375 | } | 399 | } |
| @@ -494,6 +518,10 @@ void MapeditWidget::StartAddingEntity(MapObject* object) | |||
| 494 | selectedEntity = nullptr; | 518 | selectedEntity = nullptr; |
| 495 | isSettingPos = false; | 519 | isSettingPos = false; |
| 496 | frame->SetIsSettingStart(false); | 520 | frame->SetIsSettingStart(false); |
| 521 | |||
| 522 | wxCommandEvent sev {EVT_MAP_SELECTED_ENTITY}; | ||
| 523 | sev.SetClientData(0); | ||
| 524 | ProcessEvent(sev); | ||
| 497 | } | 525 | } |
| 498 | 526 | ||
| 499 | void MapeditWidget::CancelAddingEntity() | 527 | void MapeditWidget::CancelAddingEntity() |
| @@ -511,6 +539,10 @@ void MapeditWidget::SetIsSettingStart(bool isSetting) | |||
| 511 | frame->SetIsAddingEntity(false); | 539 | frame->SetIsAddingEntity(false); |
| 512 | addingEntity = nullptr; | 540 | addingEntity = nullptr; |
| 513 | selectedEntity = nullptr; | 541 | selectedEntity = nullptr; |
| 542 | |||
| 543 | wxCommandEvent sev {EVT_MAP_SELECTED_ENTITY}; | ||
| 544 | sev.SetClientData(0); | ||
| 545 | ProcessEvent(sev); | ||
| 514 | } else { | 546 | } else { |
| 515 | isSettingPos = false; | 547 | isSettingPos = false; |
| 516 | } | 548 | } |
| @@ -524,6 +556,10 @@ void MapeditWidget::SetMap(Map* map) | |||
| 524 | movingEntity = nullptr; | 556 | movingEntity = nullptr; |
| 525 | isSettingPos = false; | 557 | isSettingPos = false; |
| 526 | 558 | ||
| 559 | wxCommandEvent sev {EVT_MAP_SELECTED_ENTITY}; | ||
| 560 | sev.SetClientData(0); | ||
| 561 | ProcessEvent(sev); | ||
| 562 | |||
| 527 | Refresh(); | 563 | Refresh(); |
| 528 | } | 564 | } |
| 529 | 565 | ||
