Skip to content

Commit 67f2175

Browse files
Zoom with mouse wheel
1 parent 0c7a57a commit 67f2175

1 file changed

Lines changed: 76 additions & 36 deletions

File tree

CGame_Event.cpp

Lines changed: 76 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,41 @@
1111
#include "callbacks.h"
1212
#include "globals.h"
1313

14+
namespace {
15+
bool tryZoom(int deltaTH, int deltaTW, int deltaInc, CMap* mapObj)
16+
{
17+
if(!mapObj || !mapObj->getMap())
18+
return false;
19+
const int newInc = TRIANGLE_INCREASE + deltaInc;
20+
if(newInc < 1 || newInc > 10)
21+
return false;
22+
23+
callback::PleaseWait(INITIALIZING_CALL);
24+
TRIANGLE_HEIGHT += deltaTH;
25+
TRIANGLE_WIDTH += deltaTW;
26+
TRIANGLE_INCREASE += deltaInc;
27+
bobMAP* myMap = mapObj->getMap();
28+
myMap->updateVertexCoords();
29+
CSurface::get_nodeVectors(*myMap);
30+
callback::PleaseWait(WINDOW_QUIT_MESSAGE);
31+
return true;
32+
}
33+
34+
void resetZoom(CMap* mapObj)
35+
{
36+
if(!mapObj || !mapObj->getMap())
37+
return;
38+
callback::PleaseWait(INITIALIZING_CALL);
39+
TRIANGLE_HEIGHT = 28;
40+
TRIANGLE_WIDTH = 56;
41+
TRIANGLE_INCREASE = 5;
42+
bobMAP* myMap = mapObj->getMap();
43+
myMap->updateVertexCoords();
44+
CSurface::get_nodeVectors(*myMap);
45+
callback::PleaseWait(WINDOW_QUIT_MESSAGE);
46+
}
47+
} // namespace
48+
1449
void CGame::EventHandling(SDL_Event* Event)
1550
{
1651
switch(Event->type)
@@ -81,45 +116,13 @@ void CGame::EventHandling(SDL_Event* Event)
81116
#endif
82117
// F5 - F7 is ZOOM, F5 = zoom in, F6 = normal view, F7 = zoom out
83118
case SDLK_F5:
84-
if(TRIANGLE_INCREASE < 10 && MapObj->getMap())
85-
{
86-
callback::PleaseWait(INITIALIZING_CALL);
87-
TRIANGLE_HEIGHT += 5;
88-
TRIANGLE_WIDTH += 11;
89-
TRIANGLE_INCREASE += 1;
90-
bobMAP* myMap = MapObj->getMap();
91-
myMap->updateVertexCoords();
92-
CSurface::get_nodeVectors(*myMap);
93-
callback::PleaseWait(WINDOW_QUIT_MESSAGE);
94-
}
119+
tryZoom(5, 11, 1, MapObj);
95120
break;
96121
case SDLK_F6:
97-
{
98-
if(MapObj->getMap())
99-
{
100-
callback::PleaseWait(INITIALIZING_CALL);
101-
TRIANGLE_HEIGHT = 28;
102-
TRIANGLE_WIDTH = 56;
103-
TRIANGLE_INCREASE = 5;
104-
bobMAP* myMap = MapObj->getMap();
105-
myMap->updateVertexCoords();
106-
CSurface::get_nodeVectors(*myMap);
107-
callback::PleaseWait(WINDOW_QUIT_MESSAGE);
108-
}
109-
}
110-
break;
122+
resetZoom(MapObj);
123+
break;
111124
case SDLK_F7:
112-
if(TRIANGLE_INCREASE > 1 && MapObj->getMap())
113-
{
114-
callback::PleaseWait(INITIALIZING_CALL);
115-
TRIANGLE_HEIGHT -= 5;
116-
TRIANGLE_WIDTH -= 11;
117-
TRIANGLE_INCREASE -= 1;
118-
bobMAP* myMap = MapObj->getMap();
119-
myMap->updateVertexCoords();
120-
CSurface::get_nodeVectors(*myMap);
121-
callback::PleaseWait(WINDOW_QUIT_MESSAGE);
122-
}
125+
tryZoom(-5, -11, -1, MapObj);
123126
break;
124127

125128
default: break;
@@ -381,6 +384,43 @@ void CGame::EventHandling(SDL_Event* Event)
381384
break;
382385
}
383386

387+
case SDL_MOUSEWHEEL:
388+
{
389+
if(!MapObj)
390+
break;
391+
392+
int y = Event->wheel.y;
393+
if(Event->wheel.direction == SDL_MOUSEWHEEL_FLIPPED)
394+
y = -y;
395+
if(y == 0)
396+
break;
397+
398+
const int deltaTH = (y > 0) ? 5 : -5;
399+
const int deltaTW = (y > 0) ? 11 : -11;
400+
const int deltaInc = (y > 0) ? 1 : -1;
401+
402+
// Save values before zoom for cursor-centered adjustment
403+
const float oldHeight = TRIANGLE_HEIGHT;
404+
const float oldWidth = TRIANGLE_WIDTH;
405+
const float mouseX = Cursor.pos.x;
406+
const float mouseY = Cursor.pos.y;
407+
408+
if(!tryZoom(deltaTH, deltaTW, deltaInc, MapObj))
409+
break;
410+
411+
// Keep the map point under the cursor stable after zoom
412+
DisplayRectangle dr = MapObj->getDisplayRect();
413+
const float ratioX = TRIANGLE_WIDTH / oldWidth;
414+
const float ratioY = TRIANGLE_HEIGHT / oldHeight;
415+
const auto size = dr.getSize();
416+
dr.left = static_cast<Sint32>((dr.left + mouseX) * ratioX - mouseX);
417+
dr.top = static_cast<Sint32>((dr.top + mouseY) * ratioY - mouseY);
418+
dr.right = dr.left + size.x;
419+
dr.bottom = dr.top + size.y;
420+
MapObj->setDisplayRect(dr);
421+
break;
422+
}
423+
384424
case SDL_WINDOWEVENT:
385425
{
386426
switch(Event->window.event)

0 commit comments

Comments
 (0)