From 12a7e2fde0b53f8d3042f3ee248522e921b80d72 Mon Sep 17 00:00:00 2001 From: frosch Date: Sun, 17 Oct 2010 13:54:05 +0000 Subject: (svn r20962) -Fix [FS#4166](r20956): Determine tile under cursor before opening the new viewport. It might appear just below the cursor. --- src/gui.h | 1 + src/toolbar_gui.cpp | 4 ++-- src/viewport_gui.cpp | 24 ++++++++++++++++++------ 3 files changed, 21 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/gui.h b/src/gui.h index f896a290c..4385af452 100644 --- a/src/gui.h +++ b/src/gui.h @@ -66,6 +66,7 @@ enum WarningLevel { void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x = 0, int y = 0); void ShowExtraViewPortWindow(TileIndex tile = INVALID_TILE); +void ShowExtraViewPortWindowForTileUnderCursor(); /* bridge_gui.cpp */ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte bridge_type); diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 98a27dcbf..6b2d0876f 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -1343,7 +1343,7 @@ struct MainToolbarWindow : Window { case MTHK_GIANT_SCREENSHOT: MenuClickWorldScreenshot(); break; case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break; case MTHK_TERRAFORM: ShowTerraformToolbar(); break; - case MTHK_EXTRA_VIEWPORT: ShowExtraViewPortWindow(); break; + case MTHK_EXTRA_VIEWPORT: ShowExtraViewPortWindowForTileUnderCursor(); break; #ifdef ENABLE_NETWORK case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break; #endif @@ -1645,7 +1645,7 @@ public: case MTEHK_ZOOM_OUT: ToolbarZoomOutClick(this); break; case MTEHK_TERRAFORM: ShowEditorTerraformToolbar(); break; case MTEHK_SMALLMAP: ShowSmallMap(); break; - case MTEHK_EXTRA_VIEWPORT: ShowExtraViewPortWindow(); break; + case MTEHK_EXTRA_VIEWPORT: ShowExtraViewPortWindowForTileUnderCursor(); break; default: return ES_NOT_HANDLED; } return ES_HANDLED; diff --git a/src/viewport_gui.cpp b/src/viewport_gui.cpp index 1a919fe10..9d74a3369 100644 --- a/src/viewport_gui.cpp +++ b/src/viewport_gui.cpp @@ -71,12 +71,7 @@ public: Point pt; if (tile == INVALID_TILE) { - /* Use tile under mouse as center for new viewport */ - Point pt = GetTileBelowCursor(); - if (pt.x != -1) tile = TileVirtXY(pt.x, pt.y); - } - if (tile == INVALID_TILE) { - /* Still no tile? Use center of main viewport. */ + /* No tile? Use center of main viewport. */ const Window *w = FindWindowById(WC_MAIN_WINDOW, 0); /* center on same place as main window (zoom is maximum, no adjustment needed) */ @@ -175,6 +170,10 @@ static const WindowDesc _extra_view_port_desc( _nested_extra_view_port_widgets, lengthof(_nested_extra_view_port_widgets) ); +/** + * Show a new Extra Viewport window. + * @param tile Tile to center the view on. INVALID_TILE means to use the center of main viewport. + */ void ShowExtraViewPortWindow(TileIndex tile) { int i = 0; @@ -184,3 +183,16 @@ void ShowExtraViewPortWindow(TileIndex tile) new ExtraViewportWindow(&_extra_view_port_desc, i, tile); } + +/** + * Show a new Extra Viewport window. + * Center it on the tile under the cursor, if the cursor is inside a viewport. + * If that fails, center it on main viewport center. + */ +void ShowExtraViewPortWindowForTileUnderCursor() +{ + /* Use tile under mouse as center for new viewport. + * Do this before creating the window, it might appear just below the mouse. */ + Point pt = GetTileBelowCursor(); + ShowExtraViewPortWindow(pt.x != -1 ? TileVirtXY(pt.x, pt.y) : INVALID_TILE); +} -- cgit v1.2.3-70-g09d2