From 4cf65e6e81796a3c21d7186fe3fdcff89939426f Mon Sep 17 00:00:00 2001 From: alberth Date: Sat, 6 Feb 2010 13:22:04 +0000 Subject: (svn r19042) -Add: Allow mousewheel zooming in smallmap. --- src/smallmap_gui.cpp | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 573752138..7955dc262 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -535,9 +535,11 @@ class SmallMapWindow : public Window { } /** Initialize or change the zoom level. - * @param change Way to change the zoom level. + * @param change Way to change the zoom level. + * @param zoom_pt Position to keep fixed while zooming. + * @pre \c *zoom_pt should contain a point in the smallmap display when zooming in or out. */ - void SetZoomLevel(ZoomLevelChange change) + void SetZoomLevel(ZoomLevelChange change, const Point *zoom_pt) { static const int zoomlevels[] = {1, 2, 4, 6, 8}; // Available zoom levels. Bigger number means more zoom-out (further away). static const int MIN_ZOOM_INDEX = 0; @@ -545,7 +547,6 @@ class SmallMapWindow : public Window { int new_index, cur_index, sub; Point tile; - const NWidgetBase *wid = this->GetWidget(SM_WIDGET_MAP); switch (change) { case ZLC_INITIALIZE: cur_index = - 1; // Definitely different from new_index. @@ -559,7 +560,7 @@ class SmallMapWindow : public Window { } assert(cur_index <= MAX_ZOOM_INDEX); - tile = this->PixelToTile(wid->current_x / 2, wid->current_y / 2, &sub); + tile = this->PixelToTile(zoom_pt->x, zoom_pt->y, &sub); new_index = Clamp(cur_index + ((change == ZLC_ZOOM_IN) ? -1 : 1), MIN_ZOOM_INDEX, MAX_ZOOM_INDEX); break; @@ -569,7 +570,7 @@ class SmallMapWindow : public Window { if (new_index != cur_index) { this->zoom = zoomlevels[new_index]; if (cur_index >= 0) { - Point new_tile = this->PixelToTile(wid->current_x / 2, wid->current_y / 2, &sub); + Point new_tile = this->PixelToTile(zoom_pt->x, zoom_pt->y, &sub); this->SetNewScroll(this->scroll_x + (tile.x - new_tile.x) * TILE_SIZE, this->scroll_y + (tile.y - new_tile.y) * TILE_SIZE, sub); } @@ -858,7 +859,7 @@ public: this->SetWidgetLoweredState(SM_WIDGET_TOGGLETOWNNAME, this->show_towns); this->GetWidget(SM_WIDGET_SELECTINDUSTRIES)->SetDisplayedPlane(this->map_type != SMT_INDUSTRY); - this->SetZoomLevel(ZLC_INITIALIZE); + this->SetZoomLevel(ZLC_INITIALIZE, NULL); this->SmallMapCenterOnCurrentPos(); } @@ -1033,12 +1034,12 @@ public: } break; case SM_WIDGET_ZOOM_IN: - this->SetZoomLevel(ZLC_ZOOM_IN); - break; - - case SM_WIDGET_ZOOM_OUT: - this->SetZoomLevel(ZLC_ZOOM_OUT); + case SM_WIDGET_ZOOM_OUT: { + const NWidgetBase *wid = this->GetWidget(SM_WIDGET_MAP); + Point pt = {wid->current_x / 2, wid->current_y / 2}; + this->SetZoomLevel((widget == SM_WIDGET_ZOOM_IN) ? ZLC_ZOOM_IN : ZLC_ZOOM_OUT, &pt); break; + } case SM_WIDGET_CONTOUR: // Show land contours case SM_WIDGET_VEHICLES: // Show vehicles @@ -1135,6 +1136,17 @@ public: } } + virtual void OnMouseWheel(int wheel) + { + const NWidgetBase *wid = this->GetWidget(SM_WIDGET_MAP); + int cursor_x = _cursor.pos.x - this->left - wid->pos_x; + int cursor_y = _cursor.pos.y - this->top - wid->pos_y; + if (IsInsideMM(cursor_x, 0, wid->current_x) && IsInsideMM(cursor_y, 0, wid->current_y)) { + Point pt = {cursor_x, cursor_y}; + this->SetZoomLevel((wheel < 0) ? ZLC_ZOOM_IN : ZLC_ZOOM_OUT, &pt); + } + } + virtual void OnTick() { /* Update the window every now and then */ -- cgit v1.2.3-54-g00ecf