mirror of https://github.com/OpenTTD/OpenTTD
(svn r153) -Feature: [1009710] Extra Viewport. In the minimap dropdown menu, open a new viewport to have a quick look at your favorite map-positions. Independent zoom and quick jump to/from viewport (Dribbel)
parent
4bf6ad1406
commit
4fec362b32
|
@ -185,6 +185,10 @@ void SetObjectToPlaceWnd(int icon, byte mode, Window *w);
|
|||
void SetObjectToPlace(int icon, byte mode, byte window_class, uint16 window_num);
|
||||
|
||||
void ResetObjectToPlace();
|
||||
|
||||
bool ScrollWindowToTile(TileIndex tile, Window * w);
|
||||
bool ScrollWindowTo(int x, int y, Window * w);
|
||||
|
||||
bool ScrollMainWindowToTile(TileIndex tile);
|
||||
bool ScrollMainWindowTo(int x, int y);
|
||||
void DrawSprite(uint32 img, int x, int y);
|
||||
|
@ -246,7 +250,6 @@ void ttd_strlcpy(char *dst, const char *src, size_t len);
|
|||
|
||||
// callback from drivers that is called if the game size changes dynamically
|
||||
void GameSizeChanged();
|
||||
void ZoomInOrOutToCursor(bool in);
|
||||
bool MakeScreenshot();
|
||||
bool MakeWorldScreenshot(int left, int top, int width, int height, int zoom);
|
||||
bool FileExists(const char *filename);
|
||||
|
|
3
gui.h
3
gui.h
|
@ -79,6 +79,7 @@ void DrawStationCoverageAreaText(int sx, int sy, uint mask);
|
|||
void CheckRedrawStationCoverage(Window *w);
|
||||
|
||||
void ShowSmallMap();
|
||||
void ShowExtraViewPortWindow();
|
||||
void SetVScrollCount(Window *w, int num);
|
||||
void SetHScrollCount(Window *w, int num);
|
||||
|
||||
|
@ -102,7 +103,7 @@ enum {
|
|||
ZOOM_NONE = 2, // hack, used to update the button status
|
||||
};
|
||||
|
||||
bool DoZoomInOut(int how);
|
||||
bool DoZoomInOutWindow(int how, Window * w);
|
||||
void ShowBuildIndustryWindow();
|
||||
void ShowQueryString(StringID str, StringID caption, int maxlen, int maxwidth, byte window_class, uint16 window_number);
|
||||
void ShowMusicWindow();
|
||||
|
|
|
@ -749,6 +749,13 @@ STR_02DB_OFF :{BLACK}Off
|
|||
STR_02DC_DISPLAY_SUBSIDIES :{BLACK}Display subsidies
|
||||
STR_02DD_SUBSIDIES :Subsidies
|
||||
STR_02DE_MAP_OF_WORLD :Map of world
|
||||
STR_EXTRA_VIEW_PORT :Extra viewport
|
||||
STR_EXTRA_VIEW_PORT_TITLE :{WHITE}Viewport {COMMA16}
|
||||
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Copy to viewport
|
||||
STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT :{BLACK}Copy the location of the global view to this viewport
|
||||
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Paste from viewport
|
||||
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Paste the location of this viewport to the global view
|
||||
|
||||
STR_02DF_TOWN_DIRECTORY :Town directory
|
||||
STR_02E0_CURRENCY_UNITS :{BLACK}Currency units
|
||||
STR_02E1 :{BLACK}{SKIP}{STRING}
|
||||
|
|
62
main_gui.c
62
main_gui.c
|
@ -152,6 +152,7 @@ void MenuClickMap(int index)
|
|||
{
|
||||
switch(index) {
|
||||
case 0: ShowSmallMap(); break;
|
||||
case 1: ShowExtraViewPortWindow(); break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -617,7 +618,7 @@ static void ToolbarSaveClick(Window *w)
|
|||
|
||||
static void ToolbarMapClick(Window *w)
|
||||
{
|
||||
PopupMainToolbMenu(w, 96, 4, STR_02DE_MAP_OF_WORLD, 1);
|
||||
PopupMainToolbMenu(w, 96, 4, STR_02DE_MAP_OF_WORLD, 2);
|
||||
}
|
||||
|
||||
static void ToolbarTownClick(Window *w)
|
||||
|
@ -696,10 +697,11 @@ static void ToolbarAirClick(Window *w)
|
|||
PopupMainPlayerToolbMenu(w, 376, 16, dis);
|
||||
}
|
||||
|
||||
bool DoZoomInOut(int how)
|
||||
/* Zooms a viewport in a window in or out */
|
||||
/* No button handling or what so ever */
|
||||
bool DoZoomInOutWindow(int how, Window *w)
|
||||
{
|
||||
ViewPort *vp;
|
||||
Window *w, *wt;
|
||||
int button;
|
||||
|
||||
switch(_game_mode) {
|
||||
|
@ -708,13 +710,9 @@ bool DoZoomInOut(int how)
|
|||
default: return false;
|
||||
}
|
||||
|
||||
w = FindWindowById(WC_MAIN_WINDOW, 0);
|
||||
assert(w);
|
||||
vp = w->viewport;
|
||||
|
||||
wt = FindWindowById(WC_MAIN_TOOLBAR, 0);
|
||||
assert(wt);
|
||||
|
||||
if (how == ZOOM_IN) {
|
||||
if (vp->zoom == 0) return false;
|
||||
vp->zoom--;
|
||||
|
@ -738,24 +736,40 @@ bool DoZoomInOut(int how)
|
|||
SetWindowDirty(w);
|
||||
}
|
||||
|
||||
// update the toolbar button too
|
||||
CLRBIT(wt->disabled_state, button);
|
||||
CLRBIT(wt->disabled_state, button + 1);
|
||||
if (vp->zoom == 0) SETBIT(wt->disabled_state, button);
|
||||
else if (vp->zoom == 2) SETBIT(wt->disabled_state, button + 1);
|
||||
SetWindowDirty(wt);
|
||||
// routine to disable/enable the zoom buttons. Didn't know where to place these otherwise
|
||||
{
|
||||
Window * wt;
|
||||
switch (w->window_class) {
|
||||
case WC_MAIN_WINDOW:
|
||||
wt = FindWindowById(WC_MAIN_TOOLBAR, 0);
|
||||
break;
|
||||
case WC_EXTRA_VIEW_PORT:
|
||||
wt = FindWindowById(WC_EXTRA_VIEW_PORT, w->window_number);
|
||||
button = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
assert(wt);
|
||||
|
||||
// update the toolbar button too
|
||||
CLRBIT(wt->disabled_state, button);
|
||||
CLRBIT(wt->disabled_state, button + 1);
|
||||
if (vp->zoom == 0) SETBIT(wt->disabled_state, button);
|
||||
else if (vp->zoom == 2) SETBIT(wt->disabled_state, button + 1);
|
||||
SetWindowDirty(wt);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void MaxZoomIn()
|
||||
{
|
||||
while (DoZoomInOut(ZOOM_IN)) {}
|
||||
while (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0) ) ) {}
|
||||
}
|
||||
|
||||
static void ToolbarZoomInClick(Window *w)
|
||||
{
|
||||
if (DoZoomInOut(ZOOM_IN)) {
|
||||
if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
|
||||
HandleButtonClick(w, 17);
|
||||
SndPlayFx(0x13);
|
||||
}
|
||||
|
@ -763,7 +777,7 @@ static void ToolbarZoomInClick(Window *w)
|
|||
|
||||
static void ToolbarZoomOutClick(Window *w)
|
||||
{
|
||||
if (DoZoomInOut(ZOOM_OUT)) {
|
||||
if (DoZoomInOutWindow(ZOOM_OUT,FindWindowById(WC_MAIN_WINDOW, 0))) {
|
||||
HandleButtonClick(w, 18);
|
||||
SndPlayFx(0x13);
|
||||
}
|
||||
|
@ -870,7 +884,7 @@ static void ToolbarScenMapTownDir(Window *w)
|
|||
|
||||
static void ToolbarScenZoomIn(Window *w)
|
||||
{
|
||||
if (DoZoomInOut(ZOOM_IN)) {
|
||||
if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
|
||||
HandleButtonClick(w, 9);
|
||||
SndPlayFx(0x13);
|
||||
}
|
||||
|
@ -878,19 +892,17 @@ static void ToolbarScenZoomIn(Window *w)
|
|||
|
||||
static void ToolbarScenZoomOut(Window *w)
|
||||
{
|
||||
if (DoZoomInOut(ZOOM_OUT)) {
|
||||
if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
|
||||
HandleButtonClick(w, 10);
|
||||
SndPlayFx(0x13);
|
||||
}
|
||||
}
|
||||
|
||||
void ZoomInOrOutToCursor(bool in)
|
||||
void ZoomInOrOutToCursorWindow(bool in, Window *w)
|
||||
{
|
||||
ViewPort * vp;
|
||||
Point pt;
|
||||
Window* w;
|
||||
ViewPort* vp;
|
||||
|
||||
w = FindWindowById(WC_MAIN_WINDOW, 0);
|
||||
assert(w != 0);
|
||||
|
||||
vp = w->viewport;
|
||||
|
@ -899,11 +911,11 @@ void ZoomInOrOutToCursor(bool in)
|
|||
if ((in && vp->zoom == 0) || (!in && vp->zoom == 2))
|
||||
return;
|
||||
|
||||
pt = GetTileZoomCenter(in);
|
||||
pt = GetTileZoomCenterWindow(in,w);
|
||||
if (pt.x != -1) {
|
||||
ScrollMainWindowTo(pt.x, pt.y);
|
||||
ScrollWindowTo(pt.x, pt.y, w);
|
||||
|
||||
DoZoomInOut(in ? ZOOM_IN : ZOOM_OUT);
|
||||
DoZoomInOutWindow(in ? ZOOM_IN : ZOOM_OUT, w);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "stdafx.h"
|
||||
#include "ttd.h"
|
||||
|
||||
#include "gui.h"
|
||||
#include "window.h"
|
||||
#include "gfx.h"
|
||||
#include "viewport.h"
|
||||
|
@ -996,3 +996,97 @@ void ShowSmallMap()
|
|||
{
|
||||
DoShowSmallMap(_smallmap_size);
|
||||
}
|
||||
|
||||
/* Extra ViewPort Window Stuff */
|
||||
static Widget _extra_view_port_widgets[] = {
|
||||
{ WWT_CLOSEBOX, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
||||
{ WWT_CAPTION, 14, 11, 299, 0, 13, STR_EXTRA_VIEW_PORT_TITLE, STR_018C_WINDOW_TITLE_DRAG_THIS},
|
||||
{ WWT_PANEL, 14, 0, 299, 14, 233, 0x0, 0},
|
||||
{ WWT_6, 14, 2, 297, 16, 231, 0, 0},
|
||||
{ WWT_PANEL, 14, 0, 21, 234, 255, 0x2DF, STR_017F_ZOOM_THE_VIEW_IN},
|
||||
{ WWT_PANEL, 14, 22, 43, 234, 255, 0x2E0, STR_0180_ZOOM_THE_VIEW_OUT},
|
||||
{ WWT_PUSHTXTBTN, 14, 44, 171, 234, 255, STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW, STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT},
|
||||
{ WWT_PUSHTXTBTN, 14, 172, 299, 234, 255, STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN, STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT},
|
||||
{ WWT_LAST},
|
||||
};
|
||||
|
||||
static void ExtraViewPortWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
ViewPort *vp = w->viewport;
|
||||
int button = 4;
|
||||
|
||||
switch(e->event) {
|
||||
case WE_PAINT: {
|
||||
// set the number in the title bar
|
||||
SET_DPARAM16(0, (w->window_number+1));
|
||||
|
||||
DrawWindowWidgets(w);
|
||||
DrawWindowViewport(w);
|
||||
} break;
|
||||
case WE_CLICK: {
|
||||
switch(e->click.widget) {
|
||||
case 4: { /* zoom in */
|
||||
DoZoomInOutWindow(ZOOM_IN,w);
|
||||
} break;
|
||||
|
||||
case 5: { /* zoom out */
|
||||
DoZoomInOutWindow(ZOOM_OUT,w);
|
||||
} break;
|
||||
|
||||
case 6: { /* location button (move main view to same spot as this view) */
|
||||
Window * w2 = FindWindowById(WC_MAIN_WINDOW, 0);
|
||||
int x = WP(w,vp_d).scrollpos_x; // Where is the main looking at
|
||||
int y = WP(w,vp_d).scrollpos_y;
|
||||
|
||||
// set this view to same location. Based on the center, adjusting for zoom
|
||||
WP(w2,vp_d).scrollpos_x = x - (w2->viewport->virtual_width - (294 <<vp->zoom) )/2;
|
||||
WP(w2,vp_d).scrollpos_y = y - (w2->viewport->virtual_height - (214 << vp->zoom) )/2;
|
||||
} break;
|
||||
case 7: { /* inverse location button (move this view to same spot as main view) */
|
||||
Window * w2 = FindWindowById(WC_MAIN_WINDOW, 0);
|
||||
int x = WP(w2,vp_d).scrollpos_x;
|
||||
int y = WP(w2,vp_d).scrollpos_y;
|
||||
|
||||
WP(w,vp_d).scrollpos_x = x + (w2->viewport->virtual_width - (294 <<vp->zoom) )/2;
|
||||
WP(w,vp_d).scrollpos_y = y + (w2->viewport->virtual_height - (214 << vp->zoom) )/2;
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
static const WindowDesc _extra_view_port_desc = {
|
||||
-1,-1, 300, 256,
|
||||
WC_EXTRA_VIEW_PORT,0,
|
||||
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
|
||||
_extra_view_port_widgets,
|
||||
ExtraViewPortWndProc
|
||||
};
|
||||
|
||||
void ShowExtraViewPortWindow()
|
||||
{
|
||||
Window *w, *v;
|
||||
int i = 0;
|
||||
|
||||
// find next free window number for extra viewport
|
||||
while (FindWindowById(WC_EXTRA_VIEW_PORT,i) ) {
|
||||
i++;
|
||||
}
|
||||
|
||||
w = AllocateWindowDescFront(&_extra_view_port_desc,i);
|
||||
if (w) {
|
||||
int x,y;
|
||||
// disable zoom in button
|
||||
w->disabled_state = 1 << 4;
|
||||
// the main window with the main view
|
||||
v = FindWindowById(WC_MAIN_WINDOW, 0);
|
||||
// New viewport start ats (zero,zero)
|
||||
AssignWindowViewport(w, 3, 17, 294, 214, 0 , 0);
|
||||
|
||||
// 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 - (294) )/2;
|
||||
WP(w,vp_d).scrollpos_y = y + (v->viewport->virtual_height - (214) )/2;
|
||||
}
|
||||
}
|
||||
|
|
2
ttd.c
2
ttd.c
|
@ -1141,7 +1141,7 @@ bool AfterLoadGame(uint version)
|
|||
if (!_players[0].is_active)
|
||||
DoStartupNewPlayer(false);
|
||||
|
||||
DoZoomInOut(ZOOM_NONE); // update button status
|
||||
DoZoomInOutWindow(ZOOM_NONE, w); // update button status
|
||||
MarkWholeScreenDirty();
|
||||
|
||||
return true;
|
||||
|
|
3
ttd.h
3
ttd.h
|
@ -393,8 +393,9 @@ enum {
|
|||
WC_INDUSTRY_DIRECTORY = 0x43,
|
||||
WC_MESSAGE_HISTORY = 0x44,
|
||||
WC_CHEATS = 0x45,
|
||||
WC_PERFORMANCE_DETAIL = 0x46,
|
||||
WC_PERFORMANCE_DETAIL = 0x46,
|
||||
WC_CONSOLE = 0x47,
|
||||
WC_EXTRA_VIEW_PORT = 0x48,
|
||||
};
|
||||
|
||||
|
||||
|
|
44
viewport.c
44
viewport.c
|
@ -312,19 +312,23 @@ Point GetTileBelowCursor()
|
|||
return GetTileFromScreenXY(_cursor.pos.x, _cursor.pos.y);
|
||||
}
|
||||
|
||||
Point GetTileZoomCenter(bool in)
|
||||
|
||||
Point GetTileZoomCenterWindow(bool in, Window * w)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
ViewPort * vp;
|
||||
|
||||
vp = w->viewport;
|
||||
|
||||
if (in) {
|
||||
x = (_cursor.pos.x >> 1) + (_screen.width >> 2);
|
||||
y = (_cursor.pos.y >> 1) + (_screen.height >> 2);
|
||||
x = ( (_cursor.pos.x - vp->left ) >> 1) + (vp->width >> 2);
|
||||
y = ( (_cursor.pos.y - vp->top ) >> 1) + (vp->height >> 2);
|
||||
}
|
||||
else {
|
||||
x = _screen.width - _cursor.pos.x;
|
||||
y = _screen.height - _cursor.pos.y;
|
||||
x = vp->width - (_cursor.pos.x - vp->left);
|
||||
y = vp->height - (_cursor.pos.y - vp->top);
|
||||
}
|
||||
return GetTileFromScreenXY(x, y);
|
||||
return GetTileFromScreenXY(x+vp->left, y+vp->top);
|
||||
}
|
||||
|
||||
void DrawGroundSpriteAt(uint32 image, int16 x, int16 y, byte z)
|
||||
|
@ -1708,6 +1712,32 @@ void PlaceObject()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* scrolls the viewport in a window to a given location */
|
||||
bool ScrollWindowTo(int x , int y, Window * w)
|
||||
{
|
||||
Point pt;
|
||||
|
||||
pt = MapXYZToViewport(w->viewport, x, y, GetSlopeZ(x, y));
|
||||
WP(w,vp_d).follow_vehicle = -1;
|
||||
|
||||
if (WP(w,vp_d).scrollpos_x == pt.x &&
|
||||
WP(w,vp_d).scrollpos_y == pt.y)
|
||||
return false;
|
||||
|
||||
WP(w,vp_d).scrollpos_x = pt.x;
|
||||
WP(w,vp_d).scrollpos_y = pt.y;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* scrolls the viewport in a window to a given tile */
|
||||
bool ScrollWindowToTile(TileIndex tile, Window * w)
|
||||
{
|
||||
return ScrollWindowTo(GET_TILE_X(tile)*16+8, GET_TILE_Y(tile)*16+8, w);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool ScrollMainWindowTo(int x, int y)
|
||||
{
|
||||
Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
|
||||
|
|
|
@ -18,7 +18,8 @@ void AssignWindowViewport(Window *w, int x, int y,
|
|||
void SetViewportPosition(Window *w, int x, int y);
|
||||
ViewPort *IsPtInWindowViewport(Window *w, int x, int y);
|
||||
Point GetTileBelowCursor();
|
||||
Point GetTileZoomCenter(bool in);
|
||||
void ZoomInOrOutToCursorWindow(bool in, Window * w);
|
||||
Point GetTileZoomCenterWindow(bool in, Window * w);
|
||||
void UpdateViewportPosition(Window *w);
|
||||
|
||||
void OffsetGroundSprite(int x, int y);
|
||||
|
|
10
window.c
10
window.c
|
@ -2,7 +2,7 @@
|
|||
#include "ttd.h"
|
||||
#include "window.h"
|
||||
#include "gfx.h"
|
||||
#include "viewport.h"
|
||||
#include "viewport.h"
|
||||
#include "console.h"
|
||||
|
||||
void HandleButtonClick(Window *w, byte widget)
|
||||
|
@ -574,7 +574,7 @@ Window *FindWindowFromPt(int x, int y)
|
|||
|
||||
|
||||
void InitWindowSystem()
|
||||
{
|
||||
{
|
||||
IConsoleClose();
|
||||
memset(&_windows, 0, sizeof(_windows));
|
||||
_last_window = _windows;
|
||||
|
@ -1021,7 +1021,7 @@ void MouseLoop()
|
|||
return;
|
||||
|
||||
if (mousewheel && !(w->flags4 & WF_DISABLE_VP_SCROLL)) {
|
||||
ZoomInOrOutToCursor(mousewheel < 0);
|
||||
ZoomInOrOutToCursorWindow(mousewheel < 0,w);
|
||||
}
|
||||
|
||||
if (click == 1) {
|
||||
|
@ -1206,8 +1206,8 @@ void RelocateAllWindows(int neww, int newh)
|
|||
vp->virtual_width = neww << vp->zoom;
|
||||
vp->virtual_height = newh << vp->zoom;
|
||||
continue; // don't modify top,left
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IConsoleResize();
|
||||
|
||||
if (w->window_class == WC_MAIN_TOOLBAR) {
|
||||
|
|
Loading…
Reference in New Issue