all repos — mgba @ 5fef1b72e4963b3ad04da790aa6c1f225706c63f

mGBA Game Boy Advance Emulator

src/platform/qt/InputModel.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_MODEL
 7#define QGBA_INPUT_MODEL
 8
 9#include "GamepadAxisEvent.h"
10#include "InputItem.h"
11
12#include <QAbstractItemModel>
13
14#include <functional>
15
16class QAction;
17class QKeyEvent;
18class QMenu;
19class QString;
20
21namespace QGBA {
22
23class ConfigController;
24class InputProfile;
25
26class InputModel : public QAbstractItemModel {
27Q_OBJECT
28
29private:
30	constexpr static const char* const KEY_SECTION = "shortcutKey";
31	constexpr static const char* const BUTTON_SECTION = "shortcutButton";
32	constexpr static const char* const AXIS_SECTION = "shortcutAxis";
33	constexpr static const char* const BUTTON_PROFILE_SECTION = "shortcutProfileButton.";
34	constexpr static const char* const AXIS_PROFILE_SECTION = "shortcutProfileAxis.";
35
36public:
37	InputModel(QObject* parent = nullptr);
38
39	void setConfigController(ConfigController* controller);
40	void setProfile(const QString& profile);
41
42	virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
43	virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
44
45	virtual QModelIndex index(int row, int column, const QModelIndex& parent) const override;
46	virtual QModelIndex parent(const QModelIndex& index) const override;
47
48	virtual int columnCount(const QModelIndex& parent = QModelIndex()) const override;
49	virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override;
50
51	void addAction(QMenu* menu, QAction* action, const QString& name);
52	void addFunctions(QMenu* menu, std::function<void()> press, std::function<void()> release,
53	                  int shortcut, const QString& visibleName, const QString& name);
54	void addFunctions(QMenu* menu, std::function<void()> press, std::function<void()> release,
55	                  const QKeySequence& shortcut, const QString& visibleName, const QString& name);
56	void addMenu(QMenu* menu, QMenu* parent = nullptr);
57
58	QAction* getAction(const QString& name);
59	int shortcutAt(const QModelIndex& index) const;
60	bool isMenuAt(const QModelIndex& index) const;
61
62	void updateKey(const QModelIndex& index, int keySequence);
63	void updateButton(const QModelIndex& index, int button);
64	void updateAxis(const QModelIndex& index, int axis, GamepadAxisEvent::Direction direction);
65
66	void clearKey(const QModelIndex& index);
67	void clearButton(const QModelIndex& index);
68
69	static int toModifierShortcut(const QString& shortcut);
70	static bool isModifierKey(int key);
71	static int toModifierKey(int key);
72
73public slots:
74	void loadProfile(const QString& profile);
75
76protected:
77	bool eventFilter(QObject*, QEvent*) override;
78
79private:
80	InputItem* itemAt(const QModelIndex& index);
81	const InputItem* itemAt(const QModelIndex& index) const;
82	bool loadShortcuts(InputItem*);
83	void loadGamepadShortcuts(InputItem*);
84	void onSubitems(InputItem*, std::function<void(InputItem*)> func);
85	void updateKey(InputItem* item, int keySequence);
86
87	InputItem m_rootMenu;
88	QMap<QMenu*, InputItem*> m_menuMap;
89	QMap<int, InputItem*> m_buttons;
90	QMap<QPair<int, GamepadAxisEvent::Direction>, InputItem*> m_axes;
91	QMap<int, InputItem*> m_heldKeys;
92	ConfigController* m_config;
93	QString m_profileName;
94	const InputProfile* m_profile;
95};
96
97}
98
99#endif