blob: f9b6a99dbc275c9029580d27f71a24f100bb31b2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#pragma once
#include <QEvent>
#include <QKeyEvent>
#include <QMultiHash>
#include <QObject>
#include "control/controlobject.h"
#include "preferences/configobject.h"
class ControlObject;
// This class provides handling of keyboard events.
class KeyboardEventFilter : public QObject {
Q_OBJECT
public:
KeyboardEventFilter(ConfigObject<ConfigValueKbd> *pKbdConfigObject,
QObject *parent = nullptr, const char* name = nullptr);
virtual ~KeyboardEventFilter();
bool eventFilter(QObject* obj, QEvent* e);
// Set the keyboard config object. KeyboardEventFilter does NOT take
// ownership of pKbdConfigObject.
void setKeyboardConfig(ConfigObject<ConfigValueKbd> *pKbdConfigObject);
ConfigObject<ConfigValueKbd>* getKeyboardConfig();
private:
struct KeyDownInformation {
KeyDownInformation(int keyId, int modifiers, ControlObject* pControl)
: keyId(keyId),
modifiers(modifiers),
pControl(pControl) {
}
int keyId;
int modifiers;
ControlObject* pControl;
};
// Returns a valid QString with modifier keys from a QKeyEvent
QKeySequence getKeySeq(QKeyEvent *e);
// Run through list of active keys to see if the pressed key is already active
// and is not a control that repeats when held.
bool shouldSkipHeldKey(int keyId) {
return std::any_of(
m_qActiveKeyList.cbegin(),
m_qActiveKeyList.cend(),
[&](const KeyDownInformation& keyDownInfo) {
return keyDownInfo.keyId == keyId && !keyDownInfo.pControl->getKbdRepeatable();
});
}
// List containing keys which is currently pressed
QList<KeyDownInformation> m_qActiveKeyList;
// Pointer to keyboard config object
ConfigObject<ConfigValueKbd> *m_pKbdConfigObject;
// Multi-hash of key sequence to
QMultiHash<ConfigValueKbd, ConfigKey> m_keySequenceToControlHash;
};
|