summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordarkvater <darkvater@openttd.org>2004-09-03 19:59:05 +0000
committerdarkvater <darkvater@openttd.org>2004-09-03 19:59:05 +0000
commit4fec362b32801648da47340a127908643ef9cb5d (patch)
tree3520ffc76fe6adcce29cac5bbd06de35ff5f53a5
parent4bf6ad14061c9ee57518aa0b5f56163e2624a648 (diff)
downloadopenttd-4fec362b32801648da47340a127908643ef9cb5d.tar.xz
(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)
-rw-r--r--functions.h5
-rw-r--r--gui.h3
-rw-r--r--lang/english.txt7
-rw-r--r--main_gui.c62
-rw-r--r--smallmap_gui.c96
-rw-r--r--ttd.c2
-rw-r--r--ttd.h3
-rw-r--r--viewport.c44
-rw-r--r--viewport.h3
-rw-r--r--window.c10
10 files changed, 192 insertions, 43 deletions
diff --git a/functions.h b/functions.h
index 7c39c8a31..9cb23d52a 100644
--- a/functions.h
+++ b/functions.h
@@ -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);
diff --git a/gui.h b/gui.h
index 16077cd7e..394d20c4b 100644
--- a/gui.h
+++ b/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();
diff --git a/lang/english.txt b/lang/english.txt
index cb716832c..74fb6d45b 100644
--- a/lang/english.txt
+++ b/lang/english.txt
@@ -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}
diff --git a/main_gui.c b/main_gui.c
index ca753db19..77777725d 100644
--- a/main_gui.c
+++ b/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);
}
}
}
diff --git a/smallmap_gui.c b/smallmap_gui.c
index f5aa0551d..3dcc370ec 100644
--- a/smallmap_gui.c
+++ b/smallmap_gui.c
@@ -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;
+ }
+}
diff --git a/ttd.c b/ttd.c
index 5385aa593..ec0c4f910 100644
--- a/ttd.c
+++ b/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;
diff --git a/ttd.h b/ttd.h
index 190651794..325292c16 100644
--- a/ttd.h
+++ b/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,
};
diff --git a/viewport.c b/viewport.c
index a1d6614ed..60a637671 100644
--- a/viewport.c
+++ b/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);
diff --git a/viewport.h b/viewport.h
index c076f272f..737c7912b 100644
--- a/viewport.h
+++ b/viewport.h
@@ -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);
diff --git a/window.c b/window.c
index e0450867d..a04d276d9 100644
--- a/window.c
+++ b/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) {