(svn r12953) -Feature: Open a new viewport when ctrl-clicking on a 'Location' button, a town/station/industry list, or some news items.
authorpeter1138
Mon, 05 May 2008 11:36:43 +0000
changeset 9094 48004fcef409
parent 9093 0ba1a30d757b
child 9095 cf3cb8e1b3ef
(svn r12953) -Feature: Open a new viewport when ctrl-clicking on a 'Location' button, a town/station/industry list, or some news items.
src/depot_gui.cpp
src/gui.h
src/industry_gui.cpp
src/news_gui.cpp
src/player_gui.cpp
src/smallmap_gui.cpp
src/station_gui.cpp
src/subsidy_gui.cpp
src/town_gui.cpp
--- a/src/depot_gui.cpp	Mon May 05 11:24:58 2008 +0000
+++ b/src/depot_gui.cpp	Mon May 05 11:36:43 2008 +0000
@@ -819,7 +819,13 @@
 					}
 						break;
 
-				case DEPOT_WIDGET_LOCATION: ScrollMainWindowToTile(w->window_number); break;
+				case DEPOT_WIDGET_LOCATION:
+					if (_ctrl_pressed) {
+						ShowExtraViewPortWindow(w->window_number);
+					} else {
+						ScrollMainWindowToTile(w->window_number);
+					}
+					break;
 
 				case DEPOT_WIDGET_STOP_ALL:
 				case DEPOT_WIDGET_START_ALL:
--- a/src/gui.h	Mon May 05 11:24:58 2008 +0000
+++ b/src/gui.h	Mon May 05 11:36:43 2008 +0000
@@ -92,7 +92,7 @@
 void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y);
 
 void ShowSmallMap();
-void ShowExtraViewPortWindow();
+void ShowExtraViewPortWindow(TileIndex tile = INVALID_TILE);
 void SetVScrollCount(Window *w, int num);
 void SetVScroll2Count(Window *w, int num);
 void SetHScrollCount(Window *w, int num);
--- a/src/industry_gui.cpp	Mon May 05 11:24:58 2008 +0000
+++ b/src/industry_gui.cpp	Mon May 05 11:36:43 2008 +0000
@@ -568,7 +568,11 @@
 		} break;
 		case IVW_GOTO:
 			i = GetIndustry(w->window_number);
-			ScrollMainWindowToTile(i->xy + TileDiffXY(1, 1));
+			if (_ctrl_pressed) {
+				ShowExtraViewPortWindow(i->xy + TileDiffXY(1, 1));
+			} else {
+				ScrollMainWindowToTile(i->xy + TileDiffXY(1, 1));
+			}
 		} break;
 
 		}
@@ -853,7 +857,11 @@
 				if (!IsInsideMM(y, 0, w->vscroll.cap)) return;
 				p = y + w->vscroll.pos;
 				if (p < _num_industry_sort) {
-					ScrollMainWindowToTile(_industry_sort[p]->xy);
+					if (_ctrl_pressed) {
+						ShowExtraViewPortWindow(_industry_sort[p]->xy);
+					} else {
+						ScrollMainWindowToTile(_industry_sort[p]->xy);
+					}
 				}
 			} break;
 		}
--- a/src/news_gui.cpp	Mon May 05 11:24:58 2008 +0000
+++ b/src/news_gui.cpp	Mon May 05 11:36:43 2008 +0000
@@ -206,8 +206,15 @@
 						Vehicle *v = GetVehicle(ni->data_a);
 						ScrollMainWindowTo(v->x_pos, v->y_pos);
 					} else if (ni->flags & NF_TILE) {
-						if (!ScrollMainWindowToTile(ni->data_a) && ni->data_b != 0) {
-							ScrollMainWindowToTile(ni->data_b);
+						if (_ctrl_pressed) {
+							ShowExtraViewPortWindow(ni->data_a);
+							if (ni->data_b != 0) {
+								ShowExtraViewPortWindow(ni->data_b);
+							}
+						} else {
+							if (!ScrollMainWindowToTile(ni->data_a) && ni->data_b != 0) {
+								ScrollMainWindowToTile(ni->data_b);
+							}
 						}
 					}
 					break;
--- a/src/player_gui.cpp	Mon May 05 11:24:58 2008 +0000
+++ b/src/player_gui.cpp	Mon May 05 11:36:43 2008 +0000
@@ -1270,7 +1270,11 @@
 						w->LowerWidget(PCW_WIDGET_BUILD_VIEW_HQ);
 						w->InvalidateWidget(PCW_WIDGET_BUILD_VIEW_HQ);
 					} else {
-						ScrollMainWindowToTile(tile);
+						if (_ctrl_pressed) {
+							ShowExtraViewPortWindow(tile);
+						} else {
+							ScrollMainWindowToTile(tile);
+						}
 					}
 					break;
 				}
--- a/src/smallmap_gui.cpp	Mon May 05 11:24:58 2008 +0000
+++ b/src/smallmap_gui.cpp	Mon May 05 11:36:43 2008 +0000
@@ -1191,25 +1191,30 @@
 	ExtraViewPortWndProc
 };
 
