diff options
Diffstat (limited to 'tools/mapedit/src/widget.cpp')
| -rw-r--r-- | tools/mapedit/src/widget.cpp | 89 |
1 files changed, 82 insertions, 7 deletions
| diff --git a/tools/mapedit/src/widget.cpp b/tools/mapedit/src/widget.cpp index a78caae..c1f044c 100644 --- a/tools/mapedit/src/widget.cpp +++ b/tools/mapedit/src/widget.cpp | |||
| @@ -6,6 +6,7 @@ IMPLEMENT_DYNAMIC_CLASS(MapeditWidget,wxScrolledWindow) | |||
| 6 | BEGIN_EVENT_TABLE(MapeditWidget, wxScrolledWindow) | 6 | BEGIN_EVENT_TABLE(MapeditWidget, wxScrolledWindow) |
| 7 | EVT_PAINT(MapeditWidget::OnPaint) | 7 | EVT_PAINT(MapeditWidget::OnPaint) |
| 8 | EVT_LEFT_DOWN(MapeditWidget::OnClick) | 8 | EVT_LEFT_DOWN(MapeditWidget::OnClick) |
| 9 | EVT_RIGHT_DOWN(MapeditWidget::OnRightClick) | ||
| 9 | EVT_LEFT_UP(MapeditWidget::OnMouseUp) | 10 | EVT_LEFT_UP(MapeditWidget::OnMouseUp) |
| 10 | EVT_MOTION(MapeditWidget::OnMouseMove) | 11 | EVT_MOTION(MapeditWidget::OnMouseMove) |
| 11 | EVT_LEAVE_WINDOW(MapeditWidget::OnMouseOut) | 12 | EVT_LEAVE_WINDOW(MapeditWidget::OnMouseOut) |
| @@ -24,7 +25,7 @@ MapeditWidget::MapeditWidget(wxWindow* parent, wxWindowID winid, Map* map, TileW | |||
| 24 | 25 | ||
| 25 | void MapeditWidget::Init() | 26 | void MapeditWidget::Init() |
| 26 | { | 27 | { |
| 27 | tiles = wxBitmap(wxImage("../../../res/tiles.png")); | 28 | tiles = wxBitmap(wxImage("res/tiles.png")); |
| 28 | 29 | ||
| 29 | this->FitInside(); | 30 | this->FitInside(); |
| 30 | this->SetScrollRate(5, 5); | 31 | this->SetScrollRate(5, 5); |
| @@ -62,10 +63,18 @@ void MapeditWidget::OnPaint(wxPaintEvent&) | |||
| 62 | { | 63 | { |
| 63 | tiles_dc.SelectObject(wxNullBitmap); | 64 | tiles_dc.SelectObject(wxNullBitmap); |
| 64 | 65 | ||
| 65 | wxBitmap sprite = object.object->getSprite(); | 66 | wxBitmap sprite = object->object->getSprite(); |
| 66 | tiles_dc.SelectObject(sprite); | 67 | tiles_dc.SelectObject(sprite); |
| 67 | 68 | ||
| 68 | dc.StretchBlit(object.position.first*scale-vX, object.position.second*scale-vY, object.object->getWidth()*scale, object.object->getHeight()*scale, &tiles_dc, 0, 0, object.object->getWidth(), object.object->getHeight()); | 69 | dc.StretchBlit(object->position.first*scale-vX, object->position.second*scale-vY, object->object->getWidth()*scale, object->object->getHeight()*scale, &tiles_dc, 0, 0, object->object->getWidth(), object->object->getHeight()); |
| 70 | |||
| 71 | if ((editMode == EditEntities) && (selectedEntity) && (object == selectedEntity)) | ||
| 72 | { | ||
| 73 | wxPen pen(*wxGREEN, 2); | ||
| 74 | dc.SetPen(pen); | ||
| 75 | dc.SetBrush(*wxTRANSPARENT_BRUSH); | ||
| 76 | dc.DrawRectangle(object->position.first*scale-vX, object->position.second*scale-vY, object->object->getWidth()*scale, object->object->getHeight()*scale); | ||
| 77 | } | ||
| 69 | } | 78 | } |
| 70 | 79 | ||
| 71 | if (editMode == EditTiles) | 80 | if (editMode == EditTiles) |
| @@ -140,22 +149,87 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
| 140 | int x = (event.GetPosition().x + vX) / scale - (addingEntity->getWidth() / 2); | 149 | int x = (event.GetPosition().x + vX) / scale - (addingEntity->getWidth() / 2); |
| 141 | int y = (event.GetPosition().y + vY) / scale - (addingEntity->getHeight() / 2); | 150 | int y = (event.GetPosition().y + vY) / scale - (addingEntity->getHeight() / 2); |
| 142 | 151 | ||
| 143 | MapObjectEntry data; | 152 | auto data = std::make_shared<MapObjectEntry>(); |
| 144 | data.object = addingEntity; | 153 | data->object = addingEntity; |
| 145 | data.position = std::make_pair(x,y); | 154 | data->position = std::make_pair(x,y); |
| 146 | map->getObjects().push_back(data); | 155 | map->addObject(data); |
| 147 | 156 | ||
| 148 | addingEntity = nullptr; | 157 | addingEntity = nullptr; |
| 149 | 158 | ||
| 150 | frame->FinishAddingEntity(); | 159 | frame->FinishAddingEntity(); |
| 151 | 160 | ||
| 152 | Refresh(); | 161 | Refresh(); |
| 162 | } else { | ||
| 163 | int vX, vY; | ||
| 164 | GetViewStart(&vX, &vY); | ||
| 165 | int vXX, vYX; | ||
| 166 | GetScrollPixelsPerUnit(&vXX, &vYX); | ||
| 167 | vX *= vXX; | ||
| 168 | vY *= vYX; | ||
| 169 | |||
| 170 | int x = (event.GetPosition().x + vX) / scale; | ||
| 171 | int y = (event.GetPosition().y + vY) / scale; | ||
| 172 | |||
| 173 | if (selectedEntity) | ||
| 174 | { | ||
| 175 | if ((x > selectedEntity->position.first) && (x < selectedEntity->position.first + selectedEntity->object->getWidth()) | ||
| 176 | && (y > selectedEntity->position.second) && (y < selectedEntity->position.second + selectedEntity->object->getHeight())) | ||
| 177 | { | ||
| 178 | addingEntity = selectedEntity->object; | ||
| 179 | map->removeObject(selectedEntity); | ||
| 180 | selectedEntity.reset(); | ||
| 181 | frame->StartAddingEntity(); | ||
| 182 | } else { | ||
| 183 | selectedEntity.reset(); | ||
| 184 | } | ||
| 185 | |||
| 186 | Refresh(); | ||
| 187 | } else { | ||
| 188 | for (auto object : map->getObjects()) | ||
| 189 | { | ||
| 190 | if ((x >= object->position.first) && (x <= object->position.first + object->object->getWidth()) | ||
| 191 | && (y >= object->position.second) && (y <= object->position.second + object->object->getHeight())) | ||
| 192 | { | ||
| 193 | selectedEntity = object; | ||
| 194 | |||
| 195 | Refresh(); | ||
| 196 | |||
| 197 | break; | ||
| 198 | } | ||
| 199 | } | ||
| 200 | } | ||
| 153 | } | 201 | } |
| 154 | } | 202 | } |
| 155 | 203 | ||
| 156 | event.Skip(); | 204 | event.Skip(); |
| 157 | } | 205 | } |
| 158 | 206 | ||
| 207 | void MapeditWidget::OnRightClick(wxMouseEvent& event) | ||
| 208 | { | ||
| 209 | if (editMode == EditEntities) | ||
| 210 | { | ||
| 211 | if (selectedEntity) | ||
| 212 | { | ||
| 213 | int vX, vY; | ||
| 214 | GetViewStart(&vX, &vY); | ||
| 215 | int vXX, vYX; | ||
| 216 | GetScrollPixelsPerUnit(&vXX, &vYX); | ||
| 217 | vX *= vXX; | ||
| 218 | vY *= vYX; | ||
| 219 | |||
| 220 | int x = (event.GetPosition().x + vX) / scale; | ||
| 221 | int y = (event.GetPosition().y + vY) / scale; | ||
| 222 | |||
| 223 | if ((x > selectedEntity->position.first) && (x < selectedEntity->position.first + selectedEntity->object->getWidth()) | ||
| 224 | && (y > selectedEntity->position.second) && (y < selectedEntity->position.second + selectedEntity->object->getHeight())) | ||
| 225 | { | ||
| 226 | map->removeObject(selectedEntity); | ||
| 227 | selectedEntity.reset(); | ||
| 228 | } | ||
| 229 | } | ||
| 230 | } | ||
| 231 | } | ||
| 232 | |||
| 159 | void MapeditWidget::OnMouseMove(wxMouseEvent& event) | 233 | void MapeditWidget::OnMouseMove(wxMouseEvent& event) |
| 160 | { | 234 | { |
| 161 | mousePos = event.GetPosition(); | 235 | mousePos = event.GetPosition(); |
| @@ -216,6 +290,7 @@ void MapeditWidget::SetEditMode(EditMode editMode) | |||
| 216 | void MapeditWidget::StartAddingEntity(MapObject* object) | 290 | void MapeditWidget::StartAddingEntity(MapObject* object) |
| 217 | { | 291 | { |
| 218 | addingEntity = object; | 292 | addingEntity = object; |
| 293 | selectedEntity = nullptr; | ||
| 219 | } | 294 | } |
| 220 | 295 | ||
| 221 | void MapeditWidget::CancelAddingEntity() | 296 | void MapeditWidget::CancelAddingEntity() |
