summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/viewport.cpp12
-rw-r--r--src/viewport_func.h1
-rw-r--r--src/waypoint_gui.cpp24
3 files changed, 29 insertions, 8 deletions
diff --git a/src/viewport.cpp b/src/viewport.cpp
index 6469b10c5..c41c2d309 100644
--- a/src/viewport.cpp
+++ b/src/viewport.cpp
@@ -1887,6 +1887,18 @@ bool ScrollWindowTo(int x, int y, int z, Window *w, bool instant)
}
/**
+ * Scrolls the viewport in a window to a given location.
+ * @param tile Desired tile to center on.
+ * @param w %Window containing the viewport.
+ * @param instant Jump to the location instead of slowly moving to it.
+ * @return Destination of the viewport was changed (to activate other actions when the viewport is already at the desired position).
+ */
+bool ScrollWindowToTile(TileIndex tile, Window *w, bool instant)
+{
+ return ScrollWindowTo(TileX(tile) * TILE_SIZE, TileY(tile) * TILE_SIZE, -1, w, instant);
+}
+
+/**
* Scrolls the viewport of the main window to a given location.
* @param tile Desired tile to center on.
* @param instant Jump to the location instead of slowly moving to it.
diff --git a/src/viewport_func.h b/src/viewport_func.h
index 1e3c77107..cc90a93b2 100644
--- a/src/viewport_func.h
+++ b/src/viewport_func.h
@@ -64,6 +64,7 @@ void SetTileSelectBigSize(int ox, int oy, int sx, int sy);
void ViewportDoDraw(const ViewPort *vp, int left, int top, int right, int bottom);
+bool ScrollWindowToTile(TileIndex tile, Window *w, bool instant = false);
bool ScrollWindowTo(int x, int y, int z, Window *w, bool instant = false);
bool ScrollMainWindowToTile(TileIndex tile, bool instant = false);
diff --git a/src/waypoint_gui.cpp b/src/waypoint_gui.cpp
index 71c96b7fb..c6e84d21b 100644
--- a/src/waypoint_gui.cpp
+++ b/src/waypoint_gui.cpp
@@ -34,10 +34,20 @@ enum WaypointWindowWidgets {
WAYPVW_SHOW_VEHICLES,
};
+/** GUI for accessing waypoints and buoys. */
struct WaypointWindow : Window {
private:
- VehicleType vt;
- Waypoint *wp;
+ VehicleType vt; ///< Vehicle type using the waypoint.
+ Waypoint *wp; ///< Waypoint displayed by the window.
+
+ /**
+ * Get the center tile of the waypoint.
+ * @return The center tile if the waypoint exists, otherwise the tile with the waypoint name.
+ */
+ TileIndex GetCenterTile() const
+ {
+ return this->wp->IsInUse() ? this->wp->train_station.GetCenterTile() : this->wp->xy;
+ }
public:
WaypointWindow(const WindowDesc *desc, WindowNumber window_number) : Window()
@@ -57,7 +67,7 @@ public:
this->flags4 |= WF_DISABLE_VP_SCROLL;
NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WAYPVW_VIEWPORT);
- nvp->InitializeViewport(this, this->wp->xy, ZOOM_LVL_MIN);
+ nvp->InitializeViewport(this, this->GetCenterTile(), ZOOM_LVL_MIN);
this->OnInvalidateData(0);
}
@@ -84,9 +94,9 @@ public:
switch (widget) {
case WAYPVW_CENTERVIEW: // scroll to location
if (_ctrl_pressed) {
- ShowExtraViewPortWindow(this->wp->xy);
+ ShowExtraViewPortWindow(this->GetCenterTile());
} else {
- ScrollMainWindowToTile(this->wp->xy);
+ ScrollMainWindowToTile(this->GetCenterTile());
}
break;
@@ -108,9 +118,7 @@ public:
/* Disable the widget for waypoints with no use */
this->SetWidgetDisabledState(WAYPVW_SHOW_VEHICLES, !this->wp->IsInUse());
- int x = TileX(this->wp->xy) * TILE_SIZE;
- int y = TileY(this->wp->xy) * TILE_SIZE;
- ScrollWindowTo(x, y, -1, this, true);
+ ScrollWindowToTile(this->GetCenterTile(), this, true);
}
virtual void OnResize()