Implement NewGRF road waypoint selection window
This commit is contained in:
110
src/road_gui.cpp
110
src/road_gui.cpp
@@ -50,6 +50,7 @@
|
|||||||
|
|
||||||
static void ShowRVStationPicker(Window *parent, RoadStopType rs);
|
static void ShowRVStationPicker(Window *parent, RoadStopType rs);
|
||||||
static void ShowRoadDepotPicker(Window *parent);
|
static void ShowRoadDepotPicker(Window *parent);
|
||||||
|
static void ShowBuildWaypointPicker(Window *parent);
|
||||||
|
|
||||||
static bool _remove_button_clicked;
|
static bool _remove_button_clicked;
|
||||||
static bool _one_way_button_clicked;
|
static bool _one_way_button_clicked;
|
||||||
@@ -65,6 +66,9 @@ struct RoadStopGUISettings {
|
|||||||
};
|
};
|
||||||
static RoadStopGUISettings _roadstop_gui_settings;
|
static RoadStopGUISettings _roadstop_gui_settings;
|
||||||
|
|
||||||
|
static uint _waypoint_count = 1; ///< Number of waypoint types
|
||||||
|
static uint _cur_waypoint_type; ///< Currently selected waypoint type
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define the values of the RoadFlags
|
* Define the values of the RoadFlags
|
||||||
* @see CmdBuildLongRoad
|
* @see CmdBuildLongRoad
|
||||||
@@ -514,6 +518,8 @@ struct BuildRoadToolbarWindow : Window {
|
|||||||
case WID_ROT_BUILD_WAYPOINT:
|
case WID_ROT_BUILD_WAYPOINT:
|
||||||
if (HandlePlacePushButton(this, WID_ROT_BUILD_WAYPOINT, SPR_CURSOR_WAYPOINT, HT_RECT)) {
|
if (HandlePlacePushButton(this, WID_ROT_BUILD_WAYPOINT, SPR_CURSOR_WAYPOINT, HT_RECT)) {
|
||||||
this->last_started_action = widget;
|
this->last_started_action = widget;
|
||||||
|
_waypoint_count = RoadStopClass::Get(ROADSTOP_CLASS_WAYP)->GetSpecCount();
|
||||||
|
if (_waypoint_count > 1) ShowBuildWaypointPicker(this);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -742,6 +748,7 @@ struct BuildRoadToolbarWindow : Window {
|
|||||||
uint32 p2 = ROADSTOP_CLASS_WAYP | INVALID_STATION << 16;
|
uint32 p2 = ROADSTOP_CLASS_WAYP | INVALID_STATION << 16;
|
||||||
|
|
||||||
CommandContainer cmdcont = NewCommandContainerBasic(ta.tile, p1, p2, CMD_BUILD_ROAD_WAYPOINT | CMD_MSG(STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT), CcPlaySound_CONSTRUCTION_OTHER);
|
CommandContainer cmdcont = NewCommandContainerBasic(ta.tile, p1, p2, CMD_BUILD_ROAD_WAYPOINT | CMD_MSG(STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT), CcPlaySound_CONSTRUCTION_OTHER);
|
||||||
|
cmdcont.p3 = _cur_waypoint_type;
|
||||||
ShowSelectWaypointIfNeeded(cmdcont, ta);
|
ShowSelectWaypointIfNeeded(cmdcont, ta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1457,8 +1464,7 @@ public:
|
|||||||
if (spec == nullptr) {
|
if (spec == nullptr) {
|
||||||
StationPickerDrawSprite(r.left + WD_MATRIX_LEFT + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE);
|
StationPickerDrawSprite(r.left + WD_MATRIX_LEFT + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE);
|
||||||
} else {
|
} else {
|
||||||
DrawRoadStopTile(r.left + WD_MATRIX_LEFT + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), _cur_roadtype,
|
DrawRoadStopTile(r.left + WD_MATRIX_LEFT + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), _cur_roadtype, spec, st, (int)widget - WID_BROS_STATION_NE);
|
||||||
RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(_roadstop_gui_settings.roadstop_type), st, (int)widget - WID_BROS_STATION_NE);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1489,12 +1495,12 @@ public:
|
|||||||
int x = ScaleGUITrad(31) + 1;
|
int x = ScaleGUITrad(31) + 1;
|
||||||
int y = r.bottom - r.top - ScaleGUITrad(31);
|
int y = r.bottom - r.top - ScaleGUITrad(31);
|
||||||
// Instead of "5" (5th view), pass the orientation clicked in the selection.
|
// Instead of "5" (5th view), pass the orientation clicked in the selection.
|
||||||
const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(_roadstop_gui_settings.roadstop_type);
|
const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(type);
|
||||||
StationType st = GetRoadStationTypeByWindowClass(this->window_class);
|
StationType st = GetRoadStationTypeByWindowClass(this->window_class);
|
||||||
if (spec == nullptr) {
|
if (spec == nullptr) {
|
||||||
StationPickerDrawSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), st, INVALID_RAILTYPE, _cur_roadtype, _roadstop_gui_settings.orientation);
|
StationPickerDrawSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), st, INVALID_RAILTYPE, _cur_roadtype, _roadstop_gui_settings.orientation);
|
||||||
} else {
|
} else {
|
||||||
DrawRoadStopTile(x, y, _cur_roadtype, RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(type), st, (uint8)_roadstop_gui_settings.orientation);
|
DrawRoadStopTile(x, y, _cur_roadtype, spec, st, (uint8)_roadstop_gui_settings.orientation);
|
||||||
}
|
}
|
||||||
_cur_dpi = old_dpi;
|
_cur_dpi = old_dpi;
|
||||||
}
|
}
|
||||||
@@ -1779,6 +1785,102 @@ static void ShowRVStationPicker(Window *parent, RoadStopType rs)
|
|||||||
new BuildRoadStationWindow(RoadTypeIsRoad(_cur_roadtype) ? &_road_station_picker_desc : &_tram_station_picker_desc, parent, rs);
|
new BuildRoadStationWindow(RoadTypeIsRoad(_cur_roadtype) ? &_road_station_picker_desc : &_tram_station_picker_desc, parent, rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct BuildRoadWaypointWindow : PickerWindowBase {
|
||||||
|
BuildRoadWaypointWindow(WindowDesc *desc, Window *parent) : PickerWindowBase(desc, parent)
|
||||||
|
{
|
||||||
|
this->CreateNestedTree();
|
||||||
|
|
||||||
|
NWidgetMatrix *matrix = this->GetWidget<NWidgetMatrix>(WID_BROW_WAYPOINT_MATRIX);
|
||||||
|
matrix->SetScrollbar(this->GetScrollbar(WID_BROW_SCROLL));
|
||||||
|
|
||||||
|
this->FinishInitNested(TRANSPORT_ROAD);
|
||||||
|
|
||||||
|
matrix->SetCount(_waypoint_count);
|
||||||
|
if (_cur_waypoint_type >= _waypoint_count) _cur_waypoint_type = 0;
|
||||||
|
matrix->SetClicked(_cur_waypoint_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
|
||||||
|
{
|
||||||
|
switch (widget) {
|
||||||
|
case WID_BROW_WAYPOINT_MATRIX:
|
||||||
|
/* Three blobs high and wide. */
|
||||||
|
size->width += resize->width * 2;
|
||||||
|
size->height += resize->height * 2;
|
||||||
|
|
||||||
|
/* Resizing in X direction only at blob size, but at pixel level in Y. */
|
||||||
|
resize->height = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WID_BROW_WAYPOINT:
|
||||||
|
size->width = ScaleGUITrad(64) + 2;
|
||||||
|
size->height = ScaleGUITrad(58) + 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawWidget(const Rect &r, int widget) const override
|
||||||
|
{
|
||||||
|
switch (GB(widget, 0, 16)) {
|
||||||
|
case WID_BROW_WAYPOINT: {
|
||||||
|
uint type = GB(widget, 16, 16);
|
||||||
|
const RoadStopSpec *spec = RoadStopClass::Get(ROADSTOP_CLASS_WAYP)->GetSpec(type);
|
||||||
|
if (spec == nullptr) {
|
||||||
|
StationPickerDrawSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), STATION_ROADWAYPOINT, INVALID_RAILTYPE, _cur_roadtype, 4);
|
||||||
|
} else {
|
||||||
|
DrawRoadStopTile(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), _cur_roadtype, spec, STATION_ROADWAYPOINT, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnClick(Point pt, int widget, int click_count) override
|
||||||
|
{
|
||||||
|
switch (GB(widget, 0, 16)) {
|
||||||
|
case WID_BROW_WAYPOINT: {
|
||||||
|
uint type = GB(widget, 16, 16);
|
||||||
|
this->GetWidget<NWidgetMatrix>(WID_BROW_WAYPOINT_MATRIX)->SetClicked(_cur_waypoint_type);
|
||||||
|
|
||||||
|
_cur_waypoint_type = type;
|
||||||
|
this->GetWidget<NWidgetMatrix>(WID_BROW_WAYPOINT_MATRIX)->SetClicked(_cur_waypoint_type);
|
||||||
|
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
||||||
|
this->SetDirty();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Nested widget definition for the build NewGRF road waypoint window */
|
||||||
|
static const NWidgetPart _nested_build_waypoint_widgets[] = {
|
||||||
|
NWidget(NWID_HORIZONTAL),
|
||||||
|
NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
|
||||||
|
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_WAYPOINT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
||||||
|
NWidget(WWT_DEFSIZEBOX, COLOUR_DARK_GREEN),
|
||||||
|
EndContainer(),
|
||||||
|
NWidget(NWID_HORIZONTAL),
|
||||||
|
NWidget(NWID_MATRIX, COLOUR_DARK_GREEN, WID_BROW_WAYPOINT_MATRIX), SetPIP(3, 2, 3), SetScrollbar(WID_BROW_SCROLL),
|
||||||
|
NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BROW_WAYPOINT), SetMinimalSize(66, 60), SetDataTip(0x0, STR_WAYPOINT_GRAPHICS_TOOLTIP), SetScrollbar(WID_BROW_SCROLL), EndContainer(),
|
||||||
|
EndContainer(),
|
||||||
|
NWidget(NWID_VERTICAL),
|
||||||
|
NWidget(NWID_VSCROLLBAR, COLOUR_DARK_GREEN, WID_BROW_SCROLL),
|
||||||
|
NWidget(WWT_RESIZEBOX, COLOUR_DARK_GREEN),
|
||||||
|
EndContainer(),
|
||||||
|
EndContainer(),
|
||||||
|
};
|
||||||
|
|
||||||
|
static WindowDesc _build_waypoint_desc(
|
||||||
|
WDP_AUTO, "build_waypoint", 0, 0,
|
||||||
|
WC_BUILD_WAYPOINT, WC_BUILD_TOOLBAR,
|
||||||
|
WDF_CONSTRUCTION,
|
||||||
|
_nested_build_waypoint_widgets, lengthof(_nested_build_waypoint_widgets)
|
||||||
|
);
|
||||||
|
|
||||||
|
static void ShowBuildWaypointPicker(Window *parent)
|
||||||
|
{
|
||||||
|
new BuildRoadWaypointWindow(&_build_waypoint_desc, parent);
|
||||||
|
}
|
||||||
|
|
||||||
void InitializeRoadGui()
|
void InitializeRoadGui()
|
||||||
{
|
{
|
||||||
_build_depot_direction = DIAGDIR_NW;
|
_build_depot_direction = DIAGDIR_NW;
|
||||||
|
@@ -3552,7 +3552,7 @@ void StationPickerDrawSprite(int x, int y, StationType st, RailType railtype, Ro
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Default waypoint has no railtype specific sprites */
|
/* Default waypoint has no railtype specific sprites */
|
||||||
DrawRailTileSeqInGUI(x, y, t, st == STATION_WAYPOINT ? 0 : total_offset, 0, pal);
|
DrawRailTileSeqInGUI(x, y, t, (st == STATION_WAYPOINT || st == STATION_ROADWAYPOINT) ? 0 : total_offset, 0, pal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int GetSlopePixelZ_Station(TileIndex tile, uint x, uint y)
|
static int GetSlopePixelZ_Station(TileIndex tile, uint x, uint y)
|
||||||
|
@@ -71,4 +71,11 @@ enum BuildRoadStationWidgets {
|
|||||||
WID_BROS_NEWST_SCROLL, ///< Scrollbar of the #WID_BROS_NEWST_LIST.
|
WID_BROS_NEWST_SCROLL, ///< Scrollbar of the #WID_BROS_NEWST_LIST.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Widgets of the #BuildRoadWaypointWindow class. */
|
||||||
|
enum BuildRoadWaypointWidgets {
|
||||||
|
WID_BROW_WAYPOINT_MATRIX, ///< Matrix with waypoints.
|
||||||
|
WID_BROW_WAYPOINT, ///< A single waypoint.
|
||||||
|
WID_BROW_SCROLL, ///< Scrollbar for the matrix.
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* WIDGETS_ROAD_WIDGET_H */
|
#endif /* WIDGETS_ROAD_WIDGET_H */
|
||||||
|
Reference in New Issue
Block a user