Skip to content

Commit 05fcd18

Browse files
morganchristianssonMorgan Christiansson
authored andcommitted
Zoom with mouse wheel
1 parent 511324b commit 05fcd18

1 file changed

Lines changed: 72 additions & 37 deletions

File tree

CGame_Event.cpp

Lines changed: 72 additions & 37 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(Position deltaTriangle, int deltaInc, CMap* mapObj)
16+
{
17+
if(!mapObj || !mapObj->getMap())
18+
return false;
19+
const int newInc = triangleIncrease + deltaInc;
20+
if(newInc < 1 || newInc > 10)
21+
return false;
22+
23+
callback::PleaseWait(INITIALIZING_CALL);
24+
triangleWidth += deltaTriangle.x;
25+
triangleHeight += deltaTriangle.y;
26+
triangleIncrease += 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+
triangleHeight = TRIANGLE_HEIGHT_DEFAULT;
40+
triangleWidth = TRIANGLE_WIDTH_DEFAULT;
41+
triangleIncrease = TRIANGLE_INCREASE_DEFAULT;
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)
@@ -84,45 +119,11 @@ void CGame::EventHandling(SDL_Event* Event)
84119
#endif
85120
// F5 - F7 is ZOOM, F5 = zoom in, F6 = normal view, F7 = zoom out
86121
case SDLK_F5:
87-
if(triangleIncrease < ZOOM_INCREASE_MAX && MapObj->getMap())
88-
{
89-
callback::PleaseWait(INITIALIZING_CALL);
90-
triangleHeight += ZOOM_STEP_HEIGHT;
91-
triangleWidth += ZOOM_STEP_WIDTH;
92-
triangleIncrease += ZOOM_STEP_INCREASE;
93-
bobMAP* myMap = MapObj->getMap();
94-
myMap->updateVertexCoords();
95-
CSurface::get_nodeVectors(*myMap);
96-
callback::PleaseWait(WINDOW_QUIT_MESSAGE);
97-
}
122+
tryZoom(Position(ZOOM_STEP_WIDTH, ZOOM_STEP_HEIGHT), ZOOM_STEP_INCREASE, MapObj.get());
98123
break;
99-
case SDLK_F6:
100-
{
101-
if(MapObj->getMap())
102-
{
103-
callback::PleaseWait(INITIALIZING_CALL);
104-
triangleHeight = TRIANGLE_HEIGHT_DEFAULT;
105-
triangleWidth = TRIANGLE_WIDTH_DEFAULT;
106-
triangleIncrease = TRIANGLE_INCREASE_DEFAULT;
107-
bobMAP* myMap = MapObj->getMap();
108-
myMap->updateVertexCoords();
109-
CSurface::get_nodeVectors(*myMap);
110-
callback::PleaseWait(WINDOW_QUIT_MESSAGE);
111-
}
112-
}
113-
break;
124+
case SDLK_F6: resetZoom(MapObj.get()); break;
114125
case SDLK_F7:
115-
if(triangleIncrease > ZOOM_INCREASE_MIN && MapObj->getMap())
116-
{
117-
callback::PleaseWait(INITIALIZING_CALL);
118-
triangleHeight -= ZOOM_STEP_HEIGHT;
119-
triangleWidth -= ZOOM_STEP_WIDTH;
120-
triangleIncrease -= ZOOM_STEP_INCREASE;
121-
bobMAP* myMap = MapObj->getMap();
122-
myMap->updateVertexCoords();
123-
CSurface::get_nodeVectors(*myMap);
124-
callback::PleaseWait(WINDOW_QUIT_MESSAGE);
125-
}
126+
tryZoom(Position(-ZOOM_STEP_WIDTH, -ZOOM_STEP_HEIGHT), -ZOOM_STEP_INCREASE, MapObj.get());
126127
break;
127128

128129
default: break;
@@ -384,6 +385,40 @@ void CGame::EventHandling(SDL_Event* Event)
384385
break;
385386
}
386387

388+
case SDL_MOUSEWHEEL:
389+
{
390+
if(!MapObj)
391+
break;
392+
393+
int y = Event->wheel.y;
394+
if(Event->wheel.direction == SDL_MOUSEWHEEL_FLIPPED)
395+
y = -y;
396+
if(y == 0)
397+
break;
398+
399+
const Position deltaTri = (y > 0) ? Position(11, 5) : Position(-11, -5);
400+
const int deltaInc = (y > 0) ? 1 : -1;
401+
402+
// Save values before zoom for cursor-centered adjustment
403+
const PointF oldTriSize(triangleWidth, triangleHeight);
404+
const PointF mousePos(Cursor.pos);
405+
406+
if(!tryZoom(deltaTri, deltaInc, MapObj.get()))
407+
break;
408+
409+
// Keep the map point under the cursor stable after zoom
410+
DisplayRectangle dr = MapObj->getDisplayRect();
411+
const PointF ratio(triangleWidth / oldTriSize.x, triangleHeight / oldTriSize.y);
412+
const auto size = dr.getSize();
413+
const PointF newOrigin = (PointF(dr.getOrigin()) + mousePos) * ratio - mousePos;
414+
dr.left = static_cast<Sint32>(newOrigin.x);
415+
dr.top = static_cast<Sint32>(newOrigin.y);
416+
dr.right = dr.left + size.x;
417+
dr.bottom = dr.top + size.y;
418+
MapObj->setDisplayRect(dr);
419+
break;
420+
}
421+
387422
case SDL_WINDOWEVENT:
388423
{
389424
if(Event->window.event == SDL_WINDOWEVENT_RESIZED)

0 commit comments

Comments
 (0)