(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)

pull/155/head
darkvater 20 years ago
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);

@ -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}

@ -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;
}
}

@ -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;

@ -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,
};

@ -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);

@ -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…
Cancel
Save