Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_single_action_shortcut.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2012 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QKeySequence>
11#include <kis_assert.h>
12
13class Q_DECL_HIDDEN KisSingleActionShortcut::Private
14{
15public:
16 QSet<Qt::Key> modifiers;
17 Qt::Key key;
20};
21
22
28
33
35{
36 return m_d->modifiers.size() * 2 + 1 + action()->priority();
37}
38
39void KisSingleActionShortcut::setKey(const QSet<Qt::Key> &modifiers, Qt::Key key)
40{
41 m_d->modifiers = modifiers;
42 m_d->key = key;
43 m_d->useWheel = false;
44}
45
46void KisSingleActionShortcut::setWheel(const QSet<Qt::Key> &modifiers, WheelAction wheelAction)
47{
48 m_d->modifiers = modifiers;
49 m_d->wheelAction = wheelAction;
50 m_d->useWheel = true;
51}
52
53bool KisSingleActionShortcut::match(const QSet<Qt::Key> &modifiers, Qt::Key key)
54{
55 return !m_d->useWheel && key == m_d->key &&
56 compareKeys(modifiers, m_d->modifiers);
57}
58
59bool KisSingleActionShortcut::match(const QSet<Qt::Key> &modifiers, WheelAction wheelAction)
60{
61 return m_d->useWheel && wheelAction == m_d->wheelAction &&
62 compareKeys(modifiers, m_d->modifiers);
63}
64
65bool KisSingleActionShortcut::conflictsWith(const QKeySequence &seq)
66{
67 if (seq.isEmpty()) return false;
68
69 int seqMainKey = seq[0];
70 QVector<int> sequenceKeys;
71
72 if (seqMainKey & Qt::MetaModifier) {
73 sequenceKeys.append(Qt::Key_Meta);
74 seqMainKey &= ~Qt::MetaModifier;
75 } else if (seqMainKey & Qt::ControlModifier) {
76 sequenceKeys.append(Qt::Key_Control);
77 seqMainKey &= ~Qt::ControlModifier;
78 } else if (seqMainKey & Qt::ShiftModifier) {
79 sequenceKeys.append(Qt::Key_Shift);
80 seqMainKey &= ~Qt::ShiftModifier;
81 } else if (seqMainKey & Qt::AltModifier) {
82 sequenceKeys.append(Qt::Key_Alt);
83 seqMainKey &= ~Qt::AltModifier;
84 }
85
86 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(seqMainKey != 0, false);
87 sequenceKeys.append(seqMainKey);
88 std::sort(sequenceKeys.begin(), sequenceKeys.end());
89
90 QVector<int> shortcutKeys;
91 std::copy(m_d->modifiers.begin(), m_d->modifiers.end(), std::back_inserter(shortcutKeys));
92 shortcutKeys.append(m_d->key);
93 std::sort(shortcutKeys.begin(), shortcutKeys.end());
94
95 return
96 std::includes(sequenceKeys.begin(), sequenceKeys.end(),
97 shortcutKeys.begin(), shortcutKeys.end()) ||
98 std::includes(shortcutKeys.begin(), shortcutKeys.end(),
99 sequenceKeys.begin(), sequenceKeys.end());
100}
Abstract base class for input actions.
KisAbstractInputAction * action
bool compareKeys(const QSet< Qt::Key > &keys1, const QSet< Qt::Key > &keys2)
void setWheel(const QSet< Qt::Key > &modifiers, WheelAction wheelAction)
KisSingleActionShortcut(KisAbstractInputAction *action, int index)
bool conflictsWith(const QKeySequence &seq)
bool match(const QSet< Qt::Key > &modifiers, Qt::Key key)
void setKey(const QSet< Qt::Key > &modifiers, Qt::Key key)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129