-void ShowExtraViewPortWindow()
+void ShowExtraViewPortWindow(TileIndex tile)
 {
-	Window *w, *v;
 	int i = 0;
 
 	/* find next free window number for extra viewport */
 	while (FindWindowById(WC_EXTRA_VIEW_PORT, i) != NULL) i++;
 
-	w = AllocateWindowDescFront(&_extra_view_port_desc, i);
+	Window *w = AllocateWindowDescFront(&_extra_view_port_desc, i);
 	if (w != NULL) {
-		int x, y;
-		/* the main window with the main view */
-		v = FindWindowById(WC_MAIN_WINDOW, 0);
+		Point pt;
 
-		/* center on same place as main window (zoom is maximum, no adjustment needed) */
-		x = WP(v, vp_d).scrollpos_x;
-		y = WP(v, vp_d).scrollpos_y;
-		WP(w, vp_d).scrollpos_x = x + (v->viewport->virtual_width  - (w->widget[4].right - w->widget[4].left) - 1) / 2;
-		WP(w, vp_d).scrollpos_y = y + (v->viewport->virtual_height - (w->widget[4].bottom - w->widget[4].top) - 1) / 2;
+		if (tile == INVALID_TILE) {
+			/* the main window with the main view */
+			const Window *v = FindWindowById(WC_MAIN_WINDOW, 0);
+
+			/* center on same place as main window (zoom is maximum, no adjustment needed) */
+			pt.x = WP(v, vp_d).scrollpos_x + v->viewport->virtual_height / 2;
+			pt.y = WP(v, vp_d).scrollpos_y + v->viewport->virtual_height / 2;
+		} else {
+			pt = RemapCoords(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, TileHeight(tile));
+		}
+
+		WP(w, vp_d).scrollpos_x = pt.x - ((w->widget[4].right - w->widget[4].left) - 1) / 2;
+		WP(w, vp_d).scrollpos_y = pt.y - ((w->widget[4].bottom - w->widget[4].top) - 1) / 2;
 		WP(w, vp_d).dest_scrollpos_x = WP(w, vp_d).scrollpos_x;
 		WP(w, vp_d).dest_scrollpos_y = WP(w, vp_d).scrollpos_y;
 	}
--- a/src/station_gui.cpp	Mon May 05 11:24:58 2008 +0000
+++ b/src/station_gui.cpp	Mon May 05 11:36:43 2008 +0000
@@ -422,7 +422,12 @@
 					const Station *st = sl->sort_list[id_v];
 					/* do not check HasStationInUse - it is slow and may be invalid */
 					assert(st->owner == owner || (st->owner == OWNER_NONE && !st->IsBuoy()));
-					ScrollMainWindowToTile(st->xy);
+
+					if (_ctrl_pressed) {
+						ShowExtraViewPortWindow(st->xy);
+					} else {
+						ScrollMainWindowToTile(st->xy);
+					}
 					break;
 				}
 
@@ -936,7 +941,11 @@
 					break;
 
 				case SVW_LOCATION:
-					ScrollMainWindowToTile(GetStation(w->window_number)->xy);
+					if (_ctrl_pressed) {
+						ShowExtraViewPortWindow(GetStation(w->window_number)->xy);
+					} else {
+						ScrollMainWindowToTile(GetStation(w->window_number)->xy);
+					}
 					break;
 
 				case SVW_RATINGS:
--- a/src/subsidy_gui.cpp	Mon May 05 11:24:58 2008 +0000
+++ b/src/subsidy_gui.cpp	Mon May 05 11:36:43 2008 +0000
@@ -15,6 +15,7 @@
 #include "date_func.h"
 #include "viewport_func.h"
 #include "gfx_func.h"
+#include "gui.h"
 
 #include "table/strings.h"
 
@@ -66,7 +67,9 @@
 		xy = GetIndustry(offs)->xy;
 	}
 
-	if (!ScrollMainWindowToTile(xy)) {
+	if (_ctrl_pressed || !ScrollMainWindowToTile(xy)) {
+		if (_ctrl_pressed) ShowExtraViewPortWindow(xy);
+
 		/* otherwise determine to coordinate for subsidy and scroll to it */
 		offs = s->to;
 		if (s->age >= 12) {
@@ -76,7 +79,12 @@
 		} else {
 			xy = GetIndustry(offs)->xy;
 		}
-		ScrollMainWindowToTile(xy);
+
+		if (_ctrl_pressed) {
+			ShowExtraViewPortWindow(xy);
+		} else {
+			ScrollMainWindowToTile(xy);
+		}
 	}
 }
 
--- a/src/town_gui.cpp	Mon May 05 11:24:58 2008 +0000
+++ b/src/town_gui.cpp	Mon May 05 11:36:43 2008 +0000
@@ -333,7 +333,11 @@
 		case WE_CLICK:
 			switch (e->we.click.widget) {
 				case TVW_CENTERVIEW: /* scroll to location */
-					ScrollMainWindowToTile(t->xy);
+					if (_ctrl_pressed) {
+						ShowExtraViewPortWindow(t->xy);
+					} else {
+						ScrollMainWindowToTile(t->xy);
+					}
 					break;
 
 				case TVW_SHOWAUTORITY: /* town authority */
@@ -541,7 +545,11 @@
 
 					t = _town_sort[id_v];
 					assert(t->xy);
-					ScrollMainWindowToTile(t->xy);
+					if (_ctrl_pressed) {
+						ShowExtraViewPortWindow(t->xy);
+					} else {
+						ScrollMainWindowToTile(t->xy);
+					}
 				} break;
 			}
 			break;