diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj
index 006c69fbf2..e30657dbc7 100644
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -1867,6 +1867,10 @@
RelativePath=".\..\src\vehicle_gui.cpp"
>
+
+
+
+
index;
-
- /* Are we allowed to change the name of the waypoint? */
- if (!CheckTileOwnership(wp->xy)) {
- ShowErrorMessage(_error_message, STR_CANT_CHANGE_WAYPOINT_NAME,
- TileX(wp->xy) * TILE_SIZE, TileY(wp->xy) * TILE_SIZE);
- return;
- }
-
- _rename_id = id;
- _rename_what = 1;
- SetDParam(0, id);
- ShowQueryString(STR_WAYPOINT_RAW, STR_EDIT_WAYPOINT_NAME, MAX_LENGTH_WAYPOINT_NAME_BYTES, MAX_LENGTH_WAYPOINT_NAME_PIXELS, NULL, CS_ALPHANUMERAL);
-}
-
/* Zooms a viewport in a window in or out */
/* No button handling or what so ever */
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index 26b24da8b1..2b5227c034 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -2307,8 +2307,8 @@ static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode,
static void ClickTile_Track(TileIndex tile)
{
switch (GetRailTileType(tile)) {
- case RAIL_TILE_DEPOT: ShowDepotWindow(tile, VEH_TRAIN); break;
- case RAIL_TILE_WAYPOINT: ShowRenameWaypointWindow(GetWaypointByTile(tile)); break;
+ case RAIL_TILE_DEPOT: ShowDepotWindow(tile, VEH_TRAIN); break;
+ case RAIL_TILE_WAYPOINT: ShowWaypointWindow(GetWaypointByTile(tile)); break;
default: break;
}
}
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp
index 84ff470b9e..d2e2626663 100644
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -789,6 +789,7 @@ struct VehicleListWindow : public Window, public VehicleListBase {
case VLW_SHARED_ORDERS:
this->widget[VLW_WIDGET_CAPTION].data = STR_VEH_WITH_SHARED_ORDERS_LIST;
break;
+
case VLW_STANDARD: /* Company Name - standard widget setup */
switch (this->vehicle_type) {
case VEH_TRAIN: this->widget[VLW_WIDGET_CAPTION].data = STR_881B_TRAINS; break;
@@ -798,6 +799,11 @@ struct VehicleListWindow : public Window, public VehicleListBase {
default: NOT_REACHED(); break;
}
break;
+
+ case VLM_WAYPOINT_LIST:
+ this->widget[VLW_WIDGET_CAPTION].data = STR_WAYPOINT_VIEWPORT;
+ break;
+
case VLW_STATION_LIST: /* Station Name */
switch (this->vehicle_type) {
case VEH_TRAIN: this->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_TRAINS; break;
@@ -893,6 +899,10 @@ struct VehicleListWindow : public Window, public VehicleListBase {
SetDParam(1, this->vscroll.count);
break;
+ case VLM_WAYPOINT_LIST:
+ SetDParam(0, index);
+ break;
+
case VLW_STATION_LIST: /* Station Name */
SetDParam(0, index);
SetDParam(1, this->vscroll.count);
@@ -1167,6 +1177,12 @@ void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type)
}
}
+void ShowVehicleListWindow(const Waypoint *wp)
+{
+ if (wp == NULL) return;
+ ShowVehicleListWindowLocal(GetTileOwner(wp->xy), VLM_WAYPOINT_LIST, VEH_TRAIN, wp->index);
+}
+
void ShowVehicleListWindow(const Vehicle *v)
{
ShowVehicleListWindowLocal(v->owner, VLW_SHARED_ORDERS, v->type, v->FirstShared()->index);
diff --git a/src/vehicle_gui.h b/src/vehicle_gui.h
index 43a99c9194..a6c35cdc76 100644
--- a/src/vehicle_gui.h
+++ b/src/vehicle_gui.h
@@ -11,6 +11,7 @@
#include "order_type.h"
#include "station_type.h"
#include "engine_type.h"
+#include "waypoint.h"
void DrawVehicleProfitButton(const Vehicle *v, int x, int y);
void ShowVehicleRefitWindow(const Vehicle *v, VehicleOrderID order);
@@ -51,6 +52,7 @@ enum {
VLW_STATION_LIST = 2 << 8,
VLW_DEPOT_LIST = 3 << 8,
VLW_GROUP_LIST = 4 << 8,
+ VLM_WAYPOINT_LIST = 5 << 8,
VLW_MASK = 0x700,
};
@@ -72,6 +74,7 @@ uint ShowAdditionalText(int x, int y, uint w, EngineID engine);
uint ShowRefitOptionsList(int x, int y, uint w, EngineID engine);
void ShowVehicleListWindow(const Vehicle *v);
+void ShowVehicleListWindow(const Waypoint *wp);
void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type);
void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type, StationID station);
void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type, TileIndex depot_tile);
diff --git a/src/vehiclelist.cpp b/src/vehiclelist.cpp
index 2341a31ada..14798b6558 100644
--- a/src/vehiclelist.cpp
+++ b/src/vehiclelist.cpp
@@ -67,6 +67,7 @@ void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engine
* VLW_STANDARD: not used
* VLW_DEPOT_LIST: TileIndex of the depot/hangar to make the list for
* VLW_GROUP_LIST: index of group to generate a list for
+ * VLM_WAYPOINT_LIST: index of waypoint to generate a list for
*
* @param window_type The type of window the list is for, using the VLW_ flags in vehicle_gui.h
*/
@@ -122,6 +123,21 @@ void GenerateVehicleSortList(VehicleList *list, VehicleType type, PlayerID owner
}
break;
+ case VLM_WAYPOINT_LIST:
+ FOR_ALL_VEHICLES(v) {
+ if (v->type == type && v->IsPrimaryVehicle()) {
+ const Order *order;
+
+ FOR_VEHICLE_ORDERS(v, order) {
+ if (order->IsType(OT_GOTO_WAYPOINT) && order->GetDestination() == index) {
+ *list->Append() = v;
+ break;
+ }
+ }
+ }
+ }
+ break;
+
case VLW_GROUP_LIST:
FOR_ALL_VEHICLES(v) {
if (v->type == type && v->IsPrimaryVehicle() &&
diff --git a/src/viewport.cpp b/src/viewport.cpp
index 552ccf1778..9e54e21d73 100644
--- a/src/viewport.cpp
+++ b/src/viewport.cpp
@@ -1934,7 +1934,7 @@ static bool CheckClickOnWaypoint(const ViewPort *vp, int x, int y)
y < wp->sign.top + 12 &&
x >= wp->sign.left &&
x < wp->sign.left + wp->sign.width_1) {
- ShowRenameWaypointWindow(wp);
+ ShowWaypointWindow(wp);
return true;
}
}
@@ -1948,7 +1948,7 @@ static bool CheckClickOnWaypoint(const ViewPort *vp, int x, int y)
y < wp->sign.top + 24 &&
x >= wp->sign.left &&
x < wp->sign.left + wp->sign.width_1 * 2) {
- ShowRenameWaypointWindow(wp);
+ ShowWaypointWindow(wp);
return true;
}
}
@@ -1964,7 +1964,7 @@ static bool CheckClickOnWaypoint(const ViewPort *vp, int x, int y)
y < wp->sign.top + ScaleByZoom(12, vp->zoom) &&
x >= wp->sign.left &&
x < wp->sign.left + ScaleByZoom(wp->sign.width_2, vp->zoom)) {
- ShowRenameWaypointWindow(wp);
+ ShowWaypointWindow(wp);
return true;
}
}
diff --git a/src/waypoint.h b/src/waypoint.h
index 36014f7cad..ee664e6056 100644
--- a/src/waypoint.h
+++ b/src/waypoint.h
@@ -65,7 +65,7 @@ static inline Waypoint *GetWaypointByTile(TileIndex tile)
CommandCost RemoveTrainWaypoint(TileIndex tile, uint32 flags, bool justremove);
Station *ComposeWaypointStation(TileIndex tile);
-void ShowRenameWaypointWindow(const Waypoint *cp);
+void ShowWaypointWindow(const Waypoint *wp);
void DrawWaypointSprite(int x, int y, int stat_id, RailType railtype);
void FixOldWaypoints();
void UpdateAllWaypointSigns();
diff --git a/src/waypoints_gui.cpp b/src/waypoints_gui.cpp
new file mode 100644
index 0000000000..bf95ee8d15
--- /dev/null
+++ b/src/waypoints_gui.cpp
@@ -0,0 +1,111 @@
+/* $Id$ */
+
+/** @file waypoint_gui.cpp Handling of waypoints gui. */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "window_gui.h"
+#include "gui.h"
+#include "textbuf_gui.h"
+#include "vehicle_gui.h"
+#include "waypoint.h"
+#include "viewport_func.h"
+#include "string_func.h"
+#include "strings_func.h"
+#include "gfx_func.h"
+#include "command_func.h"
+#include "functions.h"
+
+#include "table/strings.h"
+
+struct WaypointWindow : Window {
+private:
+ Waypoint *wp;
+
+ enum WaypointViewWidget {
+ WAYPVW_CLOSEBOX = 0,
+ WAYPVW_CAPTION,
+ WAYPVW_STICKY,
+ WAYPVW_VIEWPORTPANEL,
+ WAYPVW_SPACER,
+ WAYPVW_CENTERVIEW,
+ WAYPVW_RENAME,
+ WAYPVW_SHOW_TRAINS,
+ };
+
+public:
+ WaypointWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
+ {
+ this->wp = GetWaypoint(this->window_number);
+
+ this->flags4 |= WF_DISABLE_VP_SCROLL;
+ InitializeWindowViewport(this, 3, 17, 254, 86, this->wp->xy, ZOOM_LVL_MIN);
+
+ this->FindWindowPlacementAndResize(desc);
+ }
+
+ virtual void OnPaint()
+ {
+ /* You can only change your own waypoints */
+ this->SetWidgetDisabledState(WAYPVW_RENAME, !CheckTileOwnership(this->wp->xy));
+ SetDParam(0, this->wp->index);
+ this->DrawWidgets();
+
+ this->DrawViewport();
+ }
+
+ virtual void OnClick(Point pt, int widget)
+ {
+ switch (widget) {
+ case WAYPVW_CENTERVIEW: /* scroll to location */
+ if (_ctrl_pressed) {
+ ShowExtraViewPortWindow(this->wp->xy);
+ } else {
+ ScrollMainWindowToTile(this->wp->xy);
+ }
+ break;
+
+ case WAYPVW_RENAME: /* rename */
+ SetDParam(0, this->wp->index);
+ ShowQueryString(STR_WAYPOINT_RAW, STR_EDIT_WAYPOINT_NAME, MAX_LENGTH_WAYPOINT_NAME_BYTES, MAX_LENGTH_WAYPOINT_NAME_PIXELS, this, CS_ALPHANUMERAL);
+ break;
+
+ case WAYPVW_SHOW_TRAINS: /* show list of trains having this waypoint in their orders*/
+ ShowVehicleListWindow(this->wp);
+ break;
+ }
+ }
+
+ virtual void OnQueryTextFinished(char *str)
+ {
+ if (!StrEmpty(str)) {
+ _cmd_text = str;
+ DoCommandP(0, this->window_number, 0, NULL, CMD_RENAME_WAYPOINT | CMD_MSG(STR_CANT_CHANGE_WAYPOINT_NAME));
+ }
+ }
+
+};
+
+static const Widget _waypoint_view_widgets[] = {
+{ WWT_CLOSEBOX, RESIZE_NONE, COLOUR_GREY, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // WAYPVW_CLOSEBOX
+{ WWT_CAPTION, RESIZE_NONE, COLOUR_GREY, 11, 247, 0, 13, STR_WAYPOINT_VIEWPORT, STR_018C_WINDOW_TITLE_DRAG_THIS}, // WAYPVW_CAPTION
+{ WWT_STICKYBOX, RESIZE_NONE, COLOUR_GREY, 248, 259, 0, 13, 0x0, STR_STICKY_BUTTON}, // WAYPVW_STICKY
+{ WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 259, 14, 105, 0x0, STR_NULL}, // WAYPVW_VIEWPORTPANEL
+{ WWT_INSET, RESIZE_NONE, COLOUR_GREY, 2, 257, 16, 103, 0x0, STR_NULL}, // WAYPVW_SPACER
+{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 0, 121, 106, 117, STR_00E4_LOCATION, STR_3053_CENTER_MAIN_VIEW_ON_STATION}, // WAYPVW_CENTERVIEW
+{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 122, 244, 106, 117, STR_0130_RENAME, STR_CHANGE_WAYPOINT_NAME}, // WAYPVW_RENAME
+{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 245, 259, 106, 117, STR_TRAIN, STR_SCHEDULED_TRAINS_TIP }, // WAYPVW_SHOW_TRAINS
+{ WIDGETS_END},
+};
+
+static const WindowDesc _waypoint_view_desc = {
+ WDP_AUTO, WDP_AUTO, 260, 118, 260, 118,
+ WC_WAYPOINT_VIEW, WC_NONE,
+ WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON,
+ _waypoint_view_widgets,
+};
+
+void ShowWaypointWindow(const Waypoint *wp)
+{
+ AllocateWindowDescFront(&_waypoint_view_desc, wp->index);
+}
diff --git a/src/window_type.h b/src/window_type.h
index 2dc4ba5847..0150f64da5 100644
--- a/src/window_type.h
+++ b/src/window_type.h
@@ -94,6 +94,7 @@ enum WindowClass {
WC_BUILD_SIGNAL,
WC_COMPANY_PASSWORD_WINDOW,
WC_OSK,
+ WC_WAYPOINT_VIEW,
WC_INVALID = 0xFFFF
};