#include "widget.h" IMPLEMENT_DYNAMIC_CLASS(MapeditWidget,wxScrolledWindow) BEGIN_EVENT_TABLE(MapeditWidget, wxScrolledWindow) EVT_PAINT(MapeditWidget::OnPaint) EVT_LEFT_DOWN(MapeditWidget::OnClick) EVT_LEFT_UP(MapeditWidget::OnMouseUp) EVT_MOTION(MapeditWidget::OnMouseMove) END_EVENT_TABLE() MapeditWidget::MapeditWidget() { Init(); } MapeditWidget::MapeditWidget(wxWindow* parent, wxWindowID winid, Map* map, TileWidget* tileWidget, const wxPoint& pos, const wxSize& size) : wxScrolledWindow(parent, winid, pos, size), map(map), tileWidget(tileWidget) { Init(); } void MapeditWidget::Init() { tiles = wxBitmap(wxImage("../../../res/tiles.png")); this->FitInside(); this->SetScrollRate(5, 5); SetZoomSize(2); } wxSize MapeditWidget::DoGetBestSize() const { return {GAME_WIDTH*2, GAME_HEIGHT*2}; } void MapeditWidget::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); wxMemoryDC tiles_dc; tiles_dc.SelectObject(tiles); int vX, vY; GetViewStart(&vX, &vY); for (int y=0; ymapdata[x+y*MAP_WIDTH]; 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); } } } void MapeditWidget::SetTile(wxPoint pos) { int vX, vY; GetViewStart(&vX, &vY); int x = (pos.x + vX) / (TILE_WIDTH * scale); int y = (pos.y + vY) / (TILE_HEIGHT * scale); map->mapdata[x+y*MAP_WIDTH] = tileWidget->getSelected(); Refresh(); } void MapeditWidget::OnClick(wxMouseEvent& event) { mouseIsDown = true; SetTile(event.GetPosition()); event.Skip(); } void MapeditWidget::OnMouseMove(wxMouseEvent& event) { if (mouseIsDown) { SetTile(event.GetPosition()); } } void MapeditWidget::OnMouseUp(wxMouseEvent& event) { mouseIsDown = false; } void MapeditWidget::ZoomIn() { SetZoomSize(scale+1); } void MapeditWidget::ZoomOut() { SetZoomSize(scale-1); } void MapeditWidget::SetZoomSize(int zoom) { scale = zoom; SetVirtualSize(MAP_WIDTH*TILE_WIDTH*scale, MAP_HEIGHT*TILE_HEIGHT*scale); GetParent()->Refresh(); }