src/platform/qt/input/InputIndex.h (view raw)
1/* Copyright (c) 2013-2017 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#ifndef QGBA_INPUT_INDEX
7#define QGBA_INPUT_INDEX
8
9#include "GamepadAxisEvent.h"
10#include "InputItem.h"
11
12#include <QMap>
13#include <QString>
14
15class QMenu;
16
17namespace QGBA {
18
19class ConfigController;
20
21class InputIndex {
22private:
23 constexpr static const char* const KEY_SECTION = "shortcutKey";
24 constexpr static const char* const BUTTON_SECTION = "shortcutButton";
25 constexpr static const char* const AXIS_SECTION = "shortcutAxis";
26 constexpr static const char* const HAT_SECTION = "shortcutHat";
27
28public:
29 void setConfigController(ConfigController* controller);
30
31 void clone(InputIndex* root, bool actions = false);
32 void clone(const InputIndex* root);
33 void rebuild(const InputIndex* root = nullptr);
34
35 const QList<InputItem*>& items() const { return m_items; }
36
37 template<typename... Args> InputItem* addItem(Args... params) {
38 InputItem* newItem = new InputItem(params...);
39 m_items.append(newItem);
40 itemAdded(newItem);
41 return newItem;
42 }
43
44 InputItem* itemAt(const QString& name);
45 const InputItem* itemAt(const QString& name) const;
46
47 InputItem* itemForMenu(const QMenu* menu);
48 const InputItem* itemForMenu(const QMenu* menu) const;
49
50 InputItem* itemForShortcut(int shortcut);
51 InputItem* itemForButton(int button);
52 InputItem* itemForAxis(int axis, GamepadAxisEvent::Direction);
53
54 static int toModifierShortcut(const QString& shortcut);
55 static bool isModifierKey(int key);
56 static int toModifierKey(int key);
57
58 void saveConfig();
59
60private:
61 bool loadShortcuts(InputItem*);
62 void loadGamepadShortcuts(InputItem*);
63
64 void itemAdded(InputItem*);
65
66 QList<InputItem*> m_items;
67
68 QMap<QString, InputItem*> m_names;
69 QMap<const QMenu*, InputItem*> m_menus;
70 QMap<int, InputItem*> m_shortcuts;
71 QMap<int, InputItem*> m_buttons;
72 QMap<QPair<int, GamepadAxisEvent::Direction>, InputItem*> m_axes;
73
74 ConfigController* m_config = nullptr;
75};
76
77}
78
79#endif