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