summary refs log tree commit diff stats
path: root/tools/mapedit/src/widget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/mapedit/src/widget.cpp')
-rw-r--r--tools/mapedit/src/widget.cpp86
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)
18END_EVENT_TABLE() 18END_EVENT_TABLE()
19
20wxDEFINE_EVENT(EVT_MAP_SELECTED_ENTITY, wxCommandEvent);
19 21
20MapeditWidget::MapeditWidget() 22MapeditWidget::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
499void MapeditWidget::CancelAddingEntity() 527void 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