| 1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
| 2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
| 3 | #include "GUI/BsShortcutKey.h" |
| 4 | #include "Platform/BsPlatform.h" |
| 5 | #include "Localization/BsHEString.h" |
| 6 | #include "Localization/BsHString.h" |
| 7 | |
| 8 | namespace bs |
| 9 | { |
| 10 | const ShortcutKey ShortcutKey::NONE = ShortcutKey(); |
| 11 | |
| 12 | size_t ShortcutKey::Hash::operator()(const ShortcutKey& x) const |
| 13 | { |
| 14 | size_t seed = 0; |
| 15 | bs_hash_combine(seed, (UINT32)x.button); |
| 16 | bs_hash_combine(seed, (UINT32)x.modifier); |
| 17 | |
| 18 | return seed; |
| 19 | } |
| 20 | |
| 21 | bool ShortcutKey::Equals::operator()(const ShortcutKey& a, const ShortcutKey& b) const |
| 22 | { |
| 23 | return a.button == b.button && a.modifier == b.modifier; |
| 24 | } |
| 25 | |
| 26 | ShortcutKey::ShortcutKey(ButtonModifier modifier, ButtonCode code) |
| 27 | : modifier(modifier), button(code) |
| 28 | { } |
| 29 | |
| 30 | String ShortcutKey::getName() const |
| 31 | { |
| 32 | static const String MODIFIER_TO_NAME[8] = |
| 33 | { |
| 34 | u8"" , u8"Shift + " , u8"Ctrl + " , u8"Shift + Ctrl + " , |
| 35 | u8"Alt + " , u8"Shift + Alt + " , u8"Ctrl + Alt + " , |
| 36 | u8"Shift + Ctrl + Alt + " |
| 37 | }; |
| 38 | |
| 39 | static const UnorderedMap<ButtonCode, HEString> FUNCTION_KEY_TO_NAME = |
| 40 | { |
| 41 | {BC_ESCAPE, HEString(u8"Escape" )}, |
| 42 | {BC_BACK, HEString(u8"Backspace" )}, |
| 43 | {BC_TAB, HEString(u8"Tab" )}, |
| 44 | {BC_RETURN, HEString(u8"Return" )}, |
| 45 | {BC_SPACE, HEString(u8"Space" )}, |
| 46 | {BC_CAPITAL, HEString(u8"Caps Lock" )}, |
| 47 | {BC_F1, HEString(u8"F1" )}, |
| 48 | {BC_F2, HEString(u8"F2" )}, |
| 49 | {BC_F3, HEString(u8"F3" )}, |
| 50 | {BC_F4, HEString(u8"F4" )}, |
| 51 | {BC_F5, HEString(u8"F5" )}, |
| 52 | {BC_F6, HEString(u8"F6" )}, |
| 53 | {BC_F7, HEString(u8"F7" )}, |
| 54 | {BC_F8, HEString(u8"F8" )}, |
| 55 | {BC_F9, HEString(u8"F9" )}, |
| 56 | {BC_F10, HEString(u8"F10" )}, |
| 57 | {BC_F11, HEString(u8"F11" )}, |
| 58 | {BC_F12, HEString(u8"F12" )}, |
| 59 | {BC_DELETE, HEString(u8"Delete" )}, |
| 60 | {BC_INSERT, HEString(u8"Insert" )}, |
| 61 | {BC_UP, HEString(u8"Up" )}, |
| 62 | {BC_LEFT, HEString(u8"Left" )}, |
| 63 | {BC_RIGHT, HEString(u8"Right" )}, |
| 64 | {BC_DOWN, HEString(u8"Down" )}, |
| 65 | {BC_PGUP, HEString(u8"Page Up" )}, |
| 66 | {BC_PGDOWN, HEString(u8"Page Down" )}, |
| 67 | {BC_END, HEString(u8"End" )}, |
| 68 | {BC_HOME, HEString(u8"Home" )}, |
| 69 | {BC_PAUSE, HEString(u8"Pause" )}, |
| 70 | }; |
| 71 | |
| 72 | if (button == BC_UNASSIGNED) |
| 73 | return u8"" ; |
| 74 | |
| 75 | String charStr; |
| 76 | |
| 77 | auto iterFind = FUNCTION_KEY_TO_NAME.find(button); |
| 78 | if (iterFind != FUNCTION_KEY_TO_NAME.end()) |
| 79 | { |
| 80 | charStr = ((HString)iterFind->second); |
| 81 | } |
| 82 | else |
| 83 | { |
| 84 | charStr = Platform::keyCodeToUnicode((UINT32)button); |
| 85 | StringUtil::toUpperCase(charStr); |
| 86 | } |
| 87 | |
| 88 | return MODIFIER_TO_NAME[(UINT32)modifier] + charStr; |
| 89 | } |
| 90 | } |