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:
Jonathan G Rennison
2023-06-05 19:37:14 +01:00
parent 665a4ca55b
commit 61e9c3084f
11 changed files with 333 additions and 44 deletions

View File

@@ -55,6 +55,10 @@
#include "screenshot_gui.h"
#include "league_gui.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"
@@ -84,6 +88,7 @@ enum CallBackFunction {
CBF_NONE,
CBF_PLACE_SIGN,
CBF_PLACE_LANDINFO,
CBF_PLACE_PICKER,
};
static CallBackFunction _last_started_action = CBF_NONE; ///< Last started user action.
@@ -1113,7 +1118,8 @@ static CallBackFunction MenuClickNewspaper(int index)
*/
enum HelpMenuEntries {
HME_LANDINFO = 0,
HME_CONSOLE = 2,
HME_PICKER,
HME_CONSOLE = 3,
HME_SCRIPT_DEBUG,
HME_SCREENSHOT,
HME_FRAMERATE,
@@ -1128,6 +1134,77 @@ enum HelpMenuEntries {
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()
{
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)
{
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) {
case HME_LANDINFO: return PlaceLandBlockInfo();
case HME_PICKER: return PlacePickerTool();
case HME_CONSOLE: IConsoleSwitch(); break;
case HME_SCRIPT_DEBUG: ShowScriptDebugWindow(); break;
case HME_SCREENSHOT: ShowScreenshotWindow(); break;
@@ -2148,6 +2238,7 @@ struct MainToolbarWindow : Window {
case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
case MTHK_SIGN_LIST: ShowSignList(); break;
case MTHK_LANDINFO: cbf = PlaceLandBlockInfo(); break;
case MTHK_PICKER: cbf = PlacePickerTool(); break;
case MTHK_PLAN_LIST: ShowPlansWindow(); break;
case MTHK_LINK_GRAPH_LEGEND: ShowLinkGraphLegend(); break;
case MTHK_MESSAGE_HISTORY: ShowMessageHistory(); break;
@@ -2171,6 +2262,10 @@ struct MainToolbarWindow : Window {
ShowLandInfo(tile);
break;
case CBF_PLACE_PICKER:
UsePickerTool(tile);
break;
default: NOT_REACHED();
}
}
@@ -2270,6 +2365,7 @@ static Hotkey maintoolbar_hotkeys[] = {
Hotkey((uint16)0, "client_list", MTHK_CLIENT_LIST),
Hotkey((uint16)0, "sign_list", MTHK_SIGN_LIST),
Hotkey((uint16)0, "land_info", MTHK_LANDINFO),
Hotkey((uint16)0, "picker_tool", MTHK_PICKER),
Hotkey('P', "plan_list", MTHK_PLAN_LIST),
Hotkey('Y', "link_graph_legend", MTHK_LINK_GRAPH_LEGEND),
Hotkey((uint16)0, "message_history", MTHK_MESSAGE_HISTORY),
@@ -2558,6 +2654,10 @@ struct ScenarioEditorToolbarWindow : Window {
ShowLandInfo(tile);
break;
case CBF_PLACE_PICKER:
UsePickerTool(tile);
break;
default: NOT_REACHED();
}
}