summary refs log tree commit diff stats
path: root/tools/mapedit/src/widget.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2015-03-17 15:58:02 -0400
committerKelly Rauchenberger <fefferburbia@gmail.com>2015-03-17 15:58:02 -0400
commit5c6d5cf1b4a22ae6d35b9c081bf34afec263ba63 (patch)
treec5df24939a0678abf14e0e79fd2d5b0bfe17328f /tools/mapedit/src/widget.cpp
parent90ae982fc2bfdf2f4c049db747ce9516debb148a (diff)
downloadtherapy-5c6d5cf1b4a22ae6d35b9c081bf34afec263ba63.tar.gz
therapy-5c6d5cf1b4a22ae6d35b9c081bf34afec263ba63.tar.bz2
therapy-5c6d5cf1b4a22ae6d35b9c081bf34afec263ba63.zip
Made some nice changes to the map editor widget
Center the map edit widget
Map edit zooming in should happen around the cursor
Disallow editing outside the mapedit widget
Add some scroll space around the mapedit widget
Diffstat (limited to 'tools/mapedit/src/widget.cpp')
-rw-r--r--tools/mapedit/src/widget.cpp95
1 files changed, 72 insertions, 23 deletions
diff --git a/tools/mapedit/src/widget.cpp b/tools/mapedit/src/widget.cpp index 61a8d65..cb10489 100644 --- a/tools/mapedit/src/widget.cpp +++ b/tools/mapedit/src/widget.cpp
@@ -1,9 +1,14 @@
1#include "widget.h" 1#include "widget.h"
2#include "frame.h" 2#include "frame.h"
3 3
4IMPLEMENT_DYNAMIC_CLASS(MapeditWidget,wxScrolledWindow) 4const int EDITOR_SPACING_X = MAP_WIDTH * TILE_WIDTH / 2;
5const int EDITOR_SPACING_Y = MAP_HEIGHT * TILE_HEIGHT / 2;
6const int EDITOR_WIDTH = MAP_WIDTH * TILE_WIDTH + EDITOR_SPACING_X * 2;
7const int EDITOR_HEIGHT = MAP_HEIGHT * TILE_HEIGHT + EDITOR_SPACING_Y * 2;
5 8
6BEGIN_EVENT_TABLE(MapeditWidget, wxScrolledWindow) 9IMPLEMENT_DYNAMIC_CLASS(MapeditWidget,wxScrolledCanvas)
10
11BEGIN_EVENT_TABLE(MapeditWidget, wxScrolledCanvas)
7 EVT_PAINT(MapeditWidget::OnPaint) 12 EVT_PAINT(MapeditWidget::OnPaint)
8 EVT_LEFT_DOWN(MapeditWidget::OnClick) 13 EVT_LEFT_DOWN(MapeditWidget::OnClick)
9 EVT_RIGHT_DOWN(MapeditWidget::OnRightClick) 14 EVT_RIGHT_DOWN(MapeditWidget::OnRightClick)
@@ -18,7 +23,7 @@ MapeditWidget::MapeditWidget()
18} 23}
19 24
20MapeditWidget::MapeditWidget(wxWindow* parent, wxWindowID winid, Map* map, TileWidget* tileWidget, const wxPoint& pos, const wxSize& size) 25MapeditWidget::MapeditWidget(wxWindow* parent, wxWindowID winid, Map* map, TileWidget* tileWidget, const wxPoint& pos, const wxSize& size)
21 : wxScrolledWindow(parent, winid, pos, size), map(map), tileWidget(tileWidget) 26 : wxScrolledCanvas(parent, winid, pos, size), map(map), tileWidget(tileWidget)
22{ 27{
23 Init(); 28 Init();
24} 29}
@@ -30,12 +35,21 @@ void MapeditWidget::Init()
30 this->FitInside(); 35 this->FitInside();
31 this->SetScrollRate(5, 5); 36 this->SetScrollRate(5, 5);
32 37
38 SetVirtualSize(EDITOR_WIDTH, EDITOR_HEIGHT);
39
40 int cW, cH;
41 GetClientSize(&cW, &cH);
42 mousePos.x = cW / 2;
43 mousePos.y = cH / 2;
44
45// Scroll(GAME_WIDTH*1.5-mousePos.x, GAME_HEIGHT*1.5-mousePos.y);
46
33 SetZoomSize(2); 47 SetZoomSize(2);
34} 48}
35 49
36wxSize MapeditWidget::DoGetBestSize() const 50wxSize MapeditWidget::DoGetBestSize() const
37{ 51{
38 return {GAME_WIDTH*2, GAME_HEIGHT*2}; 52 return {EDITOR_WIDTH*scale, EDITOR_HEIGHT*scale};
39} 53}
40 54
41void MapeditWidget::OnPaint(wxPaintEvent&) 55void MapeditWidget::OnPaint(wxPaintEvent&)
@@ -43,12 +57,18 @@ void MapeditWidget::OnPaint(wxPaintEvent&)
43 wxPaintDC dc(this); 57 wxPaintDC dc(this);
44 wxMemoryDC tiles_dc; 58 wxMemoryDC tiles_dc;
45 tiles_dc.SelectObject(tiles); 59 tiles_dc.SelectObject(tiles);
46 int vX, vY; 60
61 int vX, vY, vXX, vXY, vW, vH, cW, cH;
47 GetViewStart(&vX, &vY); 62 GetViewStart(&vX, &vY);
48 int vXX, vYX; 63 GetVirtualSize(&vW, &vH);
49 GetScrollPixelsPerUnit(&vXX, &vYX); 64 GetClientSize(&cW, &cH);
65 GetScrollPixelsPerUnit(&vXX, &vXY);
50 vX *= vXX; 66 vX *= vXX;
51 vY *= vYX; 67 vY *= vXY;
68
69 dc.SetPen(*wxGREY_PEN);
70 dc.SetBrush(*wxGREY_BRUSH);
71 dc.DrawRectangle(0, 0, cW, cH);
52 72
53 for (int y=0; y<MAP_HEIGHT; y++) 73 for (int y=0; y<MAP_HEIGHT; y++)
54 { 74 {
@@ -60,7 +80,9 @@ void MapeditWidget::OnPaint(wxPaintEvent&)
60 tile = tileWidget->getSelected(); 80 tile = tileWidget->getSelected();
61 } 81 }
62 82
63 dc.StretchBlit(x*TILE_WIDTH*scale-vX, y*TILE_HEIGHT*scale-vY, TILE_WIDTH*scale, TILE_HEIGHT*scale, &tiles_dc, tile%8*TILE_WIDTH, tile/8*TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT); 83 wxPoint pos {(x*TILE_WIDTH + EDITOR_SPACING_X)*scale - vX, (y*TILE_HEIGHT + EDITOR_SPACING_Y) * scale - vY};
84
85 dc.StretchBlit(pos.x, pos.y, TILE_WIDTH*scale, TILE_HEIGHT*scale, &tiles_dc, tile%8*TILE_WIDTH, tile/8*TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
64 } 86 }
65 } 87 }
66 88
@@ -71,7 +93,7 @@ void MapeditWidget::OnPaint(wxPaintEvent&)
71 wxBitmap sprite = object->object->getSprite(); 93 wxBitmap sprite = object->object->getSprite();
72 tiles_dc.SelectObject(sprite); 94 tiles_dc.SelectObject(sprite);
73 95
74 wxPoint pos {(int) object->position.first*scale-vX, (int) object->position.second*scale-vY}; 96 wxPoint pos {(object->position.first + EDITOR_SPACING_X)*scale-vX, (object->position.second + EDITOR_SPACING_Y)*scale-vY};
75 wxSize size {object->object->getWidth()*scale, object->object->getHeight()*scale}; 97 wxSize size {object->object->getWidth()*scale, object->object->getHeight()*scale};
76 dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, object->object->getWidth(), object->object->getHeight()); 98 dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, object->object->getWidth(), object->object->getHeight());
77 99
@@ -99,9 +121,9 @@ void MapeditWidget::OnPaint(wxPaintEvent&)
99 tiles_dc.SelectObject(wxNullBitmap); 121 tiles_dc.SelectObject(wxNullBitmap);
100 tiles_dc.SelectObject(sprite); 122 tiles_dc.SelectObject(sprite);
101 123
102 std::pair<double, double> startPos = map->getWorld()->getStartingPosition(); 124 std::pair<int, int> startPos = map->getWorld()->getStartingPosition();
103 125
104 wxPoint pos {(int) startPos.first*scale-vX, (int) startPos.second*scale-vY}; 126 wxPoint pos {(startPos.first + EDITOR_SPACING_X)*scale-vX, (startPos.second + EDITOR_SPACING_Y)*scale-vY};
105 wxSize size {PLAYER_WIDTH[currentPlayer]*scale, PLAYER_HEIGHT[currentPlayer]*scale}; 127 wxSize size {PLAYER_WIDTH[currentPlayer]*scale, PLAYER_HEIGHT[currentPlayer]*scale};
106 128
107 dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, PLAYER_WIDTH[currentPlayer], PLAYER_HEIGHT[currentPlayer]); 129 dc.StretchBlit(pos.x, pos.y, size.GetWidth(), size.GetHeight(), &tiles_dc, 0, 0, PLAYER_WIDTH[currentPlayer], PLAYER_HEIGHT[currentPlayer]);
@@ -127,10 +149,10 @@ void MapeditWidget::OnPaint(wxPaintEvent&)
127 } else if (editMode == EditTiles) 149 } else if (editMode == EditTiles)
128 { 150 {
129 int tile = tileWidget->getSelected(); 151 int tile = tileWidget->getSelected();
130 int x = (mousePos.x + vX) / (TILE_WIDTH * scale); 152 int x = (mousePos.x + vX - EDITOR_SPACING_X*scale) / (TILE_WIDTH * scale);
131 int y = (mousePos.y + vY) / (TILE_HEIGHT * scale); 153 int y = (mousePos.y + vY - EDITOR_SPACING_Y*scale) / (TILE_HEIGHT * scale);
132 154
133 wxPoint pos {x*TILE_WIDTH*scale-vX, y*TILE_HEIGHT*scale-vY}; 155 wxPoint pos {(x*TILE_WIDTH + EDITOR_SPACING_X)*scale-vX, (y*TILE_HEIGHT + EDITOR_SPACING_Y)*scale-vY};
134 wxSize size {TILE_WIDTH*scale, TILE_HEIGHT*scale}; 156 wxSize size {TILE_WIDTH*scale, TILE_HEIGHT*scale};
135 157
136 tiles_dc.SelectObject(wxNullBitmap); 158 tiles_dc.SelectObject(wxNullBitmap);
@@ -184,8 +206,8 @@ void MapeditWidget::SetTile(wxPoint pos)
184 vX *= vXX; 206 vX *= vXX;
185 vY *= vYX; 207 vY *= vYX;
186 208
187 int x = (pos.x + vX) / (TILE_WIDTH * scale); 209 int x = (pos.x + vX - EDITOR_SPACING_X*scale) / (TILE_WIDTH * scale);
188 int y = (pos.y + vY) / (TILE_HEIGHT * scale); 210 int y = (pos.y + vY - EDITOR_SPACING_Y*scale) / (TILE_HEIGHT * scale);
189 211
190 changeBuffer.insert({x,y}); 212 changeBuffer.insert({x,y});
191 213
@@ -194,6 +216,8 @@ void MapeditWidget::SetTile(wxPoint pos)
194 216
195void MapeditWidget::OnClick(wxMouseEvent& event) 217void MapeditWidget::OnClick(wxMouseEvent& event)
196{ 218{
219 if (!mouseIsIn) return;
220
197 mouseIsDown = true; 221 mouseIsDown = true;
198 222
199 int vX, vY; 223 int vX, vY;
@@ -338,14 +362,29 @@ void MapeditWidget::OnRightClick(wxMouseEvent& event)
338void MapeditWidget::OnMouseMove(wxMouseEvent& event) 362void MapeditWidget::OnMouseMove(wxMouseEvent& event)
339{ 363{
340 mousePos = event.GetPosition(); 364 mousePos = event.GetPosition();
341 mouseIsIn = true;
342 365
343 if (editMode == EditTiles) 366 int vX, vY, vW, vH;
367 GetViewStart(&vX, &vY);
368 GetVirtualSize(&vW, &vH);
369 int vXX, vYX;
370 GetScrollPixelsPerUnit(&vXX, &vYX);
371 vX *= vXX;
372 vY *= vYX;
373
374 if ((mousePos.x+vX >= EDITOR_SPACING_X*scale) && (mousePos.x+vX < (EDITOR_WIDTH-EDITOR_SPACING_X)*scale)
375 && (mousePos.y+vY >= EDITOR_SPACING_Y*scale) && (mousePos.y+vY < (EDITOR_HEIGHT-EDITOR_SPACING_Y)*scale))
344 { 376 {
345 if (mouseIsDown) 377 mouseIsIn = true;
378
379 if (editMode == EditTiles)
346 { 380 {
347 SetTile(event.GetPosition()); 381 if (mouseIsDown)
382 {
383 SetTile(event.GetPosition());
384 }
348 } 385 }
386 } else {
387 mouseIsIn = false;
349 } 388 }
350 389
351 Refresh(); 390 Refresh();
@@ -406,9 +445,19 @@ void MapeditWidget::ZoomOut()
406 445
407void MapeditWidget::SetZoomSize(int zoom) 446void MapeditWidget::SetZoomSize(int zoom)
408{ 447{
409 scale = zoom; 448 int vX, vY, vXX, vXY;
449 GetViewStart(&vX, &vY);
450 GetScrollPixelsPerUnit(&vXX, &vXY);
451 vX *= vXX;
452 vY *= vXY;
410 453
411 SetVirtualSize(MAP_WIDTH*TILE_WIDTH*scale, MAP_HEIGHT*TILE_HEIGHT*scale); 454 int newViewStartX = (vX + mousePos.x) / scale * zoom - mousePos.x;
455 int newViewStartY = (vY + mousePos.y) / scale * zoom - mousePos.y;
456
457 SetVirtualSize(EDITOR_WIDTH * zoom, EDITOR_HEIGHT * zoom);
458 Scroll(newViewStartX / vXX, newViewStartY / vXY);
459
460 scale = zoom;
412 461
413 Refresh(); 462 Refresh();
414} 463}