00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "stdafx.h"
00013 #include "landscape.h"
00014 #include "window_gui.h"
00015 #include "viewport_func.h"
00016 #include "strings_func.h"
00017 #include "zoom_func.h"
00018 #include "window_func.h"
00019
00020 #include "widgets/viewport_widget.h"
00021
00022 #include "table/strings.h"
00023 #include "table/sprites.h"
00024
00025
00026
00027 static const NWidgetPart _nested_extra_view_port_widgets[] = {
00028 NWidget(NWID_HORIZONTAL),
00029 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
00030 NWidget(WWT_CAPTION, COLOUR_GREY, WID_EV_CAPTION), SetDataTip(STR_EXTRA_VIEW_PORT_TITLE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
00031 NWidget(WWT_SHADEBOX, COLOUR_GREY),
00032 NWidget(WWT_STICKYBOX, COLOUR_GREY),
00033 EndContainer(),
00034 NWidget(WWT_PANEL, COLOUR_GREY),
00035 NWidget(NWID_VIEWPORT, INVALID_COLOUR, WID_EV_VIEWPORT), SetPadding(2, 2, 2, 2), SetResize(1, 1), SetFill(1, 1),
00036 EndContainer(),
00037 NWidget(NWID_HORIZONTAL),
00038 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_EV_ZOOM_IN), SetDataTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
00039 NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_EV_ZOOM_OUT), SetDataTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
00040 NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
00041 NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_EV_MAIN_TO_VIEW), SetFill(1, 1), SetResize(1, 0),
00042 SetDataTip(STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW, STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT),
00043 NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_EV_VIEW_TO_MAIN), SetFill(1, 1), SetResize(1, 0),
00044 SetDataTip(STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN, STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT),
00045 EndContainer(),
00046 EndContainer(),
00047 NWidget(NWID_HORIZONTAL),
00048 NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 0), EndContainer(),
00049 NWidget(WWT_RESIZEBOX, COLOUR_GREY),
00050 EndContainer(),
00051 };
00052
00053 class ExtraViewportWindow : public Window {
00054 public:
00055 ExtraViewportWindow(const WindowDesc *desc, int window_number, TileIndex tile) : Window()
00056 {
00057 this->InitNested(desc, window_number);
00058
00059 NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_EV_VIEWPORT);
00060 nvp->InitializeViewport(this, 0, ZOOM_LVL_VIEWPORT);
00061 if (_settings_client.gui.zoom_min == ZOOM_LVL_VIEWPORT) this->DisableWidget(WID_EV_ZOOM_IN);
00062
00063 Point pt;
00064 if (tile == INVALID_TILE) {
00065
00066 const Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
00067
00068
00069 pt.x = w->viewport->scrollpos_x + w->viewport->virtual_width / 2;
00070 pt.y = w->viewport->scrollpos_y + w->viewport->virtual_height / 2;
00071 } else {
00072 pt = RemapCoords(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, TileHeight(tile));
00073 }
00074
00075 this->viewport->scrollpos_x = pt.x - this->viewport->virtual_width / 2;
00076 this->viewport->scrollpos_y = pt.y - this->viewport->virtual_height / 2;
00077 this->viewport->dest_scrollpos_x = this->viewport->scrollpos_x;
00078 this->viewport->dest_scrollpos_y = this->viewport->scrollpos_y;
00079 }
00080
00081 virtual void SetStringParameters(int widget) const
00082 {
00083 switch (widget) {
00084 case WID_EV_CAPTION:
00085
00086 SetDParam(0, this->window_number + 1);
00087 break;
00088 }
00089 }
00090
00091 virtual void OnClick(Point pt, int widget, int click_count)
00092 {
00093 switch (widget) {
00094 case WID_EV_ZOOM_IN: DoZoomInOutWindow(ZOOM_IN, this); break;
00095 case WID_EV_ZOOM_OUT: DoZoomInOutWindow(ZOOM_OUT, this); break;
00096
00097 case WID_EV_MAIN_TO_VIEW: {
00098 Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
00099 int x = this->viewport->scrollpos_x;
00100 int y = this->viewport->scrollpos_y;
00101
00102
00103 w->viewport->dest_scrollpos_x = x - (w->viewport->virtual_width - this->viewport->virtual_width) / 2;
00104 w->viewport->dest_scrollpos_y = y - (w->viewport->virtual_height - this->viewport->virtual_height) / 2;
00105 w->viewport->follow_vehicle = INVALID_VEHICLE;
00106 break;
00107 }
00108
00109 case WID_EV_VIEW_TO_MAIN: {
00110 const Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
00111 int x = w->viewport->scrollpos_x;
00112 int y = w->viewport->scrollpos_y;
00113
00114 this->viewport->dest_scrollpos_x = x + (w->viewport->virtual_width - this->viewport->virtual_width) / 2;
00115 this->viewport->dest_scrollpos_y = y + (w->viewport->virtual_height - this->viewport->virtual_height) / 2;
00116 break;
00117 }
00118 }
00119 }
00120
00121 virtual void OnResize()
00122 {
00123 if (this->viewport != NULL) {
00124 NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_EV_VIEWPORT);
00125 nvp->UpdateViewportCoordinates(this);
00126 }
00127 }
00128
00129 virtual void OnScroll(Point delta)
00130 {
00131 this->viewport->scrollpos_x += ScaleByZoom(delta.x, this->viewport->zoom);
00132 this->viewport->scrollpos_y += ScaleByZoom(delta.y, this->viewport->zoom);
00133 this->viewport->dest_scrollpos_x = this->viewport->scrollpos_x;
00134 this->viewport->dest_scrollpos_y = this->viewport->scrollpos_y;
00135 }
00136
00137 virtual void OnMouseWheel(int wheel)
00138 {
00139 if (_settings_client.gui.scrollwheel_scrolling == 0) {
00140 ZoomInOrOutToCursorWindow(wheel < 0, this);
00141 }
00142 }
00143
00149 virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
00150 {
00151 if (!gui_scope) return;
00152
00153 HandleZoomMessage(this, this->viewport, WID_EV_ZOOM_IN, WID_EV_ZOOM_OUT);
00154 }
00155 };
00156
00157 static const WindowDesc _extra_view_port_desc(
00158 WDP_AUTO, 300, 268,
00159 WC_EXTRA_VIEW_PORT, WC_NONE,
00160 WDF_UNCLICK_BUTTONS,
00161 _nested_extra_view_port_widgets, lengthof(_nested_extra_view_port_widgets)
00162 );
00163
00168 void ShowExtraViewPortWindow(TileIndex tile)
00169 {
00170 int i = 0;
00171
00172
00173 while (FindWindowById(WC_EXTRA_VIEW_PORT, i) != NULL) i++;
00174
00175 new ExtraViewportWindow(&_extra_view_port_desc, i, tile);
00176 }
00177
00183 void ShowExtraViewPortWindowForTileUnderCursor()
00184 {
00185
00186
00187 Point pt = GetTileBelowCursor();
00188 ShowExtraViewPortWindow(pt.x != -1 ? TileVirtXY(pt.x, pt.y) : INVALID_TILE);
00189 }