File indexing completed on 2024-06-09 04:24:35
0001 /* 0002 * SPDX-FileCopyrightText: 2012 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "kis_single_action_shortcut.h" 0008 0009 #include <QKeySequence> 0010 #include "kis_abstract_input_action.h" 0011 #include <kis_assert.h> 0012 0013 class Q_DECL_HIDDEN KisSingleActionShortcut::Private 0014 { 0015 public: 0016 QSet<Qt::Key> modifiers; 0017 Qt::Key key; 0018 bool useWheel; 0019 WheelAction wheelAction; 0020 }; 0021 0022 0023 KisSingleActionShortcut::KisSingleActionShortcut(KisAbstractInputAction *action, int index) 0024 : KisAbstractShortcut(action, index), 0025 m_d(new Private) 0026 { 0027 } 0028 0029 KisSingleActionShortcut::~KisSingleActionShortcut() 0030 { 0031 delete m_d; 0032 } 0033 0034 int KisSingleActionShortcut::priority() const 0035 { 0036 return m_d->modifiers.size() * 2 + 1 + action()->priority(); 0037 } 0038 0039 void KisSingleActionShortcut::setKey(const QSet<Qt::Key> &modifiers, Qt::Key key) 0040 { 0041 m_d->modifiers = modifiers; 0042 m_d->key = key; 0043 m_d->useWheel = false; 0044 } 0045 0046 void KisSingleActionShortcut::setWheel(const QSet<Qt::Key> &modifiers, WheelAction wheelAction) 0047 { 0048 m_d->modifiers = modifiers; 0049 m_d->wheelAction = wheelAction; 0050 m_d->useWheel = true; 0051 } 0052 0053 bool KisSingleActionShortcut::match(const QSet<Qt::Key> &modifiers, Qt::Key key) 0054 { 0055 return !m_d->useWheel && key == m_d->key && 0056 compareKeys(modifiers, m_d->modifiers); 0057 } 0058 0059 bool KisSingleActionShortcut::match(const QSet<Qt::Key> &modifiers, WheelAction wheelAction) 0060 { 0061 return m_d->useWheel && wheelAction == m_d->wheelAction && 0062 compareKeys(modifiers, m_d->modifiers); 0063 } 0064 0065 bool KisSingleActionShortcut::conflictsWith(const QKeySequence &seq) 0066 { 0067 if (seq.isEmpty()) return false; 0068 0069 int seqMainKey = seq[0]; 0070 QVector<int> sequenceKeys; 0071 0072 if (seqMainKey & Qt::MetaModifier) { 0073 sequenceKeys.append(Qt::Key_Meta); 0074 seqMainKey &= ~Qt::MetaModifier; 0075 } else if (seqMainKey & Qt::ControlModifier) { 0076 sequenceKeys.append(Qt::Key_Control); 0077 seqMainKey &= ~Qt::ControlModifier; 0078 } else if (seqMainKey & Qt::ShiftModifier) { 0079 sequenceKeys.append(Qt::Key_Shift); 0080 seqMainKey &= ~Qt::ShiftModifier; 0081 } else if (seqMainKey & Qt::AltModifier) { 0082 sequenceKeys.append(Qt::Key_Alt); 0083 seqMainKey &= ~Qt::AltModifier; 0084 } 0085 0086 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(seqMainKey != 0, false); 0087 sequenceKeys.append(seqMainKey); 0088 std::sort(sequenceKeys.begin(), sequenceKeys.end()); 0089 0090 QVector<int> shortcutKeys; 0091 std::copy(m_d->modifiers.begin(), m_d->modifiers.end(), std::back_inserter(shortcutKeys)); 0092 shortcutKeys.append(m_d->key); 0093 std::sort(shortcutKeys.begin(), shortcutKeys.end()); 0094 0095 return 0096 std::includes(sequenceKeys.begin(), sequenceKeys.end(), 0097 shortcutKeys.begin(), shortcutKeys.end()) || 0098 std::includes(shortcutKeys.begin(), shortcutKeys.end(), 0099 sequenceKeys.begin(), sequenceKeys.end()); 0100 }