all repos — mgba @ 34dc2ae6f51b2a19e8a23718b87d229dc0bbf007

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 <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