11#include <QDoubleSpinBox>
14#include <QKeySequence>
27class ShortcutOverriderBase
30 enum class DecisionOnShortcutOverride {
36 constexpr ShortcutOverriderBase() =
default;
37 virtual ~ShortcutOverriderBase()
39 virtual bool interestedInEvent(QKeyEvent *event) = 0;
40 virtual DecisionOnShortcutOverride handleEvent(QObject *receiver, QKeyEvent *event) = 0;
41 virtual DecisionOnShortcutOverride finishedPhysicalKeyPressHandling()
43 return DecisionOnShortcutOverride::askNext;
47class LineTextEditingShortcutOverrider :
public ShortcutOverriderBase
50 constexpr LineTextEditingShortcutOverrider() =
default;
52 virtual bool interestedInEvent(QKeyEvent *event)
override
54 static constexpr QKeySequence::StandardKey actionsForQLineEdit[]{
55 QKeySequence::MoveToNextChar
56 ,QKeySequence::MoveToPreviousChar
57 ,QKeySequence::MoveToStartOfLine
58 ,QKeySequence::MoveToEndOfLine
59 ,QKeySequence::MoveToPreviousWord
60 ,QKeySequence::MoveToNextWord
61 ,QKeySequence::SelectPreviousChar
62 ,QKeySequence::SelectNextChar
63 ,QKeySequence::SelectNextWord
64 ,QKeySequence::SelectPreviousWord
65 ,QKeySequence::SelectStartOfLine
66 ,QKeySequence::SelectEndOfLine
67 ,QKeySequence::SelectAll
68 ,QKeySequence::Deselect
69 ,QKeySequence::Backspace
70 ,QKeySequence::DeleteStartOfWord
72 ,QKeySequence::DeleteEndOfWord
73 ,QKeySequence::DeleteEndOfLine
80 for (QKeySequence::StandardKey sk : actionsForQLineEdit) {
81 if (event->matches(sk)) {
89 virtual DecisionOnShortcutOverride handleEvent(QObject *receiver, QKeyEvent *event)
override
93 if ((qobject_cast<QLineEdit*> (receiver) !=
nullptr)||
94 (qobject_cast<QSpinBox*> (receiver) !=
nullptr)||
95 (qobject_cast<QDoubleSpinBox*>(receiver) !=
nullptr)) {
97 return DecisionOnShortcutOverride::overrideShortcut;
99 return DecisionOnShortcutOverride::askNext;
104class SpinboxShortcutOverrider :
public ShortcutOverriderBase
107 constexpr SpinboxShortcutOverrider() =
default;
109 virtual bool interestedInEvent(QKeyEvent *event)
override
111 if (event->modifiers() != Qt::NoModifier) {
114 switch (event->key()) {
117 case Qt::Key_PageDown:
125 virtual DecisionOnShortcutOverride handleEvent(QObject *receiver, QKeyEvent *event)
override
129 if (qobject_cast<QSpinBox*> (receiver) !=
nullptr||
130 qobject_cast<QDoubleSpinBox*>(receiver) !=
nullptr) {
132 return DecisionOnShortcutOverride::overrideShortcut;
134 return DecisionOnShortcutOverride::askNext;
140class TabShortcutOverrider :
public ShortcutOverriderBase
143 constexpr TabShortcutOverrider() =
default;
145 virtual bool interestedInEvent(QKeyEvent *event)
override
147 bool tab =
event->modifiers() == Qt::NoModifier &&
148 (
event->key() == Qt::Key_Tab ||
149 event->key() == Qt::Key_Backtab);
150 bool shiftTab =
event->modifiers() == Qt::ShiftModifier &&
151 event->key() == Qt::Key_Backtab;
152 if (tab || shiftTab) {
158 virtual DecisionOnShortcutOverride handleEvent(QObject *receiver, QKeyEvent *event)
override
162 if (qobject_cast<KisQPainterCanvas*>(receiver) !=
nullptr||
163 qobject_cast<KisOpenGLCanvas2*> (receiver) !=
nullptr) {
165 return DecisionOnShortcutOverride::dontOverrideShortcut;
168 return DecisionOnShortcutOverride::askNext;
171 virtual DecisionOnShortcutOverride finishedPhysicalKeyPressHandling()
override
174 m_nooverride =
false;
175 return DecisionOnShortcutOverride::overrideShortcut;
177 return DecisionOnShortcutOverride::askNext;
180 bool m_nooverride =
false;
187LineTextEditingShortcutOverrider overrider0;
188SpinboxShortcutOverrider overrider1;
189TabShortcutOverrider overrider2;
191constexpr ShortcutOverriderBase *allShortcutOverriders[] = {
192 &overrider0, &overrider1, &overrider2
195constexpr int numOfShortcutOverriders =
196 sizeof(allShortcutOverriders)/
197 sizeof(allShortcutOverriders[0]);
214 ShortcutOverriderBase::DecisionOnShortcutOverride
decision = ShortcutOverriderBase::DecisionOnShortcutOverride::askNext;
219 for (
int i=0; i < numOfShortcutOverriders; ++i) {
220 if (allShortcutOverriders[i]->interestedInEvent(event)) {
226 decision = ShortcutOverriderBase::DecisionOnShortcutOverride::askNext;
244 switch(event->type()) {
245 case QEvent::ShortcutOverride:{
255 QKeyEvent *key =
static_cast<QKeyEvent*
>(event);
259 for(
int i = 0; i < numOfShortcutOverriders; ++i) {
260 if (
d->
decision != ShortcutOverriderBase::DecisionOnShortcutOverride::askNext) {
264 d->
decision = allShortcutOverriders[i]->handleEvent(receiver, key);
269 if (qobject_cast<KisMainWindow*>(receiver)!=
nullptr||
270 receiver->inherits(QDockWidget::staticMetaObject.className())) {
271 for (
int i = 0; i < numOfShortcutOverriders; ++i) {
272 if (
d->
decision != ShortcutOverriderBase::DecisionOnShortcutOverride::askNext) {
276 d->
decision = allShortcutOverriders[i]->finishedPhysicalKeyPressHandling();
284 case ShortcutOverriderBase::DecisionOnShortcutOverride::askNext:
288 case ShortcutOverriderBase::DecisionOnShortcutOverride::dontOverrideShortcut:
292 case ShortcutOverriderBase::DecisionOnShortcutOverride::overrideShortcut:
301 return retval || QObject::eventFilter(receiver, event);
314 return QObject::eventFilter(receiver, event);
320 return kqwt_instance;
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)