Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_tablet_debugger.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QEvent>
10#include <QMessageBox>
11#include <QApplication>
12
13#include <kis_debug.h>
14#include <kis_config.h>
15#include <KisPortingUtils.h>
16
17#include <QGlobalStatic>
18
19#include <klocalizedstring.h>
20
22
23
24inline QString button(const QWheelEvent &ev) {
25 Q_UNUSED(ev);
26 return "-";
27}
28
29template <class T>
30QString button(const T &ev) {
31 return QString::number(ev.button());
32}
33
34template <class T>
35QString buttons(const T &ev) {
36 return QString::number(ev.buttons());
37}
38
39template <class Event>
40 void dumpBaseParams(QTextStream &s, const Event &ev, const QString &prefix)
41{
42 s << qSetFieldWidth(5) << Qt::left << prefix << Qt::reset << " ";
43 s << qSetFieldWidth(17) << Qt::left << KisTabletDebugger::exTypeToString(ev.type()) << Qt::reset;
44}
45
46template <class Event>
47 void dumpMouseRelatedParams(QTextStream &s, const Event &ev)
48{
49 s << "btn: " << button(ev) << " ";
50 s << "btns: " << buttons(ev) << " ";
51 s << "pos: " << qSetFieldWidth(4) << ev.x() << qSetFieldWidth(0) << "," << qSetFieldWidth(4) << ev.y() << qSetFieldWidth(0) << " ";
52 s << "gpos: " << qSetFieldWidth(4) << ev.globalX() << qSetFieldWidth(0) << "," << qSetFieldWidth(4) << ev.globalY() << qSetFieldWidth(0) << " ";
53}
54
55template <>
56 void dumpMouseRelatedParams(QTextStream &s, const QWheelEvent &ev)
57{
58 s << "btn: " << button(ev) << " ";
59 s << "btns: " << buttons(ev) << " ";
60 s << "pos: " << qSetFieldWidth(4) << ev.position().x() << qSetFieldWidth(0) << "," << qSetFieldWidth(4) << ev.position().y() << qSetFieldWidth(0) << " ";
61 s << "gpos: " << qSetFieldWidth(4) << ev.globalPosition().x() << qSetFieldWidth(0) << "," << qSetFieldWidth(4) << ev.globalPosition().y() << qSetFieldWidth(0) << " ";
62}
63
64QString KisTabletDebugger::exTypeToString(QEvent::Type type) {
65 return
66 type == QEvent::TabletEnterProximity ? "TabletEnterProximity" :
67 type == QEvent::TabletLeaveProximity ? "TabletLeaveProximity" :
68 type == QEvent::Enter ? "Enter" :
69 type == QEvent::Leave ? "Leave" :
70 type == QEvent::FocusIn ? "FocusIn" :
71 type == QEvent::FocusOut ? "FocusOut" :
72 type == QEvent::Wheel ? "Wheel" :
73 type == QEvent::KeyPress ? "KeyPress" :
74 type == QEvent::KeyRelease ? "KeyRelease" :
75 type == QEvent::ShortcutOverride ? "ShortcutOverride" :
76 type == QMouseEvent::MouseButtonPress ? "MouseButtonPress" :
77 type == QMouseEvent::MouseButtonRelease ? "MouseButtonRelease" :
78 type == QMouseEvent::MouseButtonDblClick ? "MouseButtonDblClick" :
79 type == QMouseEvent::MouseMove ? "MouseMove" :
80 type == QTabletEvent::TabletMove ? "TabletMove" :
81 type == QTabletEvent::TabletPress ? "TabletPress" :
82 type == QTabletEvent::TabletRelease ? "TabletRelease" :
83 type == QTouchEvent::TouchBegin ? "TouchBegin" :
84 type == QTouchEvent::TouchUpdate ? "TouchUpdate" :
85 type == QTouchEvent::TouchEnd ? "TouchEnd" :
86 type == QTouchEvent::TouchCancel ? "TouchCancel" :
87 type == QTouchEvent::NativeGesture ? "NativeGesture" :
88 "unknown";
89}
90
91inline QString sourceToString(Qt::MouseEventSource source) {
92 switch (source) {
93 case Qt::MouseEventNotSynthesized:
94 return "NotSynthesized";
95 case Qt::MouseEventSynthesizedBySystem:
96 return "SynthesizedBySystem";
97 case Qt::MouseEventSynthesizedByQt:
98 return "SynthesizedByQt";
99 case Qt::MouseEventSynthesizedByApplication:
100 return "SynthesizedByApplication";
101 }
102
103 return "<unknown>";
104}
105
107 : m_debugEnabled(false)
108{
109 KisConfig cfg(true);
111}
112
114{
115 return s_instance;
116}
117
119{
121 QMessageBox::information(qApp->activeWindow(), i18nc("@title:window", "Krita"), m_debugEnabled ?
122 i18n("Tablet Event Logging Enabled") :
123 i18n("Tablet Event Logging Disabled"));
124 if (m_debugEnabled) {
125 dbgTablet << "vvvvvvvvvvvvvvvvvvvvvvv START TABLET EVENT LOG vvvvvvvvvvvvvvvvvvvvvvv";
126 }
127 else {
128 dbgTablet << "^^^^^^^^^^^^^^^^^^^^^^^ END TABLET EVENT LOG ^^^^^^^^^^^^^^^^^^^^^^^";
129 }
130}
131
133{
134 return m_debugEnabled;
135}
136
137QString KisTabletDebugger::eventToString(const QMouseEvent &ev, const QString &prefix)
138{
139 QString string;
140 QTextStream s(&string);
141
142 dumpBaseParams(s, ev, prefix);
144 s << "hires: " << qSetFieldWidth(8) << ev.screenPos().x() << qSetFieldWidth(0) << "," << qSetFieldWidth(8) << ev.screenPos().y() << qSetFieldWidth(0) << " ";
145 s << "source: " << sourceToString(ev.source()) << " ";
146#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
147 s << "dev. type: " << static_cast<int>(ev.device()->type()) << " ";
148 s << "dev. caps: " << static_cast<int>(ev.device()->capabilities()) << " ";
149 s << "dev. name: " << ev.device()->name() << " ";
150#endif
151
152 return string;
153}
154
155QString KisTabletDebugger::eventToString(const QKeyEvent &ev, const QString &prefix)
156{
157 QString string;
158 QTextStream s(&string);
160
161 dumpBaseParams(s, ev, prefix);
162
163 s << "key: 0x" << Qt::hex << ev.key() << Qt::reset << " ";
164 s << "mod: 0x" << Qt::hex << ev.modifiers() << Qt::reset << " ";
165 s << "text: " << (ev.text().isEmpty() ? "none" : ev.text()) << " ";
166 s << "autorepeat: " << bool(ev.isAutoRepeat());
167
168 return string;
169}
170
171QString KisTabletDebugger::eventToString(const QWheelEvent &ev, const QString &prefix)
172{
173 QString string;
174 QTextStream s(&string);
176
177 dumpBaseParams(s, ev, prefix);
179
180 s << "delta: x: " << ev.angleDelta().x() << " y: " << ev.angleDelta().y() << " ";
181 s << "source: " << sourceToString(ev.source()) << " ";
182
183 QString phaseString;
184 QDebug(&phaseString) << ev.phase();
185 s << "phase: " << phaseString << " ";
186
187#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
188 s << "dev. type: " << static_cast<int>(ev.device()->type()) << " ";
189 s << "dev. caps: " << static_cast<int>(ev.device()->capabilities()) << " ";
190 s << "dev. name: " << ev.device()->name() << " ";
191#endif
192
193 return string;
194}
195
196QString KisTabletDebugger::eventToString(const QTouchEvent &ev, const QString &prefix)
197{
198 QString string;
199 QTextStream s(&string);
201
202 dumpBaseParams(s, ev, prefix);
203#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
204 s << (ev.device()->type() ? "TouchPad" : "TouchScreen") << " ";
205#else
206 if (ev.deviceType() == QInputDevice::DeviceType::TouchPad) {
207 s << "Touchpad";
208 }
209 else if (ev.deviceType() == QInputDevice::DeviceType::TouchScreen) {
210 s << "TouchScreen";
211 }
212 s << " ";
213#endif
214 for (const auto& touchpoint: ev.touchPoints()) {
215 s << "id: " << touchpoint.id() << " ";
216 s << "hires: " << qSetFieldWidth(8) << touchpoint.screenPos().x() << qSetFieldWidth(0) << "," << qSetFieldWidth(8) << touchpoint.screenPos().y() << qSetFieldWidth(0) << " ";
217 s << "prs: " << touchpoint.pressure() << " ";
218 s << "rot: "<< touchpoint.rotation() << " ";
219 s << "state: 0x" << Qt::hex << touchpoint.state() << "; ";
220 s << Qt::dec;
221 }
222
223 return string;
224}
225
226QString KisTabletDebugger::eventToString(const QEvent &ev, const QString &prefix)
227{
228 QString string;
229 QTextStream s(&string);
231
232 dumpBaseParams(s, ev, prefix);
233
234 return string;
235}
236
237template <class Event>
238 QString tabletEventToString(const Event &ev, const QString &prefix)
239{
240 QString string;
241 QTextStream s(&string);
243
244 dumpBaseParams(s, ev, prefix);
246
247 s << "hires: " << qSetFieldWidth(8) << ev.globalPosF().x() << qSetFieldWidth(0) << "," << qSetFieldWidth(8) << ev.globalPosF().y() << qSetFieldWidth(0) << " ";
248 s << "prs: " << qSetFieldWidth(4) << Qt::fixed << ev.pressure() << Qt::reset << " ";
249
250
253
254 s << "id: " << ev.uniqueId() << " ";
255
256 s << "xTilt: " << ev.xTilt() << " ";
257 s << "yTilt: " << ev.yTilt() << " ";
258 s << "rot: " << ev.rotation() << " ";
259 s << "z: " << ev.z() << " ";
260 s << "tp: " << ev.tangentialPressure() << " ";
261
262 return string;
263}
264
265QString KisTabletDebugger::eventToString(const QTabletEvent &ev, const QString &prefix)
266{
267 return tabletEventToString(ev, prefix);
268}
269
270QString KisTabletDebugger::eventToString(const QNativeGestureEvent &ev, const QString &prefix)
271{
272 const auto gestureTypeToString = [](Qt::NativeGestureType gestureType) -> const char* {
273 switch (gestureType) {
274 case Qt::BeginNativeGesture:
275 return "BeginNativeGesture";
276 case Qt::EndNativeGesture:
277 return "EndNativeGesture";
278 case Qt::PanNativeGesture:
279 return "PanNativeGesture";
280 case Qt::ZoomNativeGesture:
281 return "ZoomNativeGesture";
282 case Qt::SmartZoomNativeGesture:
283 return "SmartZoomNativeGesture";
284 case Qt::RotateNativeGesture:
285 return "RotateNativeGesture";
286 case Qt::SwipeNativeGesture:
287 return "SwipeNativeGesture";
288 default:
289 return "UnknownNativeGesture";
290 }
291 };
292
293 QString string;
294 QTextStream s(&string);
296
297 dumpBaseParams(s, ev, prefix);
298
299 s << gestureTypeToString(ev.gestureType()) << " "
300 << "value: " << ev.value() << " "
301#if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
302 << "delta: " << ev.delta().x() << "," << ev.delta().y() << " "
303 << "fingerCount: " << ev.fingerCount() << " "
304#endif
305 ;
306
307 return string;
308}
309
310QString KisTabletDebugger::tabletDeviceToString(const QTabletEvent &event)
311{
312#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
313 return
314 event.deviceType() == QTabletEvent::NoDevice ? "NoDevice" :
315 event.deviceType() == QTabletEvent::Puck ? "Puck" :
316 event.deviceType() == QTabletEvent::Stylus ? "Stylus" :
317 event.deviceType() == QTabletEvent::Airbrush ? "Airbrush" :
318 event.deviceType() == QTabletEvent::FourDMouse ? "FourDMouse" :
319 event.deviceType() == QTabletEvent::XFreeEraser ? "XFreeEraser" :
320 event.deviceType() == QTabletEvent::RotationStylus ? "RotationStylus" :
321 "Unknown";
322#else
323 QInputDevice::DeviceType deviceType = event.deviceType();
324
325 return
326 deviceType == QInputDevice::DeviceType::Puck ? "Puck" :
327 deviceType == QInputDevice::DeviceType::Stylus ? "Stylus" :
328 deviceType == QInputDevice::DeviceType::Airbrush ? "Airbrush" :
329 "Unknown";
330#endif
331}
332
333QString KisTabletDebugger::pointerTypeToString(const QTabletEvent &event) {
334#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
335 return
336 event.pointerType() == QTabletEvent::UnknownPointer ? "UnknownPointer" :
337 event.pointerType() == QTabletEvent::Pen ? "Pen" :
338 event.pointerType() == QTabletEvent::Cursor ? "Cursor" :
339 event.pointerType() == QTabletEvent::Eraser ? "Eraser" :
340 "Unknown";
341#else
342 QPointingDevice::PointerType pointerType = event.pointerType();
343 return
344 pointerType == QPointingDevice::PointerType::Pen ? "Pen" :
345 pointerType == QPointingDevice::PointerType::Cursor ? "Cursor" :
346 pointerType == QPointingDevice::PointerType::Eraser ? "Eraser" :
347 "Unknown";
348#endif
349
350}
351
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
bool shouldEatDriverShortcuts(bool defaultValue=false) const
QString eventToString(const QMouseEvent &ev, const QString &prefix)
static KisTabletDebugger * instance()
static QString pointerTypeToString(const QTabletEvent &event)
static QString tabletDeviceToString(const QTabletEvent &event)
static QString exTypeToString(QEvent::Type type)
#define dbgTablet
Definition kis_debug.h:62
QString tabletEventToString(const Event &ev, const QString &prefix)
void dumpBaseParams(QTextStream &s, const Event &ev, const QString &prefix)
QString button(const QWheelEvent &ev)
void dumpMouseRelatedParams(QTextStream &s, const Event &ev)
QString sourceToString(Qt::MouseEventSource source)
QString buttons(const T &ev)
void setUtf8OnStream(QTextStream &stream)