From 8702c11db08f78b6c91ef950ce280f2289b1a6e6 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sun, 15 Mar 2015 15:50:04 -0400 Subject: Added scrolling and zooming to map editor --- tools/mapedit/src/frame.cpp | 55 +++++++++++++++++++++++++++++++++++---- tools/mapedit/src/frame.h | 10 +++++++ tools/mapedit/src/main.cpp | 2 ++ tools/mapedit/src/tile_widget.cpp | 46 ++++++++++++++++---------------- tools/mapedit/src/tile_widget.h | 9 ++++--- tools/mapedit/src/widget.cpp | 52 +++++++++++++++++++++++------------- tools/mapedit/src/widget.h | 7 ++++- 7 files changed, 131 insertions(+), 50 deletions(-) (limited to 'tools') diff --git a/tools/mapedit/src/frame.cpp b/tools/mapedit/src/frame.cpp index 858620e..537cd16 100644 --- a/tools/mapedit/src/frame.cpp +++ b/tools/mapedit/src/frame.cpp @@ -1,30 +1,75 @@ #include "frame.h" #include "widget.h" #include "tile_widget.h" +#include +#include "panel.h" + +enum { + MENU_VIEW_ZOOM_IN, + MENU_VIEW_ZOOM_OUT +}; wxBEGIN_EVENT_TABLE(MapeditFrame, wxFrame) EVT_MENU(wxID_EXIT, MapeditFrame::OnExit) + EVT_MENU(MENU_VIEW_ZOOM_IN, MapeditFrame::ZoomIn) + EVT_MENU(MENU_VIEW_ZOOM_OUT, MapeditFrame::ZoomOut) wxEND_EVENT_TABLE() MapeditFrame::MapeditFrame(Map map) : wxFrame(NULL, wxID_ANY, "Map Editor", wxPoint(50, 50), wxSize(GAME_WIDTH*3, GAME_HEIGHT*2)), map(map) { wxMenu* menuFile = new wxMenu; menuFile->Append(wxID_EXIT); + + wxMenu* menuView = new wxMenu; + menuView->Append(MENU_VIEW_ZOOM_IN, "Zoom In\tCtrl-+"); + menuView->Append(MENU_VIEW_ZOOM_OUT, "Zoom Out\tCtrl--"); wxMenuBar* menuBar = new wxMenuBar; menuBar->Append(menuFile, "&File"); + menuBar->Append(menuView, "&View"); SetMenuBar(menuBar); - wxPanel* panel = new wxPanel(this, wxID_ANY); - int clientWidth, clientHeight; - GetClientSize(&clientWidth, &clientHeight); + wxBoxSizer* sizermain = new wxBoxSizer(wxVERTICAL); + wxSplitterWindow* splitter = new wxSplitterWindow(this, wxID_ANY); + splitter->SetSashGravity(0.0); + splitter->SetMinimumPaneSize(50); + sizermain->Add(splitter, 1, wxEXPAND, 0); + + wxPanel* tileEditorPanel = new wxPanel(splitter, wxID_ANY); + tileEditor = new TileWidget(tileEditorPanel, wxID_ANY, 6, 6, wxPoint(0,0)); + wxBoxSizer* tileSizer = new wxBoxSizer(wxVERTICAL); + tileSizer->Add(tileEditor, 1, wxEXPAND, 0); + tileEditorPanel->SetSizer(tileSizer); + + wxPanel* mapEditorPanel = new wxPanel(splitter, wxID_ANY); + mapEditor = new MapeditWidget(mapEditorPanel, wxID_ANY, &this->map, tileEditor, wxPoint(0,0)); + wxBoxSizer* mapSizer = new wxBoxSizer(wxVERTICAL); + mapSizer->Add(mapEditor, 1, wxEXPAND, 0); + mapEditorPanel->SetSizer(mapSizer); - TileWidget* tileEdit = new TileWidget(panel, wxID_ANY, 6, wxPoint(0,0), wxSize(TILE_WIDTH*3*6, clientHeight)); - MapeditWidget* wid = new MapeditWidget(panel, wxID_ANY, &this->map, tileEdit, wxPoint(TILE_WIDTH*3*6+8,0), wxSize(GAME_WIDTH*1.5, GAME_HEIGHT*1.5)); + splitter->SplitVertically(tileEditorPanel, mapEditorPanel); + + this->SetSizer(sizermain); + sizermain->SetSizeHints(this); } void MapeditFrame::OnExit(wxCommandEvent& event) { Close(true); } + +MapeditWidget* MapeditFrame::GetMapEditor() +{ + return mapEditor; +} + +void MapeditFrame::ZoomIn(wxCommandEvent& event) +{ + mapEditor->ZoomIn(); +} + +void MapeditFrame::ZoomOut(wxCommandEvent& event) +{ + mapEditor->ZoomOut(); +} diff --git a/tools/mapedit/src/frame.h b/tools/mapedit/src/frame.h index e5d8562..4d6c3dc 100644 --- a/tools/mapedit/src/frame.h +++ b/tools/mapedit/src/frame.h @@ -8,16 +8,26 @@ #endif #include "map.h" +#include "widget.h" +#include "tile_widget.h" class MapeditFrame : public wxFrame { public: MapeditFrame() : MapeditFrame(Map()) {} MapeditFrame(Map map); + MapeditWidget* GetMapEditor(); + + protected: + void ZoomIn(wxCommandEvent& event); + void ZoomOut(wxCommandEvent& event); + private: void OnExit(wxCommandEvent& event); Map map; + MapeditWidget* mapEditor; + TileWidget* tileEditor; wxDECLARE_EVENT_TABLE(); }; diff --git a/tools/mapedit/src/main.cpp b/tools/mapedit/src/main.cpp index 28fa010..cfc5a46 100644 --- a/tools/mapedit/src/main.cpp +++ b/tools/mapedit/src/main.cpp @@ -19,6 +19,8 @@ bool MapeditApp::OnInit() wxInitAllImageHandlers(); MapeditFrame* frame = new MapeditFrame(); + SetTopWindow(frame); frame->Show(true); + return true; } diff --git a/tools/mapedit/src/tile_widget.cpp b/tools/mapedit/src/tile_widget.cpp index 423b7c0..3dccecb 100644 --- a/tools/mapedit/src/tile_widget.cpp +++ b/tools/mapedit/src/tile_widget.cpp @@ -1,9 +1,9 @@ #include "tile_widget.h" #include "map.h" -IMPLEMENT_DYNAMIC_CLASS(TileWidget,wxControl) +IMPLEMENT_DYNAMIC_CLASS(TileWidget,wxScrolledWindow) -BEGIN_EVENT_TABLE(TileWidget, wxControl) +BEGIN_EVENT_TABLE(TileWidget, wxScrolledWindow) EVT_PAINT(TileWidget::OnPaint) EVT_LEFT_DOWN(TileWidget::OnClick) END_EVENT_TABLE() @@ -13,8 +13,8 @@ TileWidget::TileWidget() Init(); } -TileWidget::TileWidget(wxWindow* parent, wxWindowID winid, int numTilesWidth, const wxPoint& pos, const wxSize& size) - : wxControl(parent, winid, pos, size), numTilesWidth(numTilesWidth) +TileWidget::TileWidget(wxWindow* parent, wxWindowID winid, int width, int scale, const wxPoint& pos, const wxSize& size) + : wxScrolledWindow(parent, winid, pos, size), numTilesWidth(width), scale(scale) { Init(); } @@ -27,7 +27,11 @@ int TileWidget::getSelected() void TileWidget::Init() { tiles = wxBitmap(wxImage("../../../res/tiles.png")); - numTiles = 50; + + this->FitInside(); + this->SetScrollRate(5, 5); + + SetVirtualSize(numTilesWidth*TILE_WIDTH*scale, (numTiles / numTilesWidth + 1) * TILE_HEIGHT*scale); } void TileWidget::OnPaint(wxPaintEvent& event) @@ -35,39 +39,35 @@ void TileWidget::OnPaint(wxPaintEvent& event) wxPaintDC dc(this); wxMemoryDC tiles_dc; tiles_dc.SelectObject(tiles); - wxRegionIterator upd(GetUpdateRegion()); - int vW = upd.GetW(); - int vH = upd.GetH(); - wxPen pen(*wxGREEN, 2); - dc.SetPen(pen); - dc.SetBrush(*wxTRANSPARENT_BRUSH); + int vX, vY, vW, vH, aW, aH; + GetViewStart(&vX, &vY); + GetVirtualSize(&vW, &vH); + GetSize(&aW, &aH); - double endWidth = (double) vW / (double) numTilesWidth; - double endHeight = TILE_HEIGHT * (endWidth / (double) TILE_WIDTH); - for (int i=0; i #endif -class TileWidget : public wxControl { +#include "map.h" + +class TileWidget : public wxScrolledWindow { public: TileWidget(); - TileWidget(wxWindow* parent, wxWindowID winid, int numTilesWidth = 8, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + TileWidget(wxWindow* parent, wxWindowID winid, int width, int scale, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); int getSelected(); @@ -22,8 +24,9 @@ class TileWidget : public wxControl { private: int numTilesWidth; wxBitmap tiles; - int numTiles; + int numTiles = 50; int selected = 0; + int scale; DECLARE_DYNAMIC_CLASS(MapeditWidget); DECLARE_EVENT_TABLE(); diff --git a/tools/mapedit/src/widget.cpp b/tools/mapedit/src/widget.cpp index 030e556..47efa18 100644 --- a/tools/mapedit/src/widget.cpp +++ b/tools/mapedit/src/widget.cpp @@ -1,8 +1,8 @@ #include "widget.h" -IMPLEMENT_DYNAMIC_CLASS(MapeditWidget,wxControl) +IMPLEMENT_DYNAMIC_CLASS(MapeditWidget,wxScrolledWindow) -BEGIN_EVENT_TABLE(MapeditWidget, wxControl) +BEGIN_EVENT_TABLE(MapeditWidget, wxScrolledWindow) EVT_PAINT(MapeditWidget::OnPaint) EVT_LEFT_DOWN(MapeditWidget::OnClick) EVT_LEFT_UP(MapeditWidget::OnMouseUp) @@ -15,7 +15,7 @@ MapeditWidget::MapeditWidget() } MapeditWidget::MapeditWidget(wxWindow* parent, wxWindowID winid, Map* map, TileWidget* tileWidget, const wxPoint& pos, const wxSize& size) - : wxControl(parent, winid, pos, size), map(map), tileWidget(tileWidget) + : wxScrolledWindow(parent, winid, pos, size), map(map), tileWidget(tileWidget) { Init(); } @@ -23,6 +23,11 @@ MapeditWidget::MapeditWidget(wxWindow* parent, wxWindowID winid, Map* map, TileW void MapeditWidget::Init() { tiles = wxBitmap(wxImage("../../../res/tiles.png")); + + this->FitInside(); + this->SetScrollRate(5, 5); + + SetZoomSize(2); } wxSize MapeditWidget::DoGetBestSize() const @@ -35,34 +40,26 @@ void MapeditWidget::OnPaint(wxPaintEvent& event) wxPaintDC dc(this); wxMemoryDC tiles_dc; tiles_dc.SelectObject(tiles); - wxRegionIterator upd(GetUpdateRegion()); - int vW = upd.GetW(); - int vH = upd.GetH(); + int vX, vY; + GetViewStart(&vX, &vY); - double endWidth = TILE_WIDTH * ((double) vW / (double) GAME_WIDTH); - double endHeight = TILE_HEIGHT * ((double) vH / (double) GAME_HEIGHT); - for (int y=0; ymapdata[x+y*MAP_WIDTH]; - dc.StretchBlit(x*endWidth, y*endHeight, endWidth, endHeight, &tiles_dc, tile%8*TILE_WIDTH, tile/8*TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT); + 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) { - wxRegionIterator upd(GetUpdateRegion()); - int vW = upd.GetW(); - int vH = upd.GetH(); + int vX, vY; + GetViewStart(&vX, &vY); - double endWidth = TILE_WIDTH * ((double) vW / (double) GAME_WIDTH); - double endHeight = TILE_HEIGHT * ((double) vH / (double) GAME_HEIGHT); - - int x = pos.x / endWidth; - int y = pos.y / endHeight; + 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(); @@ -89,3 +86,22 @@ 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(); +} diff --git a/tools/mapedit/src/widget.h b/tools/mapedit/src/widget.h index f2bfbbe..f66b0b2 100644 --- a/tools/mapedit/src/widget.h +++ b/tools/mapedit/src/widget.h @@ -10,11 +10,14 @@ #include "map.h" #include "tile_widget.h" -class MapeditWidget : public wxControl { +class MapeditWidget : public wxScrolledWindow { public: MapeditWidget(); MapeditWidget(wxWindow* parent, wxWindowID winid, Map* map, TileWidget* tileWidget, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + void ZoomIn(); + void ZoomOut(); + protected: void Init(); virtual wxSize DoGetBestSize() const; @@ -25,11 +28,13 @@ class MapeditWidget : public wxControl { private: void SetTile(wxPoint pos); + void SetZoomSize(int zoom); Map* const map = nullptr; wxBitmap tiles; TileWidget* tileWidget; bool mouseIsDown = false; + int scale; DECLARE_DYNAMIC_CLASS(MapeditWidget); DECLARE_EVENT_TABLE(); -- cgit 1.4.1