-
Notifications
You must be signed in to change notification settings - Fork 0
/
ControlsManager.cpp
113 lines (95 loc) · 3.35 KB
/
ControlsManager.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "ControlsManager.h"
//Writes the hotkeys to file
void SetHotkeys(std::vector<HOTKEY> hotkeys) {
//std::string path;
// defineHotkeys(std::vector hotkeysList)
// if readFile(path)
// foreach(hotkey)
// if path contains hotkey
// set hotkey to match path
// else
// set hotkey to default
// else
// createFile(path)
}
HOTKEY::HOTKEY(std::wstring label, std::vector<short> hotkey, std::wstring description)
: label(label), hotkey(hotkey), description(description)
{
// Constructor body
}
// Joins all buttons involved in a hotkey into a single wstring
std::wstring HOTKEY::HotkeyToString(std::vector<short> hotkey, std::wstring padding)
{
std::wstring fullString;
for (size_t i = 0; i < hotkey.size(); ++i) {
fullString += GetKeyName(hotkey[i]);
if (i != hotkey.size() - 1) {
fullString += padding;
}
}
return fullString;
}
// Overload for HotkeyToString to accept a single short
std::wstring HOTKEY::HotkeyToString(short hotkeyShort, std::wstring padding)
{
// This code isn't especially efficient, but it makes copy/pasting code easier
std::vector<short> hotkey = { hotkeyShort };
std::wstring fullString;
for (size_t i = 0; i < hotkey.size(); ++i) {
fullString += GetKeyName(hotkey[i]);
if (i != hotkey.size() - 1) {
fullString += padding;
}
}
return fullString;
}
// Called by HotkeyToString to get the text name of each key code
std::wstring HOTKEY::GetKeyName(short keyCode)
{
wchar_t keyName[0xFF] = { 0 };
UINT scanCode = MapVirtualKeyW(keyCode, MAPVK_VK_TO_VSC);
// If the virtual-key code matches the code of an extended key
switch (keyCode)
{
case VK_LEFT: case VK_UP: case VK_RIGHT: case VK_DOWN: case VK_RCONTROL: case VK_RMENU:
case VK_LWIN: case VK_RWIN: case VK_APPS: case VK_PRIOR: case VK_NEXT: case VK_END:
case VK_HOME: case VK_INSERT: case VK_DELETE: case VK_DIVIDE: case VK_NUMLOCK: case VK_SNAPSHOT:
scanCode |= KF_EXTENDED; // bitwise or adds the extended flag to make sure the correct key is recognized
}
// Write key name into the keyName buffer
int result = GetKeyNameText((LONG)scanCode << 16, keyName, 0xFF);
if (result == 0)
return L"None"; // Failed to get key name
else
return keyName;
}
//bool HOTKEY::IsKeyDown(HOTKEY hotkey, bool toggle)
bool HOTKEY::IsKeyDown(bool toggle)
{
std::vector<short> keyList = hotkey;
if (keyList.size() <= 0) return false;
// Loop through each key and return if any aren't pressed
for (const auto& vkCode : keyList) {
if (!(GetAsyncKeyState(vkCode) & 0x8000)) {
// Key is up
// Return false as soon as one key is up
//if ((label == L"Jump") || (label == L"Save") || (label == L"Load"))
//UpdateStatusText(statusTextHWND, "Hotkey isn't active", { 255, 50, 50 });
wasDown = false;
return false;
}
}
//hotkey.wasDown = hotkey.wasDown; // Flag for future checks
// if hotkey was down and toggle is on, return false anyway
//if (hotkey.wasDown && toggle) {
if (wasDown && toggle) {
//if ((label == L"Jump") || (label == L"Save") || (label == L"Load"))
//UpdateStatusText(statusTextHWND, "Hotkey is active but toggled", { 0, 50, 255 });
return false;
}
//if ((label == L"Jump") || (label == L"Save") || (label == L"Load"))
//UpdateStatusText(statusTextHWND, "Hotkey is active", { 50, 255, 50 });
// Loop finished, all keys are down
wasDown = true; // Flag for future checks
return true; // Return true if all keys are pressed
}