1
0
Fork 0

(svn r12953) -Feature: Open a new viewport when ctrl-clicking on a 'Location' button, a town/station/industry list, or some news items.

release/0.7
peter1138 2008-05-05 11:36:43 +00:00
parent 57e104f97e
commit 4595d2c3b1
9 changed files with 79 additions and 24 deletions

View File

@ -819,7 +819,13 @@ static void DepotWndProc(Window *w, WindowEvent *e)
} }
break; 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_STOP_ALL:
case DEPOT_WIDGET_START_ALL: case DEPOT_WIDGET_START_ALL:

View File

@ -92,7 +92,7 @@ void ShowEstimatedCostOrIncome(Money cost, int x, int y);
void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y); void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y);
void ShowSmallMap(); void ShowSmallMap();
void ShowExtraViewPortWindow(); void ShowExtraViewPortWindow(TileIndex tile = INVALID_TILE);
void SetVScrollCount(Window *w, int num); void SetVScrollCount(Window *w, int num);
void SetVScroll2Count(Window *w, int num); void SetVScroll2Count(Window *w, int num);
void SetHScrollCount(Window *w, int num); void SetHScrollCount(Window *w, int num);

View File

@ -568,7 +568,11 @@ static void IndustryViewWndProc(Window *w, WindowEvent *e)
} break; } break;
case IVW_GOTO: case IVW_GOTO:
i = GetIndustry(w->window_number); 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; } break;
} }
@ -853,7 +857,11 @@ static void IndustryDirectoryWndProc(Window *w, WindowEvent *e)
if (!IsInsideMM(y, 0, w->vscroll.cap)) return; if (!IsInsideMM(y, 0, w->vscroll.cap)) return;
p = y + w->vscroll.pos; p = y + w->vscroll.pos;
if (p < _num_industry_sort) { 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; } break;
} }

View File

@ -206,8 +206,15 @@ static void NewsWindowProc(Window *w, WindowEvent *e)
Vehicle *v = GetVehicle(ni->data_a); Vehicle *v = GetVehicle(ni->data_a);
ScrollMainWindowTo(v->x_pos, v->y_pos); ScrollMainWindowTo(v->x_pos, v->y_pos);
} else if (ni->flags & NF_TILE) { } else if (ni->flags & NF_TILE) {
if (!ScrollMainWindowToTile(ni->data_a) && ni->data_b != 0) { if (_ctrl_pressed) {
ScrollMainWindowToTile(ni->data_b); 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; break;

View File

@ -1270,7 +1270,11 @@ static void PlayerCompanyWndProc(Window *w, WindowEvent *e)
w->LowerWidget(PCW_WIDGET_BUILD_VIEW_HQ); w->LowerWidget(PCW_WIDGET_BUILD_VIEW_HQ);
w->InvalidateWidget(PCW_WIDGET_BUILD_VIEW_HQ); w->InvalidateWidget(PCW_WIDGET_BUILD_VIEW_HQ);
} else { } else {
ScrollMainWindowToTile(tile); if (_ctrl_pressed) {
ShowExtraViewPortWindow(tile);
} else {
ScrollMainWindowToTile(tile);
}
} }
break; break;
} }

View File

@ -1191,25 +1191,30 @@ static const WindowDesc _extra_view_port_desc = {
ExtraViewPortWndProc ExtraViewPortWndProc
}; };
void ShowExtraViewPortWindow() void ShowExtraViewPortWindow(TileIndex tile)
{ {
Window *w, *v;
int i = 0; int i = 0;
/* find next free window number for extra viewport */ /* find next free window number for extra viewport */
while (FindWindowById(WC_EXTRA_VIEW_PORT, i) != NULL) i++; 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) { if (w != NULL) {
int x, y; Point pt;
/* the main window with the main view */
v = FindWindowById(WC_MAIN_WINDOW, 0);
/* center on same place as main window (zoom is maximum, no adjustment needed) */ if (tile == INVALID_TILE) {
x = WP(v, vp_d).scrollpos_x; /* the main window with the main view */
y = WP(v, vp_d).scrollpos_y; const Window *v = FindWindowById(WC_MAIN_WINDOW, 0);
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; /* 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_x = WP(w, vp_d).scrollpos_x;
WP(w, vp_d).dest_scrollpos_y = WP(w, vp_d).scrollpos_y; WP(w, vp_d).dest_scrollpos_y = WP(w, vp_d).scrollpos_y;
} }

View File

@ -422,7 +422,12 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
const Station *st = sl->sort_list[id_v]; const Station *st = sl->sort_list[id_v];
/* do not check HasStationInUse - it is slow and may be invalid */ /* do not check HasStationInUse - it is slow and may be invalid */
assert(st->owner == owner || (st->owner == OWNER_NONE && !st->IsBuoy())); assert(st->owner == owner || (st->owner == OWNER_NONE && !st->IsBuoy()));
ScrollMainWindowToTile(st->xy);
if (_ctrl_pressed) {
ShowExtraViewPortWindow(st->xy);
} else {
ScrollMainWindowToTile(st->xy);
}
break; break;
} }
@ -936,7 +941,11 @@ static void StationViewWndProc(Window *w, WindowEvent *e)
break; break;
case SVW_LOCATION: 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; break;
case SVW_RATINGS: case SVW_RATINGS:

View File

@ -15,6 +15,7 @@
#include "date_func.h" #include "date_func.h"
#include "viewport_func.h" #include "viewport_func.h"
#include "gfx_func.h" #include "gfx_func.h"
#include "gui.h"
#include "table/strings.h" #include "table/strings.h"
@ -66,7 +67,9 @@ handle_click:
xy = GetIndustry(offs)->xy; 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 */ /* otherwise determine to coordinate for subsidy and scroll to it */
offs = s->to; offs = s->to;
if (s->age >= 12) { if (s->age >= 12) {
@ -76,7 +79,12 @@ handle_click:
} else { } else {
xy = GetIndustry(offs)->xy; xy = GetIndustry(offs)->xy;
} }
ScrollMainWindowToTile(xy);
if (_ctrl_pressed) {
ShowExtraViewPortWindow(xy);
} else {
ScrollMainWindowToTile(xy);
}
} }
} }

View File

@ -333,7 +333,11 @@ static void TownViewWndProc(Window *w, WindowEvent *e)
case WE_CLICK: case WE_CLICK:
switch (e->we.click.widget) { switch (e->we.click.widget) {
case TVW_CENTERVIEW: /* scroll to location */ case TVW_CENTERVIEW: /* scroll to location */
ScrollMainWindowToTile(t->xy); if (_ctrl_pressed) {
ShowExtraViewPortWindow(t->xy);
} else {
ScrollMainWindowToTile(t->xy);
}
break; break;
case TVW_SHOWAUTORITY: /* town authority */ case TVW_SHOWAUTORITY: /* town authority */
@ -541,7 +545,11 @@ static void TownDirectoryWndProc(Window *w, WindowEvent *e)
t = _town_sort[id_v]; t = _town_sort[id_v];
assert(t->xy); assert(t->xy);
ScrollMainWindowToTile(t->xy); if (_ctrl_pressed) {
ShowExtraViewPortWindow(t->xy);
} else {
ScrollMainWindowToTile(t->xy);
}
} break; } break;
} }
break; break;