all repos — mgba @ 1a0e44c014ad34bea30d237d27015d82d02cda4b

mGBA Game Boy Advance Emulator

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