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