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 | ||