Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_stroke_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
10
11#include <QMouseEvent>
12
13#include <cmath>
14
15class Q_DECL_HIDDEN KisStrokeShortcut::Private
16{
17public:
18 QSet<Qt::Key> modifiers;
19 QSet<Qt::MouseButton> buttons;
20};
21
22
24 : KisAbstractShortcut(action, index),
25 m_d(new Private)
26{
27}
28
33
35{
36 const int maxScore = std::log2((int) Qt::MaxMouseButton);
37 int buttonScore = 0;
38 Q_FOREACH (Qt::MouseButton button, m_d->buttons) {
39 buttonScore += maxScore - std::log2((int) button);
40 }
41
42 return m_d->modifiers.size() * 0xFFFF + buttonScore * 0xFF + action()->priority();
43}
44
45void KisStrokeShortcut::setButtons(const QSet<Qt::Key> &modifiers,
46 const QSet<Qt::MouseButton> &buttons)
47{
48 if (buttons.empty()) return;
49
50 m_d->modifiers = modifiers;
51 m_d->buttons = buttons;
52}
53
54bool KisStrokeShortcut::matchReady(const QSet<Qt::Key> &modifiers,
55 const QSet<Qt::MouseButton> &buttons)
56{
57 bool modifiersOk =
58 (m_d->modifiers.isEmpty() && action()->canIgnoreModifiers()) ||
59 compareKeys(m_d->modifiers, modifiers);
60
61 if (!modifiersOk || buttons.size() < m_d->buttons.size() - 1) {
62 return false;
63 }
64
65 Q_FOREACH (Qt::MouseButton button, buttons) {
66 if (!m_d->buttons.contains(button)) return false;
67 }
68 return true;
69}
70
72{
73 return m_d->buttons.contains(button);
74}
75
76QMouseEvent KisStrokeShortcut::fakeEndEvent(const QPointF &localPos) const
77{
78 Qt::MouseButton button = !m_d->buttons.isEmpty() ? *m_d->buttons.begin() : Qt::NoButton;
79 return QMouseEvent(QEvent::MouseButtonRelease, localPos, button, Qt::NoButton, Qt::NoModifier);
80}
Abstract base class for input actions.
virtual bool canIgnoreModifiers() const
KisAbstractInputAction * action
bool compareKeys(const QSet< Qt::Key > &keys1, const QSet< Qt::Key > &keys2)
int priority() const override
KisStrokeShortcut(KisAbstractInputAction *action, int index)
QSet< Qt::MouseButton > buttons
QMouseEvent fakeEndEvent(const QPointF &localPos) const
bool matchReady(const QSet< Qt::Key > &modifiers, const QSet< Qt::MouseButton > &buttons)
QSet< Qt::Key > modifiers
void setButtons(const QSet< Qt::Key > &modifiers, const QSet< Qt::MouseButton > &buttons)
bool matchBegin(Qt::MouseButton button)
QString button(const QWheelEvent &ev)
QString buttons(const T &ev)