Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_scratch_pad_event_filter.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8#include "kis_scratch_pad.h"
9
10#include <QWidget>
11#include <QDebug>
12#include <QEvent>
13#include <QMouseEvent>
14#include <QTabletEvent>
15
17 : QObject(parent),
18 m_tabletPressed(false),
19 m_pressedButton(Qt::NoButton)
20{
21 parent->installEventFilter(this);
22 m_scratchPad = qobject_cast<KisScratchPad *>(parent);
23}
24
26{
27 m_widgetToDocument = transform;
28}
29
31{
32 return static_cast<QWidget*>(parent());
33}
34
36{
37 QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
38 return new KoPointerEvent(mouseEvent, m_widgetToDocument.map(mouseEvent->pos()));
39}
40
42{
43 QTabletEvent *tabletEvent = static_cast<QTabletEvent*>(event);
44 const QPointF pos = tabletEvent->posF();
45 return new KoPointerEvent(tabletEvent, m_widgetToDocument.map(pos));
46}
47
48
49bool KisScratchPadEventFilter::eventFilter(QObject *obj, QEvent *event)
50{
51 Q_UNUSED(obj);
52 bool result = false;
53
54 QScopedPointer<KoPointerEvent> ev;
55
56 if (shouldResetWheelDelta(event)) {
58 }
59
60 switch(event->type()) {
61 case QEvent::MouseButtonPress:
62 if (m_pressedButton != Qt::NoButton) break;
63
64 ev.reset(createMouseEvent(event));
65 m_pressedButton = ev->button();
66 m_scratchPad->pointerPress(ev.data());
67 result = true;
68 break;
69 case QEvent::MouseButtonRelease:
70 ev.reset(createMouseEvent(event));
71 if (ev->button() != m_pressedButton) break;
72
73 m_pressedButton = Qt::NoButton;
74 m_scratchPad->pointerRelease(ev.data());
75 result = true;
76 break;
77 case QEvent::MouseMove:
78 if(m_tabletPressed) break;
79 ev.reset(createMouseEvent(event));
80 m_scratchPad->pointerMove(ev.data());
81 result = true;
82 break;
83 case QEvent::TabletPress:
84 if (m_pressedButton != Qt::NoButton) break;
85
86 m_tabletPressed = true;
87 ev.reset(createTabletEvent(event));
88 m_pressedButton = ev->button();
89 m_scratchPad->pointerPress(ev.data());
90 result = true;
91 break;
92 case QEvent::TabletRelease:
93 ev.reset(createTabletEvent(event));
94 if (ev->button() != m_pressedButton) break;
95
96 m_pressedButton = Qt::NoButton;
97 m_scratchPad->pointerRelease(ev.data());
98 m_tabletPressed = false;
99 result = true;
100 break;
101 case QEvent::TabletMove:
102 ev.reset(createTabletEvent(event));
103 m_scratchPad->pointerMove(ev.data());
104 result = true;
105 break;
106 case QEvent::FocusIn:
107 case QEvent::FocusOut:
108 case QEvent::Show:
109 case QEvent::Hide:
111 m_tabletPressed = false;
112 m_pressedButton = Qt::NoButton;
113 break;
114 case QEvent::Wheel:
115 if (m_pressedButton != Qt::NoButton) break;
116
117 m_pressedButton = Qt::NoButton;
118 m_scratchPad->wheelDelta(static_cast<QWheelEvent*>(event));
119 result = true;
120 break;
121 default:
122 result = false;
123 }
124
125 if (ev) {
126 result = ev->isAccepted();
127 event->setAccepted(result);
128 }
129
130 return result;
131}
132
134{
135 return
136 event->type() == QEvent::FocusIn ||
137 event->type() == QEvent::FocusOut ||
138 event->type() == QEvent::MouseButtonPress ||
139 event->type() == QEvent::MouseButtonRelease ||
140 event->type() == QEvent::MouseButtonDblClick ||
141 event->type() == QEvent::TabletPress ||
142 event->type() == QEvent::TabletRelease ||
143 event->type() == QEvent::Enter ||
144 event->type() == QEvent::Leave ||
145 event->type() == QEvent::TouchBegin ||
146 event->type() == QEvent::TouchEnd ||
147 event->type() == QEvent::TouchCancel ||
148 event->type() == QEvent::NativeGesture;
149}
150
bool eventFilter(QObject *obj, QEvent *event) override
KoPointerEvent * createMouseEvent(QEvent *event)
void setWidgetToDocumentTransform(const QTransform &transform)
KoPointerEvent * createTabletEvent(QEvent *event)
void pointerMove(KoPointerEvent *event)
void pointerPress(KoPointerEvent *event)
void wheelDelta(QWheelEvent *event)
void pointerRelease(KoPointerEvent *event)