Add picker tool to main toolbar help menu
See: #498 Supports: * Rail types * Road/tram types * Objects * Rail stations/waypoints * Road stops/waypoints Add unset hotkey
This commit is contained in:
@@ -70,6 +70,9 @@ STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GRE
|
|||||||
STR_CONFIG_SETTING_TOWN_GROWTH_EXTREME_SLOW :Extremely slow
|
STR_CONFIG_SETTING_TOWN_GROWTH_EXTREME_SLOW :Extremely slow
|
||||||
STR_CONFIG_SETTING_TOWN_GROWTH_VERY_SLOW :Very slow
|
STR_CONFIG_SETTING_TOWN_GROWTH_VERY_SLOW :Very slow
|
||||||
|
|
||||||
|
##after STR_ABOUT_MENU_LAND_BLOCK_INFO
|
||||||
|
STR_ABOUT_MENU_SHOW_PICKER_TOOL :Picker tool
|
||||||
|
|
||||||
##after STR_ABOUT_MENU_SHOW_FRAMERATE
|
##after STR_ABOUT_MENU_SHOW_FRAMERATE
|
||||||
STR_ABOUT_MENU_SHOW_TOGGLE_MODIFIER_KEYS :Modifier key window
|
STR_ABOUT_MENU_SHOW_TOGGLE_MODIFIER_KEYS :Modifier key window
|
||||||
|
|
||||||
|
@@ -19,5 +19,6 @@ void UpdateCompanyHQ(TileIndex tile, uint score);
|
|||||||
void BuildObject(ObjectType type, TileIndex tile, CompanyID owner = OWNER_NONE, struct Town *town = nullptr, uint8 view = 0);
|
void BuildObject(ObjectType type, TileIndex tile, CompanyID owner = OWNER_NONE, struct Town *town = nullptr, uint8 view = 0);
|
||||||
|
|
||||||
Window *ShowBuildObjectPicker();
|
Window *ShowBuildObjectPicker();
|
||||||
|
void ShowBuildObjectPickerAndSelect(const ObjectSpec *spec);
|
||||||
|
|
||||||
#endif /* OBJECT_H */
|
#endif /* OBJECT_H */
|
||||||
|
@@ -755,6 +755,27 @@ Window *ShowBuildObjectPicker()
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Show our object picker, and select a particular spec. */
|
||||||
|
void ShowBuildObjectPickerAndSelect(const ObjectSpec *spec)
|
||||||
|
{
|
||||||
|
if (spec == nullptr || !spec->IsAvailable() || !ObjectClass::HasUIClass()) return;
|
||||||
|
|
||||||
|
int spec_id = -1;
|
||||||
|
const ObjectClass *objclass = ObjectClass::Get(spec->cls_id);
|
||||||
|
for (int i = 0; i < (int)objclass->GetSpecCount(); i++) {
|
||||||
|
if (objclass->GetSpec(i) == spec) {
|
||||||
|
spec_id = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (spec_id < 0) return;
|
||||||
|
|
||||||
|
BuildObjectWindow *w = AllocateWindowDescFront<BuildObjectWindow>(&_build_object_desc, 0, true);
|
||||||
|
if (w != nullptr) {
|
||||||
|
w->SelectOtherClass(spec->cls_id);
|
||||||
|
w->SelectOtherObject(spec_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Reset all data of the object GUI. */
|
/** Reset all data of the object GUI. */
|
||||||
void InitializeObjectGui()
|
void InitializeObjectGui()
|
||||||
{
|
{
|
||||||
|
@@ -1145,6 +1145,22 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SelectClass(StationClassID station_class_id) {
|
||||||
|
if (_railstation.station_class != station_class_id) {
|
||||||
|
StationClass *station_class = StationClass::Get(station_class_id);
|
||||||
|
_railstation.station_class = station_class_id;
|
||||||
|
_railstation.station_count = station_class->GetSpecCount();
|
||||||
|
_railstation.station_type = 0;
|
||||||
|
|
||||||
|
this->CheckSelectedSize(station_class->GetSpec(_railstation.station_type));
|
||||||
|
|
||||||
|
NWidgetMatrix *matrix = this->GetWidget<NWidgetMatrix>(WID_BRAS_MATRIX);
|
||||||
|
matrix->SetCount(_railstation.station_count);
|
||||||
|
matrix->SetClicked(_railstation.station_type);
|
||||||
|
this->SetDirty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BuildRailStationWindow(WindowDesc *desc, Window *parent, bool newstation) : PickerWindowBase(desc, parent), filter_editbox(EDITBOX_MAX_SIZE * MAX_CHAR_LENGTH, EDITBOX_MAX_SIZE)
|
BuildRailStationWindow(WindowDesc *desc, Window *parent, bool newstation) : PickerWindowBase(desc, parent), filter_editbox(EDITBOX_MAX_SIZE * MAX_CHAR_LENGTH, EDITBOX_MAX_SIZE)
|
||||||
{
|
{
|
||||||
@@ -1639,18 +1655,7 @@ public:
|
|||||||
int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_BRAS_NEWST_LIST);
|
int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_BRAS_NEWST_LIST);
|
||||||
if (y >= (int)this->station_classes.size()) return;
|
if (y >= (int)this->station_classes.size()) return;
|
||||||
StationClassID station_class_id = this->station_classes[y];
|
StationClassID station_class_id = this->station_classes[y];
|
||||||
if (_railstation.station_class != station_class_id) {
|
this->SelectClass(station_class_id);
|
||||||
StationClass *station_class = StationClass::Get(station_class_id);
|
|
||||||
_railstation.station_class = station_class_id;
|
|
||||||
_railstation.station_count = station_class->GetSpecCount();
|
|
||||||
_railstation.station_type = 0;
|
|
||||||
|
|
||||||
this->CheckSelectedSize(station_class->GetSpec(_railstation.station_type));
|
|
||||||
|
|
||||||
NWidgetMatrix *matrix = this->GetWidget<NWidgetMatrix>(WID_BRAS_MATRIX);
|
|
||||||
matrix->SetCount(_railstation.station_count);
|
|
||||||
matrix->SetClicked(_railstation.station_type);
|
|
||||||
}
|
|
||||||
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
||||||
this->SetDirty();
|
this->SetDirty();
|
||||||
DeleteWindowById(WC_SELECT_STATION, 0);
|
DeleteWindowById(WC_SELECT_STATION, 0);
|
||||||
@@ -1683,6 +1688,13 @@ public:
|
|||||||
CheckRedrawStationCoverage(this);
|
CheckRedrawStationCoverage(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SelectClassAndSpec(StationClassID class_id, int spec_id)
|
||||||
|
{
|
||||||
|
this->SelectClass(class_id);
|
||||||
|
this->EnsureSelectedStationClassIsVisible();
|
||||||
|
this->OnClick({}, WID_BRAS_IMAGE | (spec_id << 16), 1);
|
||||||
|
}
|
||||||
|
|
||||||
static HotkeyList hotkeys;
|
static HotkeyList hotkeys;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2482,6 +2494,11 @@ struct BuildRailWaypointWindow : PickerWindowBase {
|
|||||||
{
|
{
|
||||||
CheckRedrawWaypointCoverage(this, false);
|
CheckRedrawWaypointCoverage(this, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SelectWaypointSpec(int spec_id)
|
||||||
|
{
|
||||||
|
this->OnClick({}, WID_BRW_WAYPOINT | (spec_id << 16), 1);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Nested widget definition for the build NewGRF rail waypoint window */
|
/** Nested widget definition for the build NewGRF rail waypoint window */
|
||||||
@@ -2692,3 +2709,51 @@ DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
|
|||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ShowBuildRailStationPickerAndSelect(StationType station_type, const StationSpec *spec)
|
||||||
|
{
|
||||||
|
if (!IsStationAvailable(spec)) return;
|
||||||
|
|
||||||
|
StationClassID class_id;
|
||||||
|
if (spec != nullptr) {
|
||||||
|
if ((spec->cls_id == STAT_CLASS_WAYP) != (station_type == STATION_WAYPOINT)) return;
|
||||||
|
class_id = spec->cls_id;
|
||||||
|
} else {
|
||||||
|
class_id = (station_type == STATION_ROADWAYPOINT) ? STAT_CLASS_WAYP : STAT_CLASS_DFLT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int spec_id = -1;
|
||||||
|
const StationClass *stclass = StationClass::Get(class_id);
|
||||||
|
for (int i = 0; i < (int)stclass->GetSpecCount(); i++) {
|
||||||
|
if (stclass->GetSpec(i) == spec) {
|
||||||
|
spec_id = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (spec_id < 0) return;
|
||||||
|
|
||||||
|
|
||||||
|
Window *w = FindWindowById(WC_BUILD_TOOLBAR, TRANSPORT_RAIL);
|
||||||
|
if (w == nullptr) {
|
||||||
|
extern RailType _last_built_railtype;
|
||||||
|
w = ShowBuildRailToolbar(_last_built_railtype);
|
||||||
|
}
|
||||||
|
if (w == nullptr) return;
|
||||||
|
|
||||||
|
auto trigger_widget = [&](int widget) {
|
||||||
|
if (!w->IsWidgetLowered(widget)) {
|
||||||
|
w->OnHotkey(widget);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (station_type == STATION_WAYPOINT) {
|
||||||
|
trigger_widget(WID_RAT_BUILD_WAYPOINT);
|
||||||
|
|
||||||
|
BuildRailWaypointWindow *waypoint_window = dynamic_cast<BuildRailWaypointWindow *>(FindWindowById(WC_BUILD_WAYPOINT, TRANSPORT_RAIL));
|
||||||
|
if (waypoint_window != nullptr) waypoint_window->SelectWaypointSpec(spec_id);
|
||||||
|
} else {
|
||||||
|
trigger_widget(WID_RAT_BUILD_STATION);
|
||||||
|
|
||||||
|
BuildRailStationWindow *station_window = dynamic_cast<BuildRailStationWindow *>(FindWindowById(WC_BUILD_STATION, TRANSPORT_RAIL));
|
||||||
|
if (station_window != nullptr) station_window->SelectClassAndSpec(class_id, spec_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
#include "widgets/dropdown_type.h"
|
#include "widgets/dropdown_type.h"
|
||||||
|
|
||||||
struct Window *ShowBuildRailToolbar(RailType railtype);
|
struct Window *ShowBuildRailToolbar(RailType railtype);
|
||||||
|
void ShowBuildRailStationPickerAndSelect(StationType station_type, const StationSpec *spec);
|
||||||
void ReinitGuiAfterToggleElrail(bool disable);
|
void ReinitGuiAfterToggleElrail(bool disable);
|
||||||
void ResetSignalVariant(int32 = 0);
|
void ResetSignalVariant(int32 = 0);
|
||||||
void InitializeRailGUI();
|
void InitializeRailGUI();
|
||||||
|
149
src/road_gui.cpp
149
src/road_gui.cpp
@@ -858,6 +858,25 @@ struct BuildRoadToolbarWindow : Window {
|
|||||||
static HotkeyList tram_hotkeys;
|
static HotkeyList tram_hotkeys;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Window *CreateRoadTramToolbarForRoadType(RoadType roadtype, RoadTramType rtt)
|
||||||
|
{
|
||||||
|
Window* w = nullptr;
|
||||||
|
switch (_game_mode) {
|
||||||
|
case GM_NORMAL:
|
||||||
|
w = ShowBuildRoadToolbar(roadtype);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GM_EDITOR:
|
||||||
|
if ((GetRoadTypes(true) & ((rtt == RTT_ROAD) ? ~_roadtypes_type : _roadtypes_type)) == ROADTYPES_NONE) return nullptr;
|
||||||
|
w = ShowBuildRoadScenToolbar(roadtype);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for global hotkeys of the BuildRoadToolbarWindow.
|
* Handler for global hotkeys of the BuildRoadToolbarWindow.
|
||||||
* @param hotkey Hotkey
|
* @param hotkey Hotkey
|
||||||
@@ -866,20 +885,7 @@ struct BuildRoadToolbarWindow : Window {
|
|||||||
*/
|
*/
|
||||||
static EventState RoadTramToolbarGlobalHotkeys(int hotkey, RoadType last_build, RoadTramType rtt)
|
static EventState RoadTramToolbarGlobalHotkeys(int hotkey, RoadType last_build, RoadTramType rtt)
|
||||||
{
|
{
|
||||||
Window* w = nullptr;
|
Window* w = CreateRoadTramToolbarForRoadType(last_build, rtt);
|
||||||
switch (_game_mode) {
|
|
||||||
case GM_NORMAL:
|
|
||||||
w = ShowBuildRoadToolbar(last_build);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GM_EDITOR:
|
|
||||||
if ((GetRoadTypes(true) & ((rtt == RTT_ROAD) ? ~_roadtypes_type : _roadtypes_type)) == ROADTYPES_NONE) return ES_NOT_HANDLED;
|
|
||||||
w = ShowBuildRoadScenToolbar(last_build);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (w == nullptr) return ES_NOT_HANDLED;
|
if (w == nullptr) return ES_NOT_HANDLED;
|
||||||
return w->OnHotkey(hotkey);
|
return w->OnHotkey(hotkey);
|
||||||
@@ -1227,7 +1233,7 @@ enum BuildRoadStopHotkeys {
|
|||||||
|
|
||||||
struct BuildRoadStationWindow : public PickerWindowBase {
|
struct BuildRoadStationWindow : public PickerWindowBase {
|
||||||
private:
|
private:
|
||||||
RoadStopType roadStopType; ///< The RoadStopType for this Window.
|
RoadStopType road_stop_type; ///< The RoadStopType for this Window.
|
||||||
uint line_height; ///< Height of a single line in the newstation selection matrix.
|
uint line_height; ///< Height of a single line in the newstation selection matrix.
|
||||||
uint coverage_height; ///< Height of the coverage texts.
|
uint coverage_height; ///< Height of the coverage texts.
|
||||||
Scrollbar *vscrollList; ///< Vertical scrollbar of the new station list.
|
Scrollbar *vscrollList; ///< Vertical scrollbar of the new station list.
|
||||||
@@ -1271,13 +1277,29 @@ private:
|
|||||||
this->UpdateBuildingHeight(spec->height);
|
this->UpdateBuildingHeight(spec->height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SelectClass(RoadStopClassID class_id) {
|
||||||
|
if (_roadstop_gui_settings.roadstop_class != class_id && GetIfClassHasNewStopsByType(RoadStopClass::Get(class_id), this->road_stop_type, _cur_roadtype)) {
|
||||||
|
_roadstop_gui_settings.roadstop_class = class_id;
|
||||||
|
RoadStopClass *rsclass = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class);
|
||||||
|
_roadstop_gui_settings.roadstop_count = rsclass->GetSpecCount();
|
||||||
|
_roadstop_gui_settings.roadstop_type = std::min((int)_roadstop_gui_settings.roadstop_type, std::max(0, (int)_roadstop_gui_settings.roadstop_count - 1));
|
||||||
|
this->SelectFirstAvailableTypeIfUnavailable();
|
||||||
|
|
||||||
|
NWidgetMatrix *matrix = this->GetWidget<NWidgetMatrix>(WID_BROS_MATRIX);
|
||||||
|
matrix->SetCount(_roadstop_gui_settings.roadstop_count);
|
||||||
|
matrix->SetClicked(_roadstop_gui_settings.roadstop_type);
|
||||||
|
this->CheckSelectedSpec();
|
||||||
|
this->SetDirty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BuildRoadStationWindow(WindowDesc *desc, Window *parent, RoadStopType rs) : PickerWindowBase(desc, parent), filter_editbox(EDITBOX_MAX_SIZE * MAX_CHAR_LENGTH, EDITBOX_MAX_SIZE)
|
BuildRoadStationWindow(WindowDesc *desc, Window *parent, RoadStopType rs) : PickerWindowBase(desc, parent), filter_editbox(EDITBOX_MAX_SIZE * MAX_CHAR_LENGTH, EDITBOX_MAX_SIZE)
|
||||||
{
|
{
|
||||||
this->coverage_height = 2 * FONT_HEIGHT_NORMAL + 3 * WidgetDimensions::scaled.vsep_normal;
|
this->coverage_height = 2 * FONT_HEIGHT_NORMAL + 3 * WidgetDimensions::scaled.vsep_normal;
|
||||||
this->vscrollList = nullptr;
|
this->vscrollList = nullptr;
|
||||||
this->vscrollMatrix = nullptr;
|
this->vscrollMatrix = nullptr;
|
||||||
this->roadStopType = rs;
|
this->road_stop_type = rs;
|
||||||
bool newstops = GetIfNewStopsByType(rs, _cur_roadtype);
|
bool newstops = GetIfNewStopsByType(rs, _cur_roadtype);
|
||||||
|
|
||||||
this->CreateNestedTree();
|
this->CreateNestedTree();
|
||||||
@@ -1338,7 +1360,7 @@ public:
|
|||||||
_roadstop_gui_settings.roadstop_type = std::min((int)_roadstop_gui_settings.roadstop_type, _roadstop_gui_settings.roadstop_count - 1);
|
_roadstop_gui_settings.roadstop_type = std::min((int)_roadstop_gui_settings.roadstop_type, _roadstop_gui_settings.roadstop_count - 1);
|
||||||
|
|
||||||
/* Reset back to default class if the previously selected class is not available for this road stop type. */
|
/* Reset back to default class if the previously selected class is not available for this road stop type. */
|
||||||
if (!GetIfClassHasNewStopsByType(RoadStopClass::Get(_roadstop_gui_settings.roadstop_class), roadStopType, _cur_roadtype)) {
|
if (!GetIfClassHasNewStopsByType(RoadStopClass::Get(_roadstop_gui_settings.roadstop_class), this->road_stop_type, _cur_roadtype)) {
|
||||||
_roadstop_gui_settings.roadstop_class = ROADSTOP_CLASS_DFLT;
|
_roadstop_gui_settings.roadstop_class = ROADSTOP_CLASS_DFLT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1391,7 +1413,7 @@ public:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
RoadStopClass *rs_class = RoadStopClass::Get(rs_id);
|
RoadStopClass *rs_class = RoadStopClass::Get(rs_id);
|
||||||
if (GetIfClassHasNewStopsByType(rs_class, this->roadStopType, _cur_roadtype)) this->roadstop_classes.push_back(rs_id);
|
if (GetIfClassHasNewStopsByType(rs_class, this->road_stop_type, _cur_roadtype)) this->roadstop_classes.push_back(rs_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->ShowNewStops()) {
|
if (this->ShowNewStops()) {
|
||||||
@@ -1682,18 +1704,7 @@ public:
|
|||||||
int y = this->vscrollList->GetScrolledRowFromWidget(pt.y, this, WID_BROS_NEWST_LIST);
|
int y = this->vscrollList->GetScrolledRowFromWidget(pt.y, this, WID_BROS_NEWST_LIST);
|
||||||
if (y >= (int)this->roadstop_classes.size()) return;
|
if (y >= (int)this->roadstop_classes.size()) return;
|
||||||
RoadStopClassID class_id = this->roadstop_classes[y];
|
RoadStopClassID class_id = this->roadstop_classes[y];
|
||||||
if (_roadstop_gui_settings.roadstop_class != class_id && GetIfClassHasNewStopsByType(RoadStopClass::Get(class_id), roadStopType, _cur_roadtype)) {
|
this->SelectClass(class_id);
|
||||||
_roadstop_gui_settings.roadstop_class = class_id;
|
|
||||||
RoadStopClass *rsclass = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class);
|
|
||||||
_roadstop_gui_settings.roadstop_count = rsclass->GetSpecCount();
|
|
||||||
_roadstop_gui_settings.roadstop_type = std::min((int)_roadstop_gui_settings.roadstop_type, std::max(0, (int)_roadstop_gui_settings.roadstop_count - 1));
|
|
||||||
this->SelectFirstAvailableTypeIfUnavailable();
|
|
||||||
|
|
||||||
NWidgetMatrix *matrix = this->GetWidget<NWidgetMatrix>(WID_BROS_MATRIX);
|
|
||||||
matrix->SetCount(_roadstop_gui_settings.roadstop_count);
|
|
||||||
matrix->SetClicked(_roadstop_gui_settings.roadstop_type);
|
|
||||||
this->CheckSelectedSpec();
|
|
||||||
}
|
|
||||||
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
||||||
this->SetDirty();
|
this->SetDirty();
|
||||||
DeleteWindowById(WC_SELECT_STATION, 0);
|
DeleteWindowById(WC_SELECT_STATION, 0);
|
||||||
@@ -1731,6 +1742,18 @@ public:
|
|||||||
CheckRedrawStationCoverage(this);
|
CheckRedrawStationCoverage(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SelectClassAndSpec(RoadStopClassID class_id, int spec_id)
|
||||||
|
{
|
||||||
|
this->SelectClass(class_id);
|
||||||
|
this->EnsureSelectedClassIsVisible();
|
||||||
|
|
||||||
|
if (_roadstop_gui_settings.roadstop_class != class_id) {
|
||||||
|
/* could not select class*/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this->OnClick({}, WID_BROS_IMAGE | (spec_id << 16), 1);
|
||||||
|
}
|
||||||
|
|
||||||
static HotkeyList hotkeys;
|
static HotkeyList hotkeys;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2021,6 +2044,11 @@ struct BuildRoadWaypointWindow : PickerWindowBase {
|
|||||||
{
|
{
|
||||||
CheckRedrawWaypointCoverage(this, true);
|
CheckRedrawWaypointCoverage(this, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SelectWaypointSpec(int spec_id)
|
||||||
|
{
|
||||||
|
this->OnClick({}, WID_BROW_WAYPOINT | (spec_id << 16), 1);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Nested widget definition for the build NewGRF road waypoint window */
|
/** Nested widget definition for the build NewGRF road waypoint window */
|
||||||
@@ -2247,3 +2275,64 @@ DropDownList GetScenRoadTypeDropDownList(RoadTramTypes rtts)
|
|||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BuildRoadToolbarWindow *GetRoadToolbarWindowForRoadStop(const RoadStopSpec *spec, RoadTramType rtt_preferred)
|
||||||
|
{
|
||||||
|
extern RoadType _last_built_roadtype;
|
||||||
|
extern RoadType _last_built_tramtype;
|
||||||
|
|
||||||
|
BuildRoadToolbarWindow *w = dynamic_cast<BuildRoadToolbarWindow *>(FindWindowById(_game_mode == GM_EDITOR ? WC_SCEN_BUILD_TOOLBAR : WC_BUILD_TOOLBAR, TRANSPORT_ROAD));
|
||||||
|
if (w != nullptr) {
|
||||||
|
if (spec != nullptr && ((HasBit(spec->flags, RSF_BUILD_MENU_ROAD_ONLY) && !RoadTypeIsRoad(_cur_roadtype)) ||
|
||||||
|
(HasBit(spec->flags, RSF_BUILD_MENU_TRAM_ONLY) && !RoadTypeIsTram(_cur_roadtype)))) {
|
||||||
|
delete w;
|
||||||
|
} else {
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dynamic_cast<BuildRoadToolbarWindow *>(CreateRoadTramToolbarForRoadType(rtt_preferred == RTT_TRAM ? _last_built_tramtype : _last_built_roadtype, rtt_preferred));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShowBuildRoadStopPickerAndSelect(StationType station_type, const RoadStopSpec *spec, RoadTramType rtt_preferred)
|
||||||
|
{
|
||||||
|
if (!IsRoadStopAvailable(spec, station_type)) return;
|
||||||
|
|
||||||
|
RoadStopClassID class_id;
|
||||||
|
if (spec != nullptr) {
|
||||||
|
if ((spec->cls_id == ROADSTOP_CLASS_WAYP) != (station_type == STATION_ROADWAYPOINT)) return;
|
||||||
|
class_id = spec->cls_id;
|
||||||
|
} else {
|
||||||
|
class_id = (station_type == STATION_ROADWAYPOINT) ? ROADSTOP_CLASS_WAYP : ROADSTOP_CLASS_DFLT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int spec_id = -1;
|
||||||
|
const RoadStopClass *rsclass = RoadStopClass::Get(class_id);
|
||||||
|
for (int i = 0; i < (int)rsclass->GetSpecCount(); i++) {
|
||||||
|
if (rsclass->GetSpec(i) == spec) {
|
||||||
|
spec_id = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (spec_id < 0) return;
|
||||||
|
|
||||||
|
BuildRoadToolbarWindow *w = GetRoadToolbarWindowForRoadStop(spec, rtt_preferred);
|
||||||
|
if (w == nullptr) return;
|
||||||
|
|
||||||
|
auto trigger_widget = [&](int widget) {
|
||||||
|
if (!w->IsWidgetLowered(widget)) {
|
||||||
|
w->OnHotkey(widget);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (station_type == STATION_ROADWAYPOINT) {
|
||||||
|
trigger_widget(WID_ROT_BUILD_WAYPOINT);
|
||||||
|
|
||||||
|
BuildRoadWaypointWindow *waypoint_window = dynamic_cast<BuildRoadWaypointWindow *>(FindWindowById(WC_BUILD_WAYPOINT, TRANSPORT_ROAD));
|
||||||
|
if (waypoint_window != nullptr) waypoint_window->SelectWaypointSpec(spec_id);
|
||||||
|
} else {
|
||||||
|
trigger_widget((station_type == STATION_BUS) ? WID_ROT_BUS_STATION : WID_ROT_TRUCK_STATION);
|
||||||
|
|
||||||
|
BuildRoadStationWindow *roadstop_window = dynamic_cast<BuildRoadStationWindow *>(FindWindowById((station_type == STATION_BUS) ? WC_BUS_STATION : WC_TRUCK_STATION, TRANSPORT_ROAD));
|
||||||
|
if (roadstop_window != nullptr) roadstop_window->SelectClassAndSpec(class_id, spec_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
struct Window *ShowBuildRoadToolbar(RoadType roadtype);
|
struct Window *ShowBuildRoadToolbar(RoadType roadtype);
|
||||||
struct Window *ShowBuildRoadScenToolbar(RoadType roadtype);
|
struct Window *ShowBuildRoadScenToolbar(RoadType roadtype);
|
||||||
|
struct Window *CreateRoadTramToolbarForRoadType(RoadType roadtype, RoadTramType rtt);
|
||||||
|
void ShowBuildRoadStopPickerAndSelect(StationType station_type, const RoadStopSpec *spec, RoadTramType rtt_preferred);
|
||||||
void ConnectRoadToStructure(TileIndex tile, DiagDirection direction);
|
void ConnectRoadToStructure(TileIndex tile, DiagDirection direction);
|
||||||
DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement = false, bool all_option = false);
|
DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement = false, bool all_option = false);
|
||||||
DropDownList GetScenRoadTypeDropDownList(RoadTramTypes rtts);
|
DropDownList GetScenRoadTypeDropDownList(RoadTramTypes rtts);
|
||||||
|
@@ -55,6 +55,10 @@
|
|||||||
#include "screenshot_gui.h"
|
#include "screenshot_gui.h"
|
||||||
#include "league_gui.h"
|
#include "league_gui.h"
|
||||||
#include "league_base.h"
|
#include "league_base.h"
|
||||||
|
#include "object.h"
|
||||||
|
#include "newgrf_object.h"
|
||||||
|
#include "newgrf_roadstop.h"
|
||||||
|
#include "newgrf_station.h"
|
||||||
|
|
||||||
#include "widgets/toolbar_widget.h"
|
#include "widgets/toolbar_widget.h"
|
||||||
|
|
||||||
@@ -84,6 +88,7 @@ enum CallBackFunction {
|
|||||||
CBF_NONE,
|
CBF_NONE,
|
||||||
CBF_PLACE_SIGN,
|
CBF_PLACE_SIGN,
|
||||||
CBF_PLACE_LANDINFO,
|
CBF_PLACE_LANDINFO,
|
||||||
|
CBF_PLACE_PICKER,
|
||||||
};
|
};
|
||||||
|
|
||||||
static CallBackFunction _last_started_action = CBF_NONE; ///< Last started user action.
|
static CallBackFunction _last_started_action = CBF_NONE; ///< Last started user action.
|
||||||
@@ -1113,7 +1118,8 @@ static CallBackFunction MenuClickNewspaper(int index)
|
|||||||
*/
|
*/
|
||||||
enum HelpMenuEntries {
|
enum HelpMenuEntries {
|
||||||
HME_LANDINFO = 0,
|
HME_LANDINFO = 0,
|
||||||
HME_CONSOLE = 2,
|
HME_PICKER,
|
||||||
|
HME_CONSOLE = 3,
|
||||||
HME_SCRIPT_DEBUG,
|
HME_SCRIPT_DEBUG,
|
||||||
HME_SCREENSHOT,
|
HME_SCREENSHOT,
|
||||||
HME_FRAMERATE,
|
HME_FRAMERATE,
|
||||||
@@ -1128,6 +1134,77 @@ enum HelpMenuEntries {
|
|||||||
HME_LAST_NON_DEV = HME_SPRITE_ALIGNER,
|
HME_LAST_NON_DEV = HME_SPRITE_ALIGNER,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void ShowBuildRailToolbarFromTile(TileIndex tile)
|
||||||
|
{
|
||||||
|
ShowBuildRailToolbar(GetRailType(tile));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ShowBuildRoadToolbarFromTile(TileIndex tile)
|
||||||
|
{
|
||||||
|
if (HasRoadTypeRoad(tile)) {
|
||||||
|
CreateRoadTramToolbarForRoadType(GetRoadTypeRoad(tile), RTT_ROAD);
|
||||||
|
} else {
|
||||||
|
CreateRoadTramToolbarForRoadType(GetRoadTypeTram(tile), RTT_TRAM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UsePickerTool(TileIndex tile)
|
||||||
|
{
|
||||||
|
switch (GetTileType(tile)) {
|
||||||
|
case MP_RAILWAY:
|
||||||
|
ShowBuildRailToolbarFromTile(tile);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MP_ROAD: {
|
||||||
|
ShowBuildRoadToolbarFromTile(tile);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MP_STATION: {
|
||||||
|
StationType station_type = GetStationType(tile);
|
||||||
|
switch (station_type) {
|
||||||
|
case STATION_RAIL:
|
||||||
|
case STATION_WAYPOINT:
|
||||||
|
ShowBuildRailStationPickerAndSelect(station_type, GetStationSpec(tile));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATION_TRUCK:
|
||||||
|
case STATION_BUS:
|
||||||
|
case STATION_ROADWAYPOINT:
|
||||||
|
ShowBuildRoadStopPickerAndSelect(station_type, GetRoadStopSpec(tile), HasRoadTypeRoad(tile) ? RTT_ROAD : RTT_TRAM);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MP_TUNNELBRIDGE:
|
||||||
|
switch (GetTunnelBridgeTransportType(tile)) {
|
||||||
|
case TRANSPORT_RAIL:
|
||||||
|
ShowBuildRailToolbarFromTile(tile);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TRANSPORT_ROAD:
|
||||||
|
ShowBuildRoadToolbarFromTile(tile);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MP_OBJECT: {
|
||||||
|
ShowBuildObjectPickerAndSelect(ObjectSpec::GetByTile(tile));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static CallBackFunction PlaceLandBlockInfo()
|
static CallBackFunction PlaceLandBlockInfo()
|
||||||
{
|
{
|
||||||
if (_last_started_action == CBF_PLACE_LANDINFO) {
|
if (_last_started_action == CBF_PLACE_LANDINFO) {
|
||||||
@@ -1139,6 +1216,18 @@ static CallBackFunction PlaceLandBlockInfo()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CallBackFunction PlacePickerTool()
|
||||||
|
{
|
||||||
|
if (_last_started_action == CBF_PLACE_PICKER) {
|
||||||
|
ResetObjectToPlace();
|
||||||
|
return CBF_NONE;
|
||||||
|
} else {
|
||||||
|
SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
|
||||||
|
SetSelectionPalette(SPR_ZONING_INNER_HIGHLIGHT_GREEN);
|
||||||
|
return CBF_PLACE_PICKER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static CallBackFunction ToolbarHelpClick(Window *w)
|
static CallBackFunction ToolbarHelpClick(Window *w)
|
||||||
{
|
{
|
||||||
PopupMainToolbMenu(w, _game_mode == GM_EDITOR ? (int)WID_TE_HELP : (int)WID_TN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? HME_LAST : HME_LAST_NON_DEV);
|
PopupMainToolbMenu(w, _game_mode == GM_EDITOR ? (int)WID_TE_HELP : (int)WID_TN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? HME_LAST : HME_LAST_NON_DEV);
|
||||||
@@ -1204,6 +1293,7 @@ static CallBackFunction MenuClickHelp(int index)
|
|||||||
{
|
{
|
||||||
switch (index) {
|
switch (index) {
|
||||||
case HME_LANDINFO: return PlaceLandBlockInfo();
|
case HME_LANDINFO: return PlaceLandBlockInfo();
|
||||||
|
case HME_PICKER: return PlacePickerTool();
|
||||||
case HME_CONSOLE: IConsoleSwitch(); break;
|
case HME_CONSOLE: IConsoleSwitch(); break;
|
||||||
case HME_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
|
case HME_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
|
||||||
case HME_SCREENSHOT: ShowScreenshotWindow(); break;
|
case HME_SCREENSHOT: ShowScreenshotWindow(); break;
|
||||||
@@ -2148,6 +2238,7 @@ struct MainToolbarWindow : Window {
|
|||||||
case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
|
case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
|
||||||
case MTHK_SIGN_LIST: ShowSignList(); break;
|
case MTHK_SIGN_LIST: ShowSignList(); break;
|
||||||
case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
|
case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
|
||||||
|
case MTHK_PICKER: cbf = PlacePickerTool(); break;
|
||||||
case MTHK_PLAN_LIST: ShowPlansWindow(); break;
|
case MTHK_PLAN_LIST: ShowPlansWindow(); break;
|
||||||
case MTHK_LINK_GRAPH_LEGEND: ShowLinkGraphLegend(); break;
|
case MTHK_LINK_GRAPH_LEGEND: ShowLinkGraphLegend(); break;
|
||||||
case MTHK_MESSAGE_HISTORY: ShowMessageHistory(); break;
|
case MTHK_MESSAGE_HISTORY: ShowMessageHistory(); break;
|
||||||
@@ -2171,6 +2262,10 @@ struct MainToolbarWindow : Window {
|
|||||||
ShowLandInfo(tile);
|
ShowLandInfo(tile);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CBF_PLACE_PICKER:
|
||||||
|
UsePickerTool(tile);
|
||||||
|
break;
|
||||||
|
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2270,6 +2365,7 @@ static Hotkey maintoolbar_hotkeys[] = {
|
|||||||
Hotkey((uint16)0, "client_list", MTHK_CLIENT_LIST),
|
Hotkey((uint16)0, "client_list", MTHK_CLIENT_LIST),
|
||||||
Hotkey((uint16)0, "sign_list", MTHK_SIGN_LIST),
|
Hotkey((uint16)0, "sign_list", MTHK_SIGN_LIST),
|
||||||
Hotkey((uint16)0, "land_info", MTHK_LANDINFO),
|
Hotkey((uint16)0, "land_info", MTHK_LANDINFO),
|
||||||
|
Hotkey((uint16)0, "picker_tool", MTHK_PICKER),
|
||||||
Hotkey('P', "plan_list", MTHK_PLAN_LIST),
|
Hotkey('P', "plan_list", MTHK_PLAN_LIST),
|
||||||
Hotkey('Y', "link_graph_legend", MTHK_LINK_GRAPH_LEGEND),
|
Hotkey('Y', "link_graph_legend", MTHK_LINK_GRAPH_LEGEND),
|
||||||
Hotkey((uint16)0, "message_history", MTHK_MESSAGE_HISTORY),
|
Hotkey((uint16)0, "message_history", MTHK_MESSAGE_HISTORY),
|
||||||
@@ -2558,6 +2654,10 @@ struct ScenarioEditorToolbarWindow : Window {
|
|||||||
ShowLandInfo(tile);
|
ShowLandInfo(tile);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CBF_PLACE_PICKER:
|
||||||
|
UsePickerTool(tile);
|
||||||
|
break;
|
||||||
|
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -45,6 +45,7 @@ enum MainToolbarHotkeys {
|
|||||||
MTHK_BUILD_TREES,
|
MTHK_BUILD_TREES,
|
||||||
MTHK_MUSIC,
|
MTHK_MUSIC,
|
||||||
MTHK_LANDINFO,
|
MTHK_LANDINFO,
|
||||||
|
MTHK_PICKER,
|
||||||
MTHK_SCRIPT_DEBUG,
|
MTHK_SCRIPT_DEBUG,
|
||||||
MTHK_SMALL_SCREENSHOT,
|
MTHK_SMALL_SCREENSHOT,
|
||||||
MTHK_ZOOMEDIN_SCREENSHOT,
|
MTHK_ZOOMEDIN_SCREENSHOT,
|
||||||
|
@@ -4633,7 +4633,12 @@ static void SetSelectionTilesDirty()
|
|||||||
|
|
||||||
void SetSelectionRed(bool b)
|
void SetSelectionRed(bool b)
|
||||||
{
|
{
|
||||||
_thd.square_palette = b ? PALETTE_SEL_TILE_RED : PAL_NONE;
|
SetSelectionPalette(b ? PALETTE_SEL_TILE_RED : PAL_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetSelectionPalette(PaletteID pal)
|
||||||
|
{
|
||||||
|
_thd.square_palette = pal;
|
||||||
SetSelectionTilesDirty();
|
SetSelectionTilesDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,6 +23,7 @@ struct ViewportDrawerDynamic;
|
|||||||
static const int TILE_HEIGHT_STEP = 50; ///< One Z unit tile height difference is displayed as 50m.
|
static const int TILE_HEIGHT_STEP = 50; ///< One Z unit tile height difference is displayed as 50m.
|
||||||
|
|
||||||
void SetSelectionRed(bool);
|
void SetSelectionRed(bool);
|
||||||
|
void SetSelectionPalette(PaletteID);
|
||||||
|
|
||||||
void ClearViewportCache(Viewport *vp);
|
void ClearViewportCache(Viewport *vp);
|
||||||
void ClearViewportLandPixelCache(Viewport *vp);
|
void ClearViewportLandPixelCache(Viewport *vp);
|
||||||
|
Reference in New Issue
Block a user