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 }