From 33390892355398730e537784be4b665f42ba01d1 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 13 Dec 2020 14:29:10 +0000 Subject: [PATCH] Add more shortcuts --- src/openrct2-ui/input/KeyboardShortcut.cpp | 634 +++++++-------------- src/openrct2-ui/input/ShortcutManager.cpp | 72 ++- src/openrct2-ui/input/ShortcutManager.h | 12 + 3 files changed, 292 insertions(+), 426 deletions(-) diff --git a/src/openrct2-ui/input/KeyboardShortcut.cpp b/src/openrct2-ui/input/KeyboardShortcut.cpp index 4aae32669d..af4b7db12d 100644 --- a/src/openrct2-ui/input/KeyboardShortcut.cpp +++ b/src/openrct2-ui/input/KeyboardShortcut.cpp @@ -79,82 +79,37 @@ void KeyboardShortcutHandleCommand(Input::Shortcut shortcut) #pragma region Shortcut Commands -static void ToggleViewFlag(int32_t viewportFlag) +static void OpenWindow(rct_windowclass wc) { - rct_window* window; - - window = window_get_main(); - if (window != nullptr) + if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)) { - window->viewport->flags ^= viewportFlag; - window->Invalidate(); + context_open_window(wc); } } -static void ShortcutCloseTopMostWindow() +static void RotateCamera(int32_t direction) { - window_close_top(); -} - -static void ShortcutCloseAllFloatingWindow() -{ - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)) - window_close_all(); - else if (gS6Info.editor_step == EditorStep::LandscapeEditor) - window_close_top(); -} - -static void ShortcutCancelConstructionMode() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - rct_window* window = window_find_by_class(WC_ERROR); - if (window != nullptr) - window_close(window); - else if (input_test_flag(INPUT_FLAG_TOOL_ACTIVE)) - tool_cancel(); -} - -static void ShortcutPauseGame() -{ - if (!(gScreenFlags & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_MANAGER))) + if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)) { - rct_window* window = window_find_by_class(WC_TOP_TOOLBAR); + auto window = window_get_main(); if (window != nullptr) { - window->Invalidate(); - window_event_mouse_up_call(window, WC_TOP_TOOLBAR__WIDX_PAUSE); + window_rotate_camera(window, direction); } } } -static void ShortcutZoomViewOut() +static void ToggleViewFlag(int32_t viewportFlag) { - main_window_zoom(false, false); -} - -static void ShortcutZoomViewIn() -{ - main_window_zoom(true, false); -} - -static void ShortcutRotateViewClockwise() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - rct_window* w = window_get_main(); - window_rotate_camera(w, 1); -} - -static void ShortcutRotateViewAnticlockwise() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - rct_window* w = window_get_main(); - window_rotate_camera(w, -1); + if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)) + { + auto window = window_get_main(); + if (window != nullptr) + { + window->viewport->flags ^= viewportFlag; + window->Invalidate(); + } + } } static void ShortcutRotateConstructionObject() @@ -221,30 +176,6 @@ static void ShortcutRotateConstructionObject() } } -static void ShortcutUndergroundViewToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_UNDERGROUND_INSIDE); -} - -static void ShortcutRemoveBaseLandToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_HIDE_BASE); -} - -static void ShortcutRemoveVerticalLandToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_HIDE_VERTICAL); -} - static void ShortcutRemoveTopBottomToolbarToggle() { if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) @@ -287,78 +218,6 @@ static void ShortcutRemoveTopBottomToolbarToggle() gfx_invalidate_screen(); } -static void ShortcutSeeThroughRidesToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_SEETHROUGH_RIDES); -} - -static void ShortcutSeeThroughSceneryToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_SEETHROUGH_SCENERY); -} - -static void ShortcutSeeThroughPathsToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_SEETHROUGH_PATHS); -} - -static void ShortcutInvisibleSupportsToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_INVISIBLE_SUPPORTS); -} - -static void ShortcutInvisiblePeopleToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_INVISIBLE_PEEPS); -} - -static void ShortcutGridlinesToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_GRIDLINES); -} - -static void ShortcutHeightMarksOnLandToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_LAND_HEIGHTS); -} - -static void ShortcutHeightMarksOnRideTracksToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_TRACK_HEIGHTS); -} - -static void ShortcutHeightMarksOnPathsToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_PATH_HEIGHTS); -} - static void ShortcutAdjustLand() { if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) @@ -533,11 +392,6 @@ static void ShortcutShowMap() context_open_window(WC_MAP); } -static void ShortcutScreenshot() -{ - gScreenshotCountdown = 2; -} - static void ShortcutReduceGameSpeed() { if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) @@ -590,14 +444,6 @@ static void ShortcutClearScenery() } } -static void ShortcutOpenChatWindow() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - chat_toggle(); -} - static void ShortcutQuickSaveGame() { // Do a quick save in playing mode and a regular save in Scenario Editor mode. In other cases, don't do anything. @@ -615,40 +461,6 @@ static void ShortcutQuickSaveGame() } } -static void ShortcutShowOptions() -{ - context_open_window(WC_OPTIONS); -} - -static void ShortcutMuteSound() -{ - OpenRCT2::Audio::ToggleAllSounds(); -} - -static void ShortcutWindowsModeToggle() -{ - platform_toggle_windowed_mode(); -} - -static void ShortcutShowMultiplayer() -{ - if (network_get_mode() != NETWORK_MODE_NONE) - context_open_window(WC_MULTIPLAYER); -} - -static void ShortcutDebugPaintToggle() -{ - rct_window* window = window_find_by_class(WC_DEBUG_PAINT); - if (window != nullptr) - { - window_close(window); - } - else - { - context_open_window(WC_DEBUG_PAINT); - } -} - static void ShortcutRideConstructionTurnLeft() { if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) @@ -754,38 +566,6 @@ static void ShortcutLoadGame() } } -static void ShortcutViewClipping() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - context_open_window(WC_VIEW_CLIPPING); -} - -static void ShortcutHighlightPathIssuesToggle() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - - ToggleViewFlag(VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES); -} - -static void ShortcutOpenTileInspector() -{ - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO || !gConfigInterface.toolbar_show_cheats) - return; - - context_open_window(WC_TILE_INSPECTOR); -} - -static void ShortcutAdvanceToNextTick() -{ - if (gScreenFlags & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_MANAGER)) - return; - - gDoSingleUpdate = true; -} - static void ShortcutOpenSceneryPicker() { if ((gScreenFlags & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) @@ -833,113 +613,21 @@ static void ShortcutScaleDown() } // Tile inspector shortcuts -static void ShortcutInsertCorruptElement() +static void TileInspectorMouseUp(rct_widgetindex widgetIndex) { - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_BUTTON_CORRUPT) - && w->widgets[WC_TILE_INSPECTOR__WIDX_BUTTON_CORRUPT].type != WindowWidgetType::Empty) + auto w = window_find_by_class(WC_TILE_INSPECTOR); + if (w != nullptr && !WidgetIsDisabled(w, widgetIndex) && w->widgets[widgetIndex].type != WindowWidgetType::Empty) { - window_event_mouse_up_call(w, WC_TILE_INSPECTOR__WIDX_BUTTON_CORRUPT); - return; + window_event_mouse_up_call(w, widgetIndex); } } -static void ShortcutCopyElement() +static void TileInspectorMouseDown(rct_widgetindex widgetIndex) { - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_BUTTON_COPY) - && w->widgets[WC_TILE_INSPECTOR__WIDX_BUTTON_COPY].type != WindowWidgetType::Empty) + auto w = window_find_by_class(WC_TILE_INSPECTOR); + if (w != nullptr && !WidgetIsDisabled(w, widgetIndex) && w->widgets[widgetIndex].type != WindowWidgetType::Empty) { - window_event_mouse_up_call(w, WC_TILE_INSPECTOR__WIDX_BUTTON_COPY); - return; - } -} - -static void ShortcutPasteElement() -{ - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_BUTTON_PASTE) - && w->widgets[WC_TILE_INSPECTOR__WIDX_BUTTON_PASTE].type != WindowWidgetType::Empty) - { - window_event_mouse_up_call(w, WC_TILE_INSPECTOR__WIDX_BUTTON_PASTE); - return; - } -} - -static void ShortcutRemoveElement() -{ - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_BUTTON_REMOVE) - && w->widgets[WC_TILE_INSPECTOR__WIDX_BUTTON_REMOVE].type != WindowWidgetType::Empty) - { - window_event_mouse_up_call(w, WC_TILE_INSPECTOR__WIDX_BUTTON_REMOVE); - return; - } -} - -static void ShortcutMoveElementUp() -{ - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_BUTTON_MOVE_UP) - && w->widgets[WC_TILE_INSPECTOR__WIDX_BUTTON_MOVE_UP].type != WindowWidgetType::Empty) - { - window_event_mouse_up_call(w, WC_TILE_INSPECTOR__WIDX_BUTTON_MOVE_UP); - return; - } -} - -static void ShortcutMoveElementDown() -{ - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_BUTTON_MOVE_DOWN) - && w->widgets[WC_TILE_INSPECTOR__WIDX_BUTTON_MOVE_DOWN].type != WindowWidgetType::Empty) - { - window_event_mouse_up_call(w, WC_TILE_INSPECTOR__WIDX_BUTTON_MOVE_DOWN); - return; - } -} - -static void ShortcutIncreaseXCoord() -{ - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_SPINNER_X_INCREASE) - && w->widgets[WC_TILE_INSPECTOR__WIDX_SPINNER_X_INCREASE].type != WindowWidgetType::Empty) - { - window_event_mouse_down_call(w, WC_TILE_INSPECTOR__WIDX_SPINNER_X_INCREASE); - return; - } -} - -static void ShortcutDecreaseXCoord() -{ - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_SPINNER_X_DECREASE) - && w->widgets[WC_TILE_INSPECTOR__WIDX_SPINNER_X_DECREASE].type != WindowWidgetType::Empty) - { - window_event_mouse_down_call(w, WC_TILE_INSPECTOR__WIDX_SPINNER_X_DECREASE); - return; - } -} - -static void ShortcutIncreaseYCoord() -{ - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_SPINNER_Y_INCREASE) - && w->widgets[WC_TILE_INSPECTOR__WIDX_SPINNER_Y_INCREASE].type != WindowWidgetType::Empty) - { - window_event_mouse_down_call(w, WC_TILE_INSPECTOR__WIDX_SPINNER_Y_INCREASE); - return; - } -} - -static void ShortcutDecreaseYCoord() -{ - rct_window* w = window_find_by_class(WC_TILE_INSPECTOR); - if (w != nullptr && !WidgetIsDisabled(w, WC_TILE_INSPECTOR__WIDX_SPINNER_Y_DECREASE) - && w->widgets[WC_TILE_INSPECTOR__WIDX_SPINNER_Y_DECREASE].type != WindowWidgetType::Empty) - { - window_event_mouse_down_call(w, WC_TILE_INSPECTOR__WIDX_SPINNER_Y_DECREASE); - return; + window_event_mouse_down_call(w, widgetIndex); } } @@ -1041,25 +729,6 @@ namespace { using namespace OpenRCT2::Input; const shortcut_action shortcut_table[ShortcutsCount] = { - ShortcutCloseTopMostWindow, - ShortcutCloseAllFloatingWindow, - ShortcutCancelConstructionMode, - ShortcutPauseGame, - ShortcutZoomViewOut, - ShortcutZoomViewIn, - ShortcutRotateViewClockwise, - ShortcutRotateViewAnticlockwise, - ShortcutRotateConstructionObject, - ShortcutUndergroundViewToggle, - ShortcutRemoveBaseLandToggle, - ShortcutRemoveVerticalLandToggle, - ShortcutSeeThroughRidesToggle, - ShortcutSeeThroughSceneryToggle, - ShortcutInvisibleSupportsToggle, - ShortcutInvisiblePeopleToggle, - ShortcutHeightMarksOnLandToggle, - ShortcutHeightMarksOnRideTracksToggle, - ShortcutHeightMarksOnPathsToggle, ShortcutAdjustLand, ShortcutAdjustWater, ShortcutBuildScenery, @@ -1073,7 +742,6 @@ namespace ShortcutShowStaffList, ShortcutShowRecentMessages, ShortcutShowMap, - ShortcutScreenshot, // new ShortcutReduceGameSpeed, @@ -1084,15 +752,8 @@ namespace nullptr, nullptr, nullptr, - ShortcutOpenChatWindow, ShortcutQuickSaveGame, - ShortcutShowOptions, - ShortcutMuteSound, - ShortcutWindowsModeToggle, - ShortcutShowMultiplayer, nullptr, - ShortcutDebugPaintToggle, - ShortcutSeeThroughPathsToggle, ShortcutRideConstructionTurnLeft, ShortcutRideConstructionTurnRight, ShortcutRideConstructionUseTrackDefault, @@ -1107,24 +768,9 @@ namespace ShortcutRideConstructionDemolishCurrent, ShortcutLoadGame, ShortcutClearScenery, - ShortcutGridlinesToggle, - ShortcutViewClipping, - ShortcutHighlightPathIssuesToggle, - ShortcutOpenTileInspector, - ShortcutAdvanceToNextTick, ShortcutOpenSceneryPicker, ShortcutScaleUp, ShortcutScaleDown, - ShortcutInsertCorruptElement, - ShortcutCopyElement, - ShortcutPasteElement, - ShortcutRemoveElement, - ShortcutMoveElementUp, - ShortcutMoveElementDown, - ShortcutIncreaseXCoord, - ShortcutDecreaseXCoord, - ShortcutIncreaseYCoord, - ShortcutDecreaseYCoord, ShortcutIncreaseElementHeight, ShortcutDecreaseElementHeight, ShortcutToggleClearanceChecks, @@ -1138,62 +784,202 @@ using namespace OpenRCT2::Ui; void ShortcutManager::RegisterDefaultShortcuts() { // clang-format off - RegisterShortcut(RegisteredShortcut("interface.close_top", STR_SHORTCUT_CLOSE_TOP_MOST_WINDOW, "BACKSPACE", []() { window_close_top(); })); - RegisterShortcut(RegisteredShortcut("interface.close_all", STR_SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS, "SHIFT+BACKSPACE", []() { - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)) - window_close_all(); - else if (gS6Info.editor_step == EDITOR_STEP_LANDSCAPE_EDITOR) - window_close_top(); - })); - RegisterShortcut(RegisteredShortcut("interface.cancel_construction", STR_SHORTCUT_CANCEL_CONSTRUCTION_MODE, "ESCAPE", []() { - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; - rct_window* window = window_find_by_class(WC_ERROR); - if (window != nullptr) - window_close(window); - else if (input_test_flag(INPUT_FLAG_TOOL_ACTIVE)) - tool_cancel(); - })); - RegisterShortcut(RegisteredShortcut("interface.pause", STR_SHORTCUT_PAUSE_GAME, "PAUSE", []() { + // Interface 0 + RegisterShortcut("interface0.close_top", STR_SHORTCUT_CLOSE_TOP_MOST_WINDOW, "BACKSPACE", []() { window_close_top(); }); + RegisterShortcut("interface0.close_all", STR_SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS, "SHIFT+BACKSPACE", []() { + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)) + { + window_close_all(); + } + else if (gS6Info.editor_step == EditorStep::LandscapeEditor) + { + window_close_top(); + } + }); + RegisterShortcut("interface0.cancel_construction", STR_SHORTCUT_CANCEL_CONSTRUCTION_MODE, "ESCAPE", []() { + if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)) + { + auto window = window_find_by_class(WC_ERROR); + if (window != nullptr) + { + window_close(window); + } + else if (input_test_flag(INPUT_FLAG_TOOL_ACTIVE)) + { + tool_cancel(); + } + } + }); + RegisterShortcut("interface0.toggle_toolbars", STR_SHORTCUT_TOGGLE_VISIBILITY_OF_TOOLBARS, "T", []() { + ShortcutRemoveTopBottomToolbarToggle(); + }); + + // Interface 1 + RegisterShortcut("interface1.pause", STR_SHORTCUT_PAUSE_GAME, "PAUSE", []() { if (!(gScreenFlags & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_MANAGER))) { - rct_window* window = window_find_by_class(WC_TOP_TOOLBAR); + auto window = window_find_by_class(WC_TOP_TOOLBAR); if (window != nullptr) { window->Invalidate(); window_event_mouse_up_call(window, WC_TOP_TOOLBAR__WIDX_PAUSE); } } - })); - RegisterShortcut(RegisteredShortcut("interface.zoom_out", STR_SHORTCUT_ZOOM_VIEW_OUT, "PAGEUP", []() { - main_window_zoom(false, false); - })); - RegisterShortcut(RegisteredShortcut("interface.zoom_in", STR_SHORTCUT_ZOOM_VIEW_IN, "PAGEDOWN", []() { - main_window_zoom(true, false); - })); - RegisterShortcut(RegisteredShortcut("interface.rotate_clockwise", STR_SHORTCUT_ROTATE_VIEW_CLOCKWISE, "RETURN", "MOUSE:5", []() { - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; + }); + RegisterShortcut("interface1.decrease_speed", STR_SHORTCUT_REDUCE_GAME_SPEED , "-", []() { + if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) && network_get_mode() == NETWORK_MODE_NONE) + { + game_reduce_game_speed(); + } + }); + RegisterShortcut("interface1.increase_speed", STR_SHORTCUT_INCREASE_GAME_SPEED , "=", []() { + if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) && network_get_mode() == NETWORK_MODE_NONE) + { + game_increase_game_speed(); + } + }); + RegisterShortcut("interface1.load_game", STR_LOAD_GAME, "CTRL+L", []() { + if (!(gScreenFlags & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER))) + { + auto loadOrQuitAction = LoadOrQuitAction(LoadOrQuitModes::OpenSavePrompt); + GameActions::Execute(&loadOrQuitAction); + } + }); + RegisterShortcut("interface1.save_game", STR_LOAD_GAME, "CTRL+F10", []() { ShortcutQuickSaveGame(); }); + RegisterShortcut("interface1.show_options", STR_SHORTCUT_SHOW_OPTIONS, []() { context_open_window(WC_OPTIONS); }); + RegisterShortcut("interface1.screenshot", STR_SHORTCUT_SCREENSHOT, "CTRL+S", []() { gScreenshotCountdown = 2; }); + RegisterShortcut("interface1.mute", STR_SHORTCUT_MUTE_SOUND, []() { OpenRCT2::Audio::ToggleAllSounds(); }); - rct_window* w = window_get_main(); - window_rotate_camera(w, 1); - })); - RegisterShortcut(RegisteredShortcut("interface.rotate_anticlockwise", STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE, "SHIFT+RETURN", "MOUSE:4", []() { - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; + // Interface 2 + RegisterShortcut("interface2.open_cheats", STR_SHORTCUT_OPEN_CHEATS_WINDOW, "CTRL+ALT+C", []() { OpenWindow(WC_CHEATS); }); + RegisterShortcut("interface2.disable_clearance", STR_SHORTCUT_TOGGLE_CLEARANCE_CHECKS, []() { ShortcutToggleClearanceChecks(); }); - rct_window* w = window_get_main(); - window_rotate_camera(w, -1); - })); - RegisterShortcut(RegisteredShortcut("interface.rotate_construction", STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT, "Z", []() { - ShortcutRotateConstructionObject(); - })); - RegisterShortcut(RegisteredShortcut("view.underground_view_toggle", STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE, "1", []() { - if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) - return; + // Interface 3 + RegisterShortcut("interface3.zoom_out", STR_SHORTCUT_ZOOM_VIEW_OUT, "PAGEUP", []() { main_window_zoom(false, false); }); + RegisterShortcut("interface3.zoom_in", STR_SHORTCUT_ZOOM_VIEW_IN, "PAGEDOWN", []() { main_window_zoom(true, false); }); + RegisterShortcut("interface3.rotate_clockwise", STR_SHORTCUT_ROTATE_VIEW_CLOCKWISE, "RETURN", "MOUSE:5", []() { RotateCamera(1); }); + RegisterShortcut("interface3.rotate_anticlockwise", STR_SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE, "SHIFT+RETURN", "MOUSE:4", []() { RotateCamera(-1); }); + RegisterShortcut("interface3.show_map", STR_SHORTCUT_TOGGLE_CLEARANCE_CHECKS, "TAB", []() { ShortcutShowMap(); }); - ToggleViewFlag(VIEWPORT_FLAG_UNDERGROUND_INSIDE); - })); + // Interface 4 + RegisterShortcut("interface4.clear_scenery", STR_SHORTCUT_CLEAR_SCENERY, "B", []() { ShortcutClearScenery(); }); + RegisterShortcut("interface4.adjust_land", STR_SHORTCUT_ADJUST_LAND, "F1", []() { ShortcutAdjustLand(); }); + RegisterShortcut("interface4.adjust_water", STR_SHORTCUT_ADJUST_WATER, "F2", []() { ShortcutAdjustWater(); }); + RegisterShortcut("interface4.build_scenery", STR_SHORTCUT_BUILD_SCENERY, "F3", []() { ShortcutBuildScenery(); }); + RegisterShortcut("interface4.build_footpaths", STR_SHORTCUT_BUILD_PATHS, "F4", []() { ShortcutBuildPaths(); }); + RegisterShortcut("interface4.build_new_ride", STR_SHORTCUT_BUILD_NEW_RIDE, "F5", []() { ShortcutBuildNewRide(); }); + + // Interface 5 + RegisterShortcut("interface5.show_finances", STR_SHORTCUT_SHOW_FINANCIAL_INFORMATION, "F", []() { OpenWindow(WC_FINANCES); }); + RegisterShortcut("interface5.show_research", STR_SHORTCUT_SHOW_RESEARCH_INFORMATION, "D", []() { OpenWindow(WC_RESEARCH); }); + RegisterShortcut("interface5.show_rides", STR_SHORTCUT_SHOW_RIDES_LIST, "R", []() { OpenWindow(WC_RIDE_LIST); }); + RegisterShortcut("interface5.show_park", STR_SHORTCUT_SHOW_PARK_INFORMATION, "P", []() { OpenWindow(WC_PARK_INFORMATION); }); + RegisterShortcut("interface5.show_guests", STR_SHORTCUT_SHOW_GUEST_LIST, "G", []() { OpenWindow(WC_GUEST_LIST); }); + RegisterShortcut("interface5.show_staff", STR_SHORTCUT_SHOW_STAFF_LIST, "S", []() { OpenWindow(WC_STAFF_LIST); }); + RegisterShortcut("interface5.show_messages", STR_SHORTCUT_SHOW_RECENT_MESSAGES, "M", []() { OpenWindow(WC_RECENT_NEWS); }); + + // Multiplayer + RegisterShortcut("multiplayer.show", STR_SHORTCUT_SHOW_MULTIPLAYER, []() { + if (network_get_mode() != NETWORK_MODE_NONE) + { + OpenWindow(WC_MULTIPLAYER); + } + }); + RegisterShortcut("multiplayer.chat", STR_SEND_MESSAGE, "C", []() { + if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)) + { + chat_toggle(); + } + }); + + // View + RegisterShortcut("view.show_underground", STR_SHORTCUT_UNDERGROUND_VIEW_TOGGLE, "1", []() { ToggleViewFlag(VIEWPORT_FLAG_UNDERGROUND_INSIDE); }); + RegisterShortcut("view.hide_base_land", STR_SHORTCUT_REMOVE_BASE_LAND_TOGGLE, "H", []() { ToggleViewFlag(VIEWPORT_FLAG_HIDE_BASE); }); + RegisterShortcut("view.hide_vertical_land", STR_SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE, "V", []() { ToggleViewFlag(VIEWPORT_FLAG_HIDE_BASE); }); + RegisterShortcut("view.transparent_rides", STR_SHORTCUT_SEE_THROUGH_RIDES_TOGGLE, "3", []() { ToggleViewFlag(VIEWPORT_FLAG_SEETHROUGH_RIDES); }); + RegisterShortcut("view.transparent_scenery", STR_SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE, "4", []() { ToggleViewFlag(VIEWPORT_FLAG_SEETHROUGH_SCENERY); }); + RegisterShortcut("view.transparent_scenery", STR_SHORTCUT_SEE_THROUGH_PATHS_TOGGLE, []() { ToggleViewFlag(VIEWPORT_FLAG_SEETHROUGH_PATHS); }); + RegisterShortcut("view.hide_supports", STR_SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE, "5", []() { ToggleViewFlag(VIEWPORT_FLAG_INVISIBLE_SUPPORTS); }); + RegisterShortcut("view.hide_peeps", STR_SHORTCUT_INVISIBLE_PEOPLE_TOGGLE, "6", []() { ToggleViewFlag(VIEWPORT_FLAG_INVISIBLE_PEEPS); }); + RegisterShortcut("view.show_land_height", STR_SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE, "8", []() { ToggleViewFlag(VIEWPORT_FLAG_LAND_HEIGHTS); }); + RegisterShortcut("view.show_track_height", STR_SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE, "9", []() { ToggleViewFlag(VIEWPORT_FLAG_TRACK_HEIGHTS); }); + RegisterShortcut("view.show_footpath_height", STR_SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE, "0", []() { ToggleViewFlag(VIEWPORT_FLAG_PATH_HEIGHTS); }); + RegisterShortcut("view.toggle_cut_away", STR_SHORTCUT_VIEW_CLIPPING, []() { OpenWindow(WC_VIEW_CLIPPING); }); + RegisterShortcut("view.highlight_path_issues", STR_SHORTCUT_HIGHLIGHT_PATH_ISSUES_TOGGLE, "I", []() { ToggleViewFlag(VIEWPORT_FLAG_PATH_HEIGHTS); }); + RegisterShortcut("view.show_gridlines", STR_SHORTCUT_GRIDLINES_DISPLAY_TOGGLE, "7", []() { ToggleViewFlag(VIEWPORT_FLAG_GRIDLINES); }); + + // Interface 6 + RegisterShortcut("interface6.open_scenery", STR_SHORTCUT_OPEN_SCENERY_PICKER, []() { ShortcutBuildScenery(); }); + RegisterShortcut("interface6.rotate_construction", STR_SHORTCUT_ROTATE_CONSTRUCTION_OBJECT, "Z", []() { ShortcutRotateConstructionObject(); }); + + // Ride construction + + // Map scrolling + RegisterShortcut("scroll.up", STR_SHORTCUT_SCROLL_MAP_UP, "UP", []() { }); + RegisterShortcut("scroll.left", STR_SHORTCUT_SCROLL_MAP_LEFT, "LEFT", []() { }); + RegisterShortcut("scroll.right", STR_SHORTCUT_SCROLL_MAP_RIGHT, "RIGHT", []() { }); + RegisterShortcut("scroll.down", STR_SHORTCUT_SCROLL_MAP_DOWN, "DOWN", []() { }); + + // Window scale + RegisterShortcut("scale.toggle_window_mode", STR_SHORTCUT_WINDOWED_MODE_TOGGLE, "ALT+RETURN", []() { platform_toggle_windowed_mode(); }); + RegisterShortcut("scale.increase", STR_SHORTCUT_SCALE_UP, []() { ShortcutScaleUp(); }); + RegisterShortcut("scale.decrease", STR_SHORTCUT_SCALE_DOWN, []() { ShortcutScaleDown(); }); + + // Ride construction + RegisterShortcut("rideconstruction.turn_left", STR_SHORTCUT_RIDE_CONSTRUCTION_TURN_LEFT, "KEYPAD 4", []() { window_ride_construction_keyboard_shortcut_turn_left(); }); + RegisterShortcut("rideconstruction.turn_right", STR_SHORTCUT_RIDE_CONSTRUCTION_TURN_RIGHT, "KEYPAD 6", []() { window_ride_construction_keyboard_shortcut_turn_right(); }); + RegisterShortcut("rideconstruction.default", STR_SHORTCUT_RIDE_CONSTRUCTION_USE_TRACK_DEFAULT, "KEYPAD 5", []() { window_ride_construction_keyboard_shortcut_use_track_default(); }); + RegisterShortcut("rideconstruction.slope_down", STR_SHORTCUT_RIDE_CONSTRUCTION_SLOPE_DOWN, "KEYPAD 2", []() { window_ride_construction_keyboard_shortcut_slope_down(); }); + RegisterShortcut("rideconstruction.slope_up", STR_SHORTCUT_RIDE_CONSTRUCTION_SLOPE_UP, "KEYPAD 8", []() { window_ride_construction_keyboard_shortcut_slope_up(); }); + RegisterShortcut("rideconstruction.chain_lift", STR_SHORTCUT_RIDE_CONSTRUCTION_CHAIN_LIFT_TOGGLE, "KEYPAD +", []() { window_ride_construction_keyboard_shortcut_chain_lift_toggle(); }); + RegisterShortcut("rideconstruction.bank_left", STR_SHORTCUT_RIDE_CONSTRUCTION_BANK_LEFT, "KEYPAD 1", []() { window_ride_construction_keyboard_shortcut_bank_left(); }); + RegisterShortcut("rideconstruction.bank_right", STR_SHORTCUT_RIDE_CONSTRUCTION_BANK_RIGHT, "KEYPAD 3", []() { window_ride_construction_keyboard_shortcut_bank_right(); }); + RegisterShortcut("rideconstruction.previous", STR_SHORTCUT_RIDE_CONSTRUCTION_PREVIOUS_TRACK, "KEYPAD 7", []() { window_ride_construction_keyboard_shortcut_previous_track(); }); + RegisterShortcut("rideconstruction.next", STR_SHORTCUT_RIDE_CONSTRUCTION_NEXT_TRACK, "KEYPAD 9", []() { window_ride_construction_keyboard_shortcut_next_track(); }); + RegisterShortcut("rideconstruction.build", STR_SHORTCUT_RIDE_CONSTRUCTION_BUILD_CURRENT, "KEYPAD 0", []() { window_ride_construction_keyboard_shortcut_build_current(); }); + RegisterShortcut("rideconstruction.demolish", STR_SHORTCUT_RIDE_CONSTRUCTION_DEMOLISH_CURRENT, "KEYPAD -", []() { window_ride_construction_keyboard_shortcut_demolish_current(); }); + + // Tile inspector + RegisterShortcut("tileinspector.open", STR_SHORTCUT_OPEN_TILE_INSPECTOR, []() { + if (gConfigInterface.toolbar_show_cheats) + { + OpenWindow(WC_TILE_INSPECTOR); + } + }); + RegisterShortcut("tileinspector.insert_corrupt", STR_SHORTCUT_INSERT_CORRPUT_ELEMENT, []() { TileInspectorMouseUp(WC_TILE_INSPECTOR__WIDX_BUTTON_CORRUPT); }); + RegisterShortcut("tileinspector.copy", STR_SHORTCUT_COPY_ELEMENT, []() { TileInspectorMouseUp(WC_TILE_INSPECTOR__WIDX_BUTTON_COPY); }); + RegisterShortcut("tileinspector.paste", STR_SHORTCUT_PASTE_ELEMENT, []() { TileInspectorMouseUp(WC_TILE_INSPECTOR__WIDX_BUTTON_PASTE); }); + RegisterShortcut("tileinspector.remove", STR_SHORTCUT_REMOVE_ELEMENT, []() { TileInspectorMouseUp(WC_TILE_INSPECTOR__WIDX_BUTTON_REMOVE); }); + RegisterShortcut("tileinspector.move_up", STR_SHORTCUT_MOVE_ELEMENT_UP, []() { TileInspectorMouseUp(WC_TILE_INSPECTOR__WIDX_BUTTON_MOVE_UP); }); + RegisterShortcut("tileinspector.move_down", STR_SHORTCUT_MOVE_ELEMENT_DOWN, []() { TileInspectorMouseUp(WC_TILE_INSPECTOR__WIDX_BUTTON_MOVE_DOWN); }); + RegisterShortcut("tileinspector.increase_x", STR_SHORTCUT_INCREASE_X_COORD, []() { TileInspectorMouseDown(WC_TILE_INSPECTOR__WIDX_SPINNER_X_INCREASE); }); + RegisterShortcut("tileinspector.decrease_x", STR_SHORTCUT_DECREASE_X_COORD, []() { TileInspectorMouseDown(WC_TILE_INSPECTOR__WIDX_SPINNER_X_DECREASE); }); + RegisterShortcut("tileinspector.increase_y", STR_SHORTCUT_INCREASE_Y_COORD, []() { TileInspectorMouseDown(WC_TILE_INSPECTOR__WIDX_SPINNER_Y_INCREASE); }); + RegisterShortcut("tileinspector.decrease_y", STR_SHORTCUT_DECREASE_Y_COORD, []() { TileInspectorMouseDown(WC_TILE_INSPECTOR__WIDX_SPINNER_Y_DECREASE); }); + RegisterShortcut("tileinspector.increase_height", STR_SHORTCUT_INCREASE_ELEM_HEIGHT, []() { ShortcutIncreaseElementHeight(); }); + RegisterShortcut("tileinspector.decrease_height", STR_SHORTCUT_DECREASE_ELEM_HEIGHT, []() { ShortcutDecreaseElementHeight(); }); + + // Debug + RegisterShortcut("debug.advance_tick", STR_ADVANCE_TO_NEXT_TICK, []() { + if (!(gScreenFlags & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_MANAGER))) + { + gDoSingleUpdate = true; + } + }); + RegisterShortcut("debug.toggle_paint_debug_window", STR_SHORTCUT_DEBUG_PAINT_TOGGLE, []() { + if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)) + { + auto window = window_find_by_class(WC_DEBUG_PAINT); + if (window != nullptr) + { + window_close(window); + } + else + { + context_open_window(WC_DEBUG_PAINT); + } + } + }); // clang-format on } diff --git a/src/openrct2-ui/input/ShortcutManager.cpp b/src/openrct2-ui/input/ShortcutManager.cpp index 05822150d9..68b0ac0445 100644 --- a/src/openrct2-ui/input/ShortcutManager.cpp +++ b/src/openrct2-ui/input/ShortcutManager.cpp @@ -84,18 +84,36 @@ static uint32_t ParseKey(const std::string_view& text) return 0; } +size_t FindPlus(std::string_view s, size_t index) +{ + while (true) + { + index = s.find('+', index); + if (index != std::string::npos && index != 0 && s[index - 1] == ' ') + { + index++; + continue; + } + else + { + break; + } + } + return index; +} + ShortcutInput::ShortcutInput(const std::string_view& value) { uint32_t modifiers = 0; size_t index = 0; - auto sepIndex = value.find('+', index); + auto sepIndex = FindPlus(value, index); while (sepIndex != std::string::npos) { auto text = value.substr(index, sepIndex); auto mod = ParseModifier(text); modifiers |= mod; index = sepIndex + 1; - sepIndex = value.find('+', index); + sepIndex = FindPlus(value, index); } auto kind = ShortcutInputKind::Keyboard; @@ -156,6 +174,56 @@ std::string ShortcutInput::ToString() const case SDLK_PAGEDOWN: result += "PAGE DOWN"; break; + + case SDLK_KP_DIVIDE: + result += "NUMPAD /"; + break; + case SDLK_KP_MULTIPLY: + result += "NUMPAD *"; + break; + case SDLK_KP_MINUS: + result += "NUMPAD -"; + break; + case SDLK_KP_PLUS: + result += "NUMPAD +"; + break; + case SDLK_KP_ENTER: + result += "NUMPAD RETURN"; + break; + case SDLK_KP_1: + result += "NUMPAD 1"; + break; + case SDLK_KP_2: + result += "NUMPAD 2"; + break; + case SDLK_KP_3: + result += "NUMPAD 3"; + break; + case SDLK_KP_4: + result += "NUMPAD 4"; + break; + case SDLK_KP_5: + result += "NUMPAD 5"; + break; + case SDLK_KP_6: + result += "NUMPAD 6"; + break; + case SDLK_KP_7: + result += "NUMPAD 7"; + break; + case SDLK_KP_8: + result += "NUMPAD 8"; + break; + case SDLK_KP_9: + result += "NUMPAD 9"; + break; + case SDLK_KP_0: + result += "NUMPAD 0"; + break; + case SDLK_KP_PERIOD: + result += "NUMPAD ."; + break; + default: if (Key & SDLK_SCANCODE_MASK) { diff --git a/src/openrct2-ui/input/ShortcutManager.h b/src/openrct2-ui/input/ShortcutManager.h index c86eff50a0..baf5427485 100644 --- a/src/openrct2-ui/input/ShortcutManager.h +++ b/src/openrct2-ui/input/ShortcutManager.h @@ -17,6 +17,7 @@ #include #include #include +#include #include namespace OpenRCT2::Ui @@ -56,6 +57,13 @@ namespace OpenRCT2::Ui std::function Action; RegisteredShortcut() = default; + RegisteredShortcut(const std::string_view& id, rct_string_id localisedName, const std::function& action) + : Id(id) + , LocalisedName(localisedName) + , Action(action) + { + } + RegisteredShortcut( const std::string_view& id, rct_string_id localisedName, const std::string_view& defaultChord, const std::function& action) @@ -97,6 +105,10 @@ namespace OpenRCT2::Ui ShortcutManager(const ShortcutManager&) = delete; void RegisterShortcut(RegisteredShortcut&& shortcut); + template void RegisterShortcut(Args&&... args) + { + RegisterShortcut(RegisteredShortcut(std::forward(args)...)); + } void RegisterDefaultShortcuts(); RegisteredShortcut* GetShortcut(std::string_view id); void SetPendingShortcutChange(std::string_view id);