From 2b3aabb8e4f19b453e5a545490e8b46b7e06a928 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 16 Jan 2021 18:04:58 +0000 Subject: [PATCH] Remove old shortcut code and fix issues --- src/openrct2-ui/WindowManager.cpp | 10 +- src/openrct2-ui/input/InputManager.h | 1 + src/openrct2-ui/input/KeyboardShortcuts.cpp | 378 ------------------ src/openrct2-ui/input/KeyboardShortcuts.h | 165 -------- src/openrct2-ui/input/ShortcutInput.cpp | 1 + src/openrct2-ui/input/ShortcutManager.cpp | 37 +- src/openrct2-ui/input/ShortcutManager.h | 1 + .../{KeyboardShortcut.cpp => Shortcuts.cpp} | 5 +- src/openrct2-ui/libopenrct2ui.vcxproj | 4 +- src/openrct2-ui/scripting/CustomMenu.cpp | 1 + src/openrct2-ui/windows/ShortcutKeys.cpp | 19 +- src/openrct2-ui/windows/Window.h | 1 - src/openrct2/network/NetworkBase.cpp | 2 +- src/openrct2/ui/DummyWindowManager.cpp | 2 +- src/openrct2/ui/WindowManager.h | 3 +- 15 files changed, 46 insertions(+), 584 deletions(-) delete mode 100644 src/openrct2-ui/input/KeyboardShortcuts.cpp delete mode 100644 src/openrct2-ui/input/KeyboardShortcuts.h rename src/openrct2-ui/input/{KeyboardShortcut.cpp => Shortcuts.cpp} (99%) diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index a393fefc8a..c7fa4563f5 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -9,11 +9,11 @@ #include "WindowManager.h" -#include "input/KeyboardShortcuts.h" #include "interface/Theme.h" #include "windows/Window.h" #include +#include #include #include #include @@ -520,11 +520,11 @@ public: inputManager.Process(); } - std::string GetKeyboardShortcutString(int32_t shortcut) override + std::string GetKeyboardShortcutString(std::string_view shortcutId) override { - utf8 buffer[256]; - KeyboardShortcutsFormatString(buffer, sizeof(buffer), shortcut); - return std::string(buffer); + auto& shortcutManager = GetShortcutManager(); + auto* shortcut = shortcutManager.GetShortcut(shortcutId); + return shortcut != nullptr ? shortcut->GetDisplayString() : std::string(); } void SetMainView(const ScreenCoordsXY& viewPos, ZoomLevel zoom, int32_t rotation) override diff --git a/src/openrct2-ui/input/InputManager.h b/src/openrct2-ui/input/InputManager.h index 9ba9ba77b4..b5111e9e1f 100644 --- a/src/openrct2-ui/input/InputManager.h +++ b/src/openrct2-ui/input/InputManager.h @@ -11,6 +11,7 @@ #include #include +#include typedef struct _SDL_Joystick SDL_Joystick; typedef union SDL_Event SDL_Event; diff --git a/src/openrct2-ui/input/KeyboardShortcuts.cpp b/src/openrct2-ui/input/KeyboardShortcuts.cpp deleted file mode 100644 index 1f98cb4432..0000000000 --- a/src/openrct2-ui/input/KeyboardShortcuts.cpp +++ /dev/null @@ -1,378 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2014-2020 OpenRCT2 developers - * - * For a complete list of all authors, please refer to contributors.md - * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 - * - * OpenRCT2 is licensed under the GNU General Public License version 3. - *****************************************************************************/ - -#include "KeyboardShortcuts.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace OpenRCT2; -using namespace OpenRCT2::Input; - -// Remove when the C calls are removed -static KeyboardShortcuts* _instance; - -static const std::map specialCharNames = { - { SDL_SCANCODE_BACKSPACE, STR_SHORTCUT_BACKSPACE }, - { SDL_SCANCODE_TAB, STR_SHORTCUT_TAB }, - { SDL_SCANCODE_CLEAR, STR_SHORTCUT_CLEAR }, - { SDL_SCANCODE_RETURN, STR_SHORTCUT_RETURN }, - { SDL_SCANCODE_LALT, STR_SHORTCUT_ALT }, - { SDL_SCANCODE_PAUSE, STR_SHORTCUT_PAUSE }, - { SDL_SCANCODE_CAPSLOCK, STR_SHORTCUT_CAPS }, - { SDL_SCANCODE_ESCAPE, STR_SHORTCUT_ESCAPE }, - { SDL_SCANCODE_SPACE, STR_SHORTCUT_SPACEBAR }, - { SDL_SCANCODE_PAGEUP, STR_SHORTCUT_PGUP }, - { SDL_SCANCODE_PAGEDOWN, STR_SHORTCUT_PGDN }, - { SDL_SCANCODE_END, STR_SHORTCUT_END }, - { SDL_SCANCODE_HOME, STR_SHORTCUT_HOME }, - { SDL_SCANCODE_LEFT, STR_SHORTCUT_LEFT }, - { SDL_SCANCODE_UP, STR_SHORTCUT_UP }, - { SDL_SCANCODE_RIGHT, STR_SHORTCUT_RIGHT }, - { SDL_SCANCODE_DOWN, STR_SHORTCUT_DOWN }, - { SDL_SCANCODE_SELECT, STR_SHORTCUT_SELECT }, - { SDL_SCANCODE_PRINTSCREEN, STR_SHORTCUT_PRINT }, - { SDL_SCANCODE_EXECUTE, STR_SHORTCUT_EXECUTE }, - { SDL_SCANCODE_SYSREQ, STR_SHORTCUT_SNAPSHOT }, - { SDL_SCANCODE_INSERT, STR_SHORTCUT_INSERT }, - { SDL_SCANCODE_DELETE, STR_SHORTCUT_DELETE }, - { SDL_SCANCODE_HELP, STR_SHORTCUT_HELP }, - { SDL_SCANCODE_APPLICATION, STR_SHORTCUT_MENU }, - { SDL_SCANCODE_KP_0, STR_SHORTCUT_NUMPAD_0 }, - { SDL_SCANCODE_KP_1, STR_SHORTCUT_NUMPAD_1 }, - { SDL_SCANCODE_KP_2, STR_SHORTCUT_NUMPAD_2 }, - { SDL_SCANCODE_KP_3, STR_SHORTCUT_NUMPAD_3 }, - { SDL_SCANCODE_KP_4, STR_SHORTCUT_NUMPAD_4 }, - { SDL_SCANCODE_KP_5, STR_SHORTCUT_NUMPAD_5 }, - { SDL_SCANCODE_KP_6, STR_SHORTCUT_NUMPAD_6 }, - { SDL_SCANCODE_KP_7, STR_SHORTCUT_NUMPAD_7 }, - { SDL_SCANCODE_KP_8, STR_SHORTCUT_NUMPAD_8 }, - { SDL_SCANCODE_KP_9, STR_SHORTCUT_NUMPAD_9 }, - { SDL_SCANCODE_KP_MULTIPLY, STR_SHORTCUT_NUMPAD_MULTIPLY }, - { SDL_SCANCODE_KP_PLUS, STR_SHORTCUT_NUMPAD_PLUS }, - { SDL_SCANCODE_KP_MINUS, STR_SHORTCUT_NUMPAD_MINUS }, - { SDL_SCANCODE_KP_PERIOD, STR_SHORTCUT_NUMPAD_PERIOD }, - { SDL_SCANCODE_KP_DIVIDE, STR_SHORTCUT_NUMPAD_DIVIDE }, - { SDL_SCANCODE_NUMLOCKCLEAR, STR_SHORTCUT_NUMLOCK }, - { SDL_SCANCODE_SCROLLLOCK, STR_SHORTCUT_SCROLL }, -}; - -KeyboardShortcuts::KeyboardShortcuts(const std::shared_ptr& env) - : _env(env) -{ - _instance = this; -} - -KeyboardShortcuts::~KeyboardShortcuts() -{ - _instance = nullptr; -} - -void KeyboardShortcuts::Reset() -{ - for (size_t i = 0; i < ShortcutsCount; i++) - { - _keys[i] = DefaultKeys[i]; - } -} - -bool KeyboardShortcuts::Load() -{ - bool result = false; - Reset(); - try - { - std::string path = _env->GetFilePath(PATHID::CONFIG_SHORTCUTS_LEGACY); - if (File::Exists(path)) - { - auto fs = FileStream(path, FILE_MODE_OPEN); - uint16_t version = fs.ReadValue(); - if (version == KeyboardShortcuts::CURRENT_FILE_VERSION) - { - int32_t numShortcutsInFile = (fs.GetLength() - sizeof(uint16_t)) / sizeof(uint16_t); - auto numShortcutsToRead = std::min(ShortcutsCount, numShortcutsInFile); - for (size_t i = 0; i < numShortcutsToRead; i++) - { - _keys[i] = fs.ReadValue(); - } - result = true; - } - } - } - catch (const std::exception& ex) - { - Console::WriteLine("Error reading shortcut keys: %s", ex.what()); - } - return result; -} - -bool KeyboardShortcuts::Save() -{ - bool result = false; - try - { - std::string path = _env->GetFilePath(PATHID::CONFIG_SHORTCUTS_LEGACY); - auto fs = FileStream(path, FILE_MODE_WRITE); - fs.WriteValue(KeyboardShortcuts::CURRENT_FILE_VERSION); - for (size_t i = 0; i < ShortcutsCount; i++) - { - fs.WriteValue(_keys[i]); - } - result = true; - } - catch (const std::exception& ex) - { - Console::WriteLine("Error writing shortcut keys: %s", ex.what()); - } - return result; -} - -void KeyboardShortcuts::Set(int32_t key) -{ - // Unmap shortcut that already uses this key - auto shortcut = GetFromKey(key); - if (shortcut != Input::Shortcut::Undefined) - { - _keys[static_cast(shortcut)] = static_cast(Input::ScanCodeUndefined); - } - - // Map shortcut to this key - // _keys[static_cast(gKeyboardShortcutChangeId)] = key; - Save(); -} - -Shortcut KeyboardShortcuts::GetFromKey(int32_t key) -{ - for (size_t i = 0; i < ShortcutsCount; i++) - { - if (key == _keys[i]) - { - return static_cast(i); - } - } - return Input::Shortcut::Undefined; -} - -std::string KeyboardShortcuts::GetShortcutString(int32_t shortcut) const -{ - utf8 buffer[256] = { 0 }; - utf8 formatBuffer[256] = { 0 }; - uint16_t shortcutKey = _keys[shortcut]; - if (shortcutKey == Input::ScanCodeUndefined) - return std::string(); - if (shortcutKey & SHIFT) - { - format_string(formatBuffer, sizeof(formatBuffer), STR_SHIFT_PLUS, nullptr); - String::Append(buffer, sizeof(buffer), formatBuffer); - } - if (shortcutKey & CTRL) - { - format_string(formatBuffer, sizeof(formatBuffer), STR_CTRL_PLUS, nullptr); - String::Append(buffer, sizeof(buffer), formatBuffer); - } - if (shortcutKey & ALT) - { -#ifdef __MACOSX__ - format_string(formatBuffer, sizeof(formatBuffer), STR_OPTION_PLUS, nullptr); -#else - format_string(formatBuffer, sizeof(formatBuffer), STR_ALT_PLUS, nullptr); -#endif - String::Append(buffer, sizeof(buffer), formatBuffer); - } - if (shortcutKey & CMD) - { - format_string(formatBuffer, sizeof(formatBuffer), STR_CMD_PLUS, nullptr); - String::Append(buffer, sizeof(buffer), formatBuffer); - } - - SDL_Scancode scanCode = static_cast(shortcutKey & 0xFF); - auto keyPair = specialCharNames.find(scanCode); - if (keyPair != specialCharNames.end()) - { - format_string(formatBuffer, sizeof(formatBuffer), keyPair->second, nullptr); - String::Append(buffer, sizeof(buffer), formatBuffer); - } - else - { - String::Append(buffer, sizeof(buffer), SDL_GetKeyName(SDL_GetKeyFromScancode(scanCode))); - } - - return std::string(buffer); -} - -ScreenCoordsXY KeyboardShortcuts::GetKeyboardMapScroll(const uint8_t* keysState) const -{ - ScreenCoordsXY screenCoords; - for (int32_t shortcutId = static_cast(Input::Shortcut::ScrollMapUp); - shortcutId <= static_cast(Input::Shortcut::ScrollMapRight); shortcutId++) - { - uint16_t shortcutKey = _keys[shortcutId]; - uint8_t scancode = shortcutKey & 0xFF; - - if (shortcutKey == Input::ScanCodeUndefined) - continue; - if (!keysState[scancode]) - continue; - - // Check if SHIFT is either set in the shortcut key and currently pressed, - // or not set in the shortcut key and not currently pressed (in other words: check if they match). - if (static_cast(shortcutKey & SHIFT) != (keysState[SDL_SCANCODE_LSHIFT] || keysState[SDL_SCANCODE_RSHIFT])) - continue; - if (static_cast(shortcutKey & CTRL) != (keysState[SDL_SCANCODE_LCTRL] || keysState[SDL_SCANCODE_RCTRL])) - continue; - if (static_cast(shortcutKey & ALT) != (keysState[SDL_SCANCODE_LALT] || keysState[SDL_SCANCODE_RALT])) - continue; -#ifdef __MACOSX__ - if (static_cast(shortcutKey & CMD) != (keysState[SDL_SCANCODE_LGUI] || keysState[SDL_SCANCODE_RGUI])) - continue; -#endif - auto convertedShortcut = static_cast(shortcutId); - switch (convertedShortcut) - { - case Input::Shortcut::ScrollMapUp: - screenCoords.y = -1; - break; - case Input::Shortcut::ScrollMapLeft: - screenCoords.x = -1; - break; - case Input::Shortcut::ScrollMapDown: - screenCoords.y = 1; - break; - case Input::Shortcut::ScrollMapRight: - screenCoords.x = 1; - break; - default: - break; - } - } - return screenCoords; -} - -void KeyboardShortcutsReset() -{ - _instance->Reset(); -} - -bool KeyboardShortcutsLoad() -{ - return _instance->Load(); -} - -bool KeyboardShortcutsSave() -{ - return _instance->Save(); -} - -void KeyboardShortcutsSet(int32_t key) -{ - return _instance->Set(key); -} - -Shortcut KeyboardShortcutsGetFromKey(int32_t key) -{ - return _instance->GetFromKey(key); -} - -void KeyboardShortcutsFormatString(char* buffer, size_t bufferSize, int32_t shortcut) -{ - auto str = _instance->GetShortcutString(shortcut); - String::Set(buffer, bufferSize, str.c_str()); -} - -ScreenCoordsXY GetKeyboardMapScroll(const uint8_t* keysState) -{ - return _instance->GetKeyboardMapScroll(keysState); -} - -// Default keyboard shortcuts -const uint16_t KeyboardShortcuts::DefaultKeys[Input::ShortcutsCount] = { - SDL_SCANCODE_BACKSPACE, // SHORTCUT_CLOSE_TOP_MOST_WINDOW - SHIFT | SDL_SCANCODE_BACKSPACE, // SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS - SDL_SCANCODE_ESCAPE, // SHORTCUT_CANCEL_CONSTRUCTION_MODE - SDL_SCANCODE_PAUSE, // SHORTCUT_PAUSE_GAME - SDL_SCANCODE_PAGEUP, // SHORTCUT_ZOOM_VIEW_OUT - SDL_SCANCODE_PAGEDOWN, // SHORTCUT_ZOOM_VIEW_IN - SDL_SCANCODE_RETURN, // SHORTCUT_ROTATE_VIEW_CLOCKWISE - SHIFT | SDL_SCANCODE_RETURN, // SHORTCUT_ROTATE_VIEW_ANTICLOCKWISE - SDL_SCANCODE_Z, // SHORTCUT_ROTATE_CONSTRUCTION_OBJECT - SDL_SCANCODE_1, // SHORTCUT_UNDERGROUND_VIEW_TOGGLE - SDL_SCANCODE_H, // SHORTCUT_REMOVE_BASE_LAND_TOGGLE - SDL_SCANCODE_V, // SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE - SDL_SCANCODE_3, // SHORTCUT_SEE_THROUGH_RIDES_TOGGLE - SDL_SCANCODE_4, // SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE - SDL_SCANCODE_5, // SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE - SDL_SCANCODE_6, // SHORTCUT_INVISIBLE_PEOPLE_TOGGLE - SDL_SCANCODE_8, // SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE - SDL_SCANCODE_9, // SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE - SDL_SCANCODE_0, // SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE - SDL_SCANCODE_F1, // SHORTCUT_ADJUST_LAND - SDL_SCANCODE_F2, // SHORTCUT_ADJUST_WATER - SDL_SCANCODE_F3, // SHORTCUT_BUILD_SCENERY - SDL_SCANCODE_F4, // SHORTCUT_BUILD_PATHS - SDL_SCANCODE_F5, // SHORTCUT_BUILD_NEW_RIDE - SDL_SCANCODE_F, // SHORTCUT_SHOW_FINANCIAL_INFORMATION - SDL_SCANCODE_D, // SHORTCUT_SHOW_RESEARCH_INFORMATION - SDL_SCANCODE_R, // SHORTCUT_SHOW_RIDES_LIST - SDL_SCANCODE_P, // SHORTCUT_SHOW_PARK_INFORMATION - SDL_SCANCODE_G, // SHORTCUT_SHOW_GUEST_LIST - SDL_SCANCODE_S, // SHORTCUT_SHOW_STAFF_LIST - SDL_SCANCODE_M, // SHORTCUT_SHOW_RECENT_MESSAGES - SDL_SCANCODE_TAB, // SHORTCUT_SHOW_MAP - PLATFORM_MODIFIER | SDL_SCANCODE_S, // SHORTCUT_SCREENSHOT - SDL_SCANCODE_MINUS, // SHORTCUT_REDUCE_GAME_SPEED, - SDL_SCANCODE_EQUALS, // SHORTCUT_INCREASE_GAME_SPEED, - PLATFORM_MODIFIER | ALT | SDL_SCANCODE_C, // SHORTCUT_OPEN_CHEAT_WINDOW, - SDL_SCANCODE_T, // SHORTCUT_REMOVE_TOP_BOTTOM_TOOLBAR_TOGGLE, - SDL_SCANCODE_UP, // SHORTCUT_SCROLL_MAP_UP - SDL_SCANCODE_LEFT, // SHORTCUT_SCROLL_MAP_LEFT - SDL_SCANCODE_DOWN, // SHORTCUT_SCROLL_MAP_DOWN - SDL_SCANCODE_RIGHT, // SHORTCUT_SCROLL_MAP_RIGHT - SDL_SCANCODE_C, // SHORTCUT_OPEN_CHAT_WINDOW - PLATFORM_MODIFIER | SDL_SCANCODE_F10, // SHORTCUT_QUICK_SAVE_GAME - Input::ScanCodeUndefined, // SHORTCUT_SHOW_OPTIONS - Input::ScanCodeUndefined, // SHORTCUT_MUTE_SOUND - ALT | SDL_SCANCODE_RETURN, // SHORTCUT_WINDOWED_MODE_TOGGLE - Input::ScanCodeUndefined, // SHORTCUT_SHOW_MULTIPLAYER - Input::ScanCodeUndefined, // SHORTCUT_PAINT_ORIGINAL_TOGGLE - Input::ScanCodeUndefined, // SHORTCUT_DEBUG_PAINT_TOGGLE - Input::ScanCodeUndefined, // SHORTCUT_SEE_THROUGH_PATHS_TOGGLE - SDL_SCANCODE_KP_4, // SHORTCUT_RIDE_CONSTRUCTION_TURN_LEFT - SDL_SCANCODE_KP_6, // SHORTCUT_RIDE_CONSTRUCTION_TURN_RIGHT - SDL_SCANCODE_KP_5, // SHORTCUT_RIDE_CONSTRUCTION_USE_TRACK_DEFAULT - SDL_SCANCODE_KP_2, // SHORTCUT_RIDE_CONSTRUCTION_SLOPE_DOWN - SDL_SCANCODE_KP_8, // SHORTCUT_RIDE_CONSTRUCTION_SLOPE_UP - SDL_SCANCODE_KP_PLUS, // SHORTCUT_RIDE_CONSTRUCTION_CHAIN_LIFT_TOGGLE - SDL_SCANCODE_KP_1, // SHORTCUT_RIDE_CONSTRUCTION_BANK_LEFT - SDL_SCANCODE_KP_3, // SHORTCUT_RIDE_CONSTRUCTION_BANK_RIGHT - SDL_SCANCODE_KP_7, // SHORTCUT_RIDE_CONSTRUCTION_PREVIOUS_TRACK - SDL_SCANCODE_KP_9, // SHORTCUT_RIDE_CONSTRUCTION_NEXT_TRACK - SDL_SCANCODE_KP_0, // SHORTCUT_RIDE_CONSTRUCTION_BUILD_CURRENT - SDL_SCANCODE_KP_MINUS, // SHORTCUT_RIDE_CONSTRUCTION_DEMOLISH_CURRENT - PLATFORM_MODIFIER | SDL_SCANCODE_L, // SHORTCUT_LOAD_GAME - SDL_SCANCODE_B, // SHORTCUT_CLEAR_SCENERY - SDL_SCANCODE_7, // SHORTCUT_GRIDLINES_DISPLAY_TOGGLE - Input::ScanCodeUndefined, // SHORTCUT_VIEW_CLIPPING - SDL_SCANCODE_I, // SHORTCUT_HIGHLIGHT_PATH_ISSUES_TOGGLE - Input::ScanCodeUndefined, // SHORTCUT_TILE_INSPECTOR - Input::ScanCodeUndefined, // SHORTCUT_ADVANCE_TO_NEXT_TICK - Input::ScanCodeUndefined, // SHORTCUT_SCENERY_PICKER - Input::ScanCodeUndefined, // SHORTCUT_SCALE_UP - Input::ScanCodeUndefined, // SHORTCUT_SCALE_DOWN - Input::ScanCodeUndefined, // SHORTCUT_TOGGLE_CLEARANCE_CHECKS -}; diff --git a/src/openrct2-ui/input/KeyboardShortcuts.h b/src/openrct2-ui/input/KeyboardShortcuts.h deleted file mode 100644 index 969cf2659b..0000000000 --- a/src/openrct2-ui/input/KeyboardShortcuts.h +++ /dev/null @@ -1,165 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2014-2020 OpenRCT2 developers - * - * For a complete list of all authors, please refer to contributors.md - * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 - * - * OpenRCT2 is licensed under the GNU General Public License version 3. - *****************************************************************************/ - -#pragma once - -#include -#include - -#define SHIFT 0x100 -#define CTRL 0x200 -#define ALT 0x400 -#define CMD 0x800 -#ifdef __MACOSX__ -# define PLATFORM_MODIFIER CMD -#else -# define PLATFORM_MODIFIER CTRL -#endif - -struct ScreenCoordsXY; - -#include - -namespace OpenRCT2 -{ - struct IPlatformEnvironment; - - namespace Input - { - enum class Shortcut : size_t - { - CloseTopMostWindow, - CloseAllFloatingWindows, - CancelConstructionMode, - PauseGame, - ZoomViewOut, - ZoomViewIn, - RotateViewClockwise, - RotateViewAnticlockwise, - RotateConstructionObject, - UndergroundViewToggle, - RemoveBaseLandToggle, - RemoveVerticalLandToggle, - SeeThroughRidesToggle, - SeeThroughSceneryToggle, - InvisibleSupportsToggle, - InvisiblePeopleToggle, - HeightMarksOnLandToggle, - HeightMarksOnRideTracksToggle, - HeightMarksOnPathsToggle, - AdjustLand, - AdjustWater, - BuildScenery, - BuildPaths, - BuildNewRide, - ShowFinancialInformation, - ShowResearchInformation, - ShowRidesList, - ShowParkInformation, - ShowGuestList, - ShowStaffList, - ShowRecentMessages, - ShowMap, - Screenshot, - - // New - ReduceGameSpeed, - IncreaseGameSpeed, - OpenCheatWindow, - RemoveTopBottomToolbarToggle, - ScrollMapUp, - ScrollMapLeft, - ScrollMapDown, - ScrollMapRight, - OpenChatWindow, - QuickSaveGame, - ShowOptions, - MuteSound, - WindowedModeToggle, - ShowMultiplayer, - PaintOriginalToggle, - DebugPaintToggle, - SeeThroughPathsToggle, - RideConstructionTurnLeft, - RideConstructionTurnRight, - RideConstructionUseTrackDefault, - RideConstructionSlopeDown, - RideConstructionSlopeUp, - RideConstructionChainLiftToggle, - RideConstructionBankLeft, - RideConstructionBankRight, - RideConstructionPreviousTrack, - RideConstructionNextTrack, - RideConstructionBuildCurrent, - RideConstructionDemolishCurrent, - LoadGame, - ClearScenery, - GridlinesDisplayToggle, - ViewClipping, - HighlightPathIssuesToggle, - TileInspector, - AdvanceToNextTick, - SceneryPicker, - ScaleUp, - ScaleDown, - InsertCorruptElement, - CopyElement, - PasteElement, - RemoveElement, - MoveElementUp, - MoveElementDown, - IncreaseXCoord, - DecreaseXCoord, - IncreaseYCoord, - DecreaseYCoord, - IncreaseElementHeight, - DecreaseElementHeight, - ToggleClearanceChecks, - - Count, - - Undefined = 0xFFFF, - }; - constexpr size_t ShortcutsCount = static_cast(Shortcut::Count); - - class KeyboardShortcuts - { - private: - constexpr static int32_t CURRENT_FILE_VERSION = 1; - static const uint16_t DefaultKeys[ShortcutsCount]; - - std::shared_ptr const _env; - uint16_t _keys[ShortcutsCount]; - - public: - KeyboardShortcuts(const std::shared_ptr& env); - ~KeyboardShortcuts(); - - void Reset(); - bool Load(); - bool Save(); - - std::string GetShortcutString(int32_t shortcut) const; - - void Set(int32_t key); - Shortcut GetFromKey(int32_t key); - ScreenCoordsXY GetKeyboardMapScroll(const uint8_t* keysState) const; - }; - const uint16_t ScanCodeUndefined = 0xFFFF; - } // namespace Input -} // namespace OpenRCT2 - -void KeyboardShortcutsReset(); -bool KeyboardShortcutsLoad(); -bool KeyboardShortcutsSave(); -void KeyboardShortcutsSet(int32_t key); -OpenRCT2::Input::Shortcut KeyboardShortcutsGetFromKey(int32_t key); -void KeyboardShortcutsFormatString(char* buffer, size_t bufferSize, int32_t shortcut); - -ScreenCoordsXY GetKeyboardMapScroll(const uint8_t* keysState); diff --git a/src/openrct2-ui/input/ShortcutInput.cpp b/src/openrct2-ui/input/ShortcutInput.cpp index f620e3f650..46bca04961 100644 --- a/src/openrct2-ui/input/ShortcutInput.cpp +++ b/src/openrct2-ui/input/ShortcutInput.cpp @@ -10,6 +10,7 @@ #include "ShortcutManager.h" #include +#include #include using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/input/ShortcutManager.cpp b/src/openrct2-ui/input/ShortcutManager.cpp index 6bc14487eb..4522f336c3 100644 --- a/src/openrct2-ui/input/ShortcutManager.cpp +++ b/src/openrct2-ui/input/ShortcutManager.cpp @@ -91,6 +91,23 @@ bool RegisteredShortcut::IsSuitableInputEvent(const InputEvent& e) const return true; } +std::string RegisteredShortcut::GetDisplayString() const +{ + std::string result; + auto numChords = Current.size(); + for (size_t i = 0; i < numChords; i++) + { + const auto& kc = Current[i]; + result += kc.ToString(); + if (i < numChords - 1) + { + // TODO localise... + result += " or "; + } + } + return result; +} + ShortcutManager::ShortcutManager(const std::shared_ptr& env) : _env(env) { @@ -147,6 +164,7 @@ void ShortcutManager::ProcessEvent(const InputEvent& e) } _pendingShortcutChange.clear(); window_close_by_class(WC_CHANGE_KEYBOARD_SHORTCUT); + SaveUserBindings(); } } } @@ -274,16 +292,19 @@ void ShortcutManager::LoadUserBindings(const fs::path& path) const auto& value = it.value(); const auto& shortcut = GetShortcut(key); - shortcut->Current.clear(); - if (value.is_string()) + if (shortcut != nullptr) { - shortcut->Current.emplace_back(value.get()); - } - else if (value.is_array()) - { - for (auto& subValue : value) + shortcut->Current.clear(); + if (value.is_string()) { - shortcut->Current.emplace_back(subValue.get()); + shortcut->Current.emplace_back(value.get()); + } + else if (value.is_array()) + { + for (auto& subValue : value) + { + shortcut->Current.emplace_back(subValue.get()); + } } } } diff --git a/src/openrct2-ui/input/ShortcutManager.h b/src/openrct2-ui/input/ShortcutManager.h index 954802c8bf..d058d3e88e 100644 --- a/src/openrct2-ui/input/ShortcutManager.h +++ b/src/openrct2-ui/input/ShortcutManager.h @@ -98,6 +98,7 @@ namespace OpenRCT2::Ui std::string_view GetGroup() const; bool Matches(const InputEvent& e) const; bool IsSuitableInputEvent(const InputEvent& e) const; + std::string GetDisplayString() const; private: }; diff --git a/src/openrct2-ui/input/KeyboardShortcut.cpp b/src/openrct2-ui/input/Shortcuts.cpp similarity index 99% rename from src/openrct2-ui/input/KeyboardShortcut.cpp rename to src/openrct2-ui/input/Shortcuts.cpp index ebb1448a55..333e3512a8 100644 --- a/src/openrct2-ui/input/KeyboardShortcut.cpp +++ b/src/openrct2-ui/input/Shortcuts.cpp @@ -7,16 +7,15 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ -#include "KeyboardShortcuts.h" #include "ShortcutIds.h" #include "ShortcutManager.h" -#include #include #include #include #include #include +#include #include #include #include @@ -41,8 +40,6 @@ #include #include -extern bool gWindowSceneryEyedropperEnabled; - using namespace OpenRCT2; using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/libopenrct2ui.vcxproj b/src/openrct2-ui/libopenrct2ui.vcxproj index 47edf50f0a..d454e99e66 100644 --- a/src/openrct2-ui/libopenrct2ui.vcxproj +++ b/src/openrct2-ui/libopenrct2ui.vcxproj @@ -41,7 +41,6 @@ - @@ -93,8 +92,7 @@ - - + diff --git a/src/openrct2-ui/scripting/CustomMenu.cpp b/src/openrct2-ui/scripting/CustomMenu.cpp index ca8a4bf1c9..5d0c41d94b 100644 --- a/src/openrct2-ui/scripting/CustomMenu.cpp +++ b/src/openrct2-ui/scripting/CustomMenu.cpp @@ -42,6 +42,7 @@ namespace OpenRCT2::Scripting registeredShortcut.Default.emplace_back(binding); } shortcutManager.RegisterShortcut(std::move(registeredShortcut)); + shortcutManager.LoadUserBindings(); } CustomShortcut::~CustomShortcut() diff --git a/src/openrct2-ui/windows/ShortcutKeys.cpp b/src/openrct2-ui/windows/ShortcutKeys.cpp index 36407f3d1b..0394a4a9b9 100644 --- a/src/openrct2-ui/windows/ShortcutKeys.cpp +++ b/src/openrct2-ui/windows/ShortcutKeys.cpp @@ -358,11 +358,12 @@ private: ssp.ShortcutId = shortcut->Id; ssp.StringId = shortcut->LocalisedName; ssp.CustomString = shortcut->CustomName; - ssp.Binding = FormatKeyChordsString(*shortcut); + ssp.Binding = shortcut->GetDisplayString(); _list.push_back(std::move(ssp)); index++; } + WindowInitScrollWidgets(this); Invalidate(); } @@ -505,22 +506,6 @@ private: DrawTextEllipsised(&dpi, { bindingOffset, y - 1 }, 150, format, ft, COLOUR_BLACK); } } - - static std::string FormatKeyChordsString(const RegisteredShortcut& shortcut) - { - std::string result; - auto numChords = shortcut.Current.size(); - for (size_t i = 0; i < numChords; i++) - { - const auto& kc = shortcut.Current[i]; - result += kc.ToString(); - if (i < numChords - 1) - { - result += " or "; - } - } - return result; - } }; void ChangeShortcutWindow::NotifyShortcutKeysWindow() diff --git a/src/openrct2-ui/windows/Window.h b/src/openrct2-ui/windows/Window.h index 9b55984a20..5fc33a68c1 100644 --- a/src/openrct2-ui/windows/Window.h +++ b/src/openrct2-ui/windows/Window.h @@ -9,7 +9,6 @@ #pragma once -#include #include #include #include diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index e1700961c7..b2dc9918af 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -3447,7 +3447,7 @@ const char* network_get_group_name(uint32_t index) void network_chat_show_connected_message() { auto windowManager = GetContext()->GetUiContext()->GetWindowManager(); - std::string s = windowManager->GetKeyboardShortcutString(41 /* SHORTCUT_OPEN_CHAT_WINDOW */); + std::string s = windowManager->GetKeyboardShortcutString("interface.misc.multiplayer_chat"); const char* sptr = s.c_str(); utf8 buffer[256]; diff --git a/src/openrct2/ui/DummyWindowManager.cpp b/src/openrct2/ui/DummyWindowManager.cpp index 7f8d340803..6aa4a08603 100644 --- a/src/openrct2/ui/DummyWindowManager.cpp +++ b/src/openrct2/ui/DummyWindowManager.cpp @@ -53,7 +53,7 @@ namespace OpenRCT2::Ui void HandleKeyboard(bool /*isTitle*/) override { } - std::string GetKeyboardShortcutString(int32_t /*shortcut*/) override + std::string GetKeyboardShortcutString(std::string_view /*shortcutId*/) override { return std::string(); } diff --git a/src/openrct2/ui/WindowManager.h b/src/openrct2/ui/WindowManager.h index 701ff266df..3da7f1827e 100644 --- a/src/openrct2/ui/WindowManager.h +++ b/src/openrct2/ui/WindowManager.h @@ -14,6 +14,7 @@ #include "../windows/Intent.h" #include +#include class Formatter; @@ -37,7 +38,7 @@ namespace OpenRCT2::Ui virtual void UpdateMapTooltip() abstract; virtual void HandleInput() abstract; virtual void HandleKeyboard(bool isTitle) abstract; - virtual std::string GetKeyboardShortcutString(int32_t shortcut) abstract; + virtual std::string GetKeyboardShortcutString(std::string_view shortcutId) abstract; virtual void SetMainView(const ScreenCoordsXY& viewPos, ZoomLevel zoom, int32_t rotation) abstract; virtual void UpdateMouseWheel() abstract; virtual rct_window* GetOwner(const rct_viewport* viewport) abstract;