Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_custom_modifiers_catcher.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QSet>
10
12#include <QDebug>
13#include <QEvent>
14#include <QKeyEvent>
15
16
18{
19 Private(QObject *_trackedObject) : trackedObject(_trackedObject) {}
20
21 QObject *trackedObject;
22
23 QSet<Qt::Key> trackedKeys;
24 QHash<QString, Qt::Key> idToKeyMap;
25 QSet<Qt::Key> pressedKeys;
26
27 void reset() {
28 // something went wrong!
29 pressedKeys.clear();
30 }
31};
32
33
35 : QObject(parent),
36 m_d(new Private(parent))
37{
38 if (m_d->trackedObject) {
39 parent->installEventFilter(this);
40 }
41}
42
46
47void KisCustomModifiersCatcher::addModifier(const QString &id, Qt::Key modifier)
48{
49 m_d->idToKeyMap.insert(id, modifier);
50 m_d->trackedKeys.insert(modifier);
51
52 m_d->reset();
53}
54
56{
57 if (!m_d->idToKeyMap.contains(id)) {
58 qWarning() << "KisCustomModifiersCatcher::modifierPressed(): unexpected modifier id:" << id;
59 return false;
60 }
61 return m_d->pressedKeys.contains(m_d->idToKeyMap[id]);
62}
63
64bool KisCustomModifiersCatcher::eventFilter(QObject* object, QEvent* event)
65{
66 if (object != m_d->trackedObject) return false;
67
68 switch (event->type()) {
69 case QEvent::ShortcutOverride: {
70 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
71
72 if (keyEvent->isAutoRepeat()) break;
73
75
76 if (m_d->trackedKeys.contains(key)) {
77 if (m_d->pressedKeys.contains(key)) {
78 m_d->reset();
79 } else {
80 m_d->pressedKeys.insert(key);
81 }
82 }
83 break;
84 }
85 case QEvent::KeyRelease: {
86 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
87
88 if (keyEvent->isAutoRepeat()) break;
89
91
92 if (m_d->trackedKeys.contains(key)) {
93 if (!m_d->pressedKeys.contains(key)) {
94 m_d->reset();
95 } else {
96 m_d->pressedKeys.remove(key);
97 }
98 }
99
100 break;
101 }
102 case QEvent::FocusIn: {
103 m_d->reset();
104
105 { // Emulate pressing of the key that are already pressed
107
108 Qt::KeyboardModifiers modifiers = mapper.queryStandardModifiers();
109 Q_FOREACH (Qt::Key key, mapper.queryExtendedModifiers()) {
110 QKeyEvent kevent(QEvent::ShortcutOverride, key, modifiers);
111 eventFilter(object, &kevent);
112 }
113 }
114 }
115 default:
116 break;
117 }
118
119 return false;
120}
bool eventFilter(QObject *object, QEvent *event) override
bool modifierPressed(const QString &id)
modifierPressed returns the state of the tracked modifier
void addModifier(const QString &id, Qt::Key modifier)
addModifier registers a custom modifier
const QScopedPointer< Private > m_d
static Qt::Key workaroundShiftAltMetaHell(const QKeyEvent *keyEvent)