11#include "../common/Logger/Logger.hpp"
54 return it->second.primary;
62 return it->second.secondary;
85 return it->second.primary == key || it->second.secondary == key;
92 static const std::unordered_map<int, std::string> keyNames = {
95 {KEY_ESCAPE,
"Escape"},
97 {KEY_KP_ENTER,
"Numpad Enter"},
99 {KEY_BACKSPACE,
"Backspace"},
100 {KEY_DELETE,
"Delete"},
101 {KEY_INSERT,
"Insert"},
104 {KEY_PAGE_UP,
"Page Up"},
105 {KEY_PAGE_DOWN,
"Page Down"},
106 {KEY_UP,
"Up Arrow"},
107 {KEY_DOWN,
"Down Arrow"},
108 {KEY_LEFT,
"Left Arrow"},
109 {KEY_RIGHT,
"Right Arrow"},
110 {KEY_LEFT_SHIFT,
"Left Shift"},
111 {KEY_RIGHT_SHIFT,
"Right Shift"},
112 {KEY_LEFT_CONTROL,
"Left Ctrl"},
113 {KEY_RIGHT_CONTROL,
"Right Ctrl"},
114 {KEY_LEFT_ALT,
"Left Alt"},
115 {KEY_RIGHT_ALT,
"Right Alt"},
168 {KEY_KP_0,
"Numpad 0"},
169 {KEY_KP_1,
"Numpad 1"},
170 {KEY_KP_2,
"Numpad 2"},
171 {KEY_KP_3,
"Numpad 3"},
172 {KEY_KP_4,
"Numpad 4"},
173 {KEY_KP_5,
"Numpad 5"},
174 {KEY_KP_6,
"Numpad 6"},
175 {KEY_KP_7,
"Numpad 7"},
176 {KEY_KP_8,
"Numpad 8"},
177 {KEY_KP_9,
"Numpad 9"},
181 {KEY_LEFT_BRACKET,
"["},
182 {KEY_RIGHT_BRACKET,
"]"},
183 {KEY_SEMICOLON,
";"},
184 {KEY_APOSTROPHE,
"'"},
188 {KEY_BACKSLASH,
"\\"},
192 auto it = keyNames.find(key);
193 if (it != keyNames.end()) {
200 static const std::unordered_map<int, std::string> buttonNames = {
201 {GAMEPAD_BUTTON_UNKNOWN,
"Unknown"},
202 {GAMEPAD_BUTTON_LEFT_FACE_UP,
"D-Pad Up"},
203 {GAMEPAD_BUTTON_LEFT_FACE_RIGHT,
"D-Pad Right"},
204 {GAMEPAD_BUTTON_LEFT_FACE_DOWN,
"D-Pad Down"},
205 {GAMEPAD_BUTTON_LEFT_FACE_LEFT,
"D-Pad Left"},
206 {GAMEPAD_BUTTON_RIGHT_FACE_UP,
"Y"},
207 {GAMEPAD_BUTTON_RIGHT_FACE_RIGHT,
"B"},
208 {GAMEPAD_BUTTON_RIGHT_FACE_DOWN,
"A"},
209 {GAMEPAD_BUTTON_RIGHT_FACE_LEFT,
"X"},
210 {GAMEPAD_BUTTON_LEFT_TRIGGER_1,
"LB"},
211 {GAMEPAD_BUTTON_LEFT_TRIGGER_2,
"LT"},
212 {GAMEPAD_BUTTON_RIGHT_TRIGGER_1,
"RB"},
213 {GAMEPAD_BUTTON_RIGHT_TRIGGER_2,
"RT"},
214 {GAMEPAD_BUTTON_MIDDLE_LEFT,
"Select"},
215 {GAMEPAD_BUTTON_MIDDLE,
"Guide"},
216 {GAMEPAD_BUTTON_MIDDLE_RIGHT,
"Start"},
217 {GAMEPAD_BUTTON_LEFT_THUMB,
"L3"},
218 {GAMEPAD_BUTTON_RIGHT_THUMB,
"R3"},
221 auto it = buttonNames.find(button);
222 if (it != buttonNames.end()) {
229 if (binding == KEY_NULL) {
239 static const std::unordered_map<GameAction, std::string> actionNames = {
253 auto it = actionNames.find(action);
254 if (it != actionNames.end()) {
257 return "Unknown Action";
271 std::ofstream file(filepath);
272 if (!file.is_open()) {
273 LOG_ERROR(
"[KeyBindings] Failed to open file for saving: ", filepath);
277 for (
const auto &[action, binding] :
_bindings) {
278 file << static_cast<int>(action) <<
" " << binding.primary <<
" " << binding.secondary <<
"\n";
281 LOG_INFO(
"[KeyBindings] Saved bindings to: ", filepath);
286 std::ifstream file(filepath);
287 if (!file.is_open()) {
288 LOG_WARNING(
"[KeyBindings] No bindings file found, using defaults: ", filepath);
293 while (std::getline(file, line)) {
294 std::istringstream iss(line);
298 if (iss >> actionInt >> primary >> secondary) {
299 auto action =
static_cast<GameAction>(actionInt);
300 _bindings[action] = {primary, secondary};
304 LOG_INFO(
"[KeyBindings] Loaded bindings from: ", filepath);