File indexing completed on 2025-04-27 04:09:17
0001 /* 0002 Drawpile - a collaborative drawing program. 0003 0004 SPDX-FileCopyrightText: 2017 Calle Laakkonen 0005 0006 SPDX-License-Identifier: GPL-3.0-or-later 0007 */ 0008 0009 #include "tablettest.h" 0010 0011 #include <QPaintEvent> 0012 #include <QPainter> 0013 0014 TabletTester::TabletTester(QWidget *parent) 0015 : QWidget(parent), m_mouseDown(false), m_tabletDown(false) 0016 { 0017 // we don't explicitly update settings inside KisSpeedSmoother 0018 // here because the tablet tester is created every time anew. 0019 0020 } 0021 0022 QSize TabletTester::sizeHint() const 0023 { 0024 return QSize(500, 200); 0025 } 0026 0027 void TabletTester::clear() 0028 { 0029 m_mousePath.clear(); 0030 m_tabletPath.clear(); 0031 update(); 0032 } 0033 0034 void TabletTester::paintEvent(QPaintEvent *e) 0035 { 0036 Q_UNUSED(e); 0037 const int w = width(); 0038 const int h = height(); 0039 QPainter p(this); 0040 p.fillRect(0, 0, w, h, QColor(200, 200, 200)); 0041 p.setPen(QColor(128, 128, 128)); 0042 0043 // Draw grid 0044 for(int i=w/8;i<w;i+=w/8) 0045 p.drawLine(i, 0, i, h); 0046 for(int i=h/8;i<h;i+=h/8) 0047 p.drawLine(0, i, w, i); 0048 0049 // Draw paths 0050 if(!m_mousePath.isEmpty()) { 0051 p.setPen(QPen(Qt::red, 3)); 0052 p.drawPolyline(m_mousePath); 0053 } 0054 if(!m_tabletPath.isEmpty()) { 0055 p.setPen(QPen(Qt::blue, 2)); 0056 p.drawPolyline(m_tabletPath); 0057 } 0058 } 0059 0060 void TabletTester::mousePressEvent(QMouseEvent *e) 0061 { 0062 m_mouseDown = true; 0063 m_mousePath.clear(); 0064 m_mouseSpeedSmoother.clear(); 0065 0066 const qreal speed = m_tabletSpeedSmoother.getNextSpeed(e->pos(), e->timestamp()); 0067 Q_EMIT eventReport(QString("Mouse press X=%1 Y=%2 B=%3 S=%4").arg(e->x()).arg(e->y()).arg(e->button()).arg(speed)); 0068 0069 update(); 0070 } 0071 0072 void TabletTester::mouseMoveEvent(QMouseEvent *e) 0073 { 0074 const qreal speed = m_tabletSpeedSmoother.getNextSpeed(e->pos(), e->timestamp()); 0075 Q_EMIT eventReport(QString("Mouse move X=%1 Y=%2 B=%3 S=%4").arg(e->x()).arg(e->y()).arg(e->buttons()).arg(speed)); 0076 m_mousePath << e->pos(); 0077 update(); 0078 } 0079 0080 void TabletTester::mouseReleaseEvent(QMouseEvent *e) 0081 { 0082 Q_UNUSED(e); 0083 Q_EMIT eventReport(QString("Mouse release")); 0084 m_mouseDown = false; 0085 } 0086 0087 void TabletTester::tabletEvent(QTabletEvent *e) 0088 { 0089 e->accept(); 0090 0091 QString msg; 0092 switch(e->device()) { 0093 case QTabletEvent::Stylus: msg = "Stylus"; break; 0094 default: msg = QString("Device(%1)").arg(e->device()); break; 0095 } 0096 0097 switch(e->type()) { 0098 case QEvent::TabletMove: 0099 msg += " move"; 0100 0101 break; 0102 case QEvent::TabletPress: 0103 msg += " press"; 0104 m_tabletPath.clear(); 0105 m_tabletDown = true; 0106 m_tabletSpeedSmoother.clear(); 0107 break; 0108 case QEvent::TabletRelease: 0109 msg += " release"; 0110 m_tabletDown = false; 0111 break; 0112 default: 0113 msg += QString(" event-%1").arg(e->type()); 0114 break; 0115 } 0116 0117 const qreal speed = m_tabletSpeedSmoother.getNextSpeed(e->posF(), e->timestamp()); 0118 0119 msg += QString(" X=%1 Y=%2 B=%3 P=%4% TX=%6 TY=%7 S=%9") 0120 .arg(e->posF().x(), 0, 'f', 2) 0121 .arg(e->posF().y(), 0, 'f', 2) 0122 .arg(e->buttons()) 0123 .arg(e->pressure()*100, 0, 'f', 1) 0124 .arg(e->xTilt()) 0125 .arg(e->yTilt()) 0126 .arg(speed, 0, 'f', 1) 0127 ; 0128 0129 if(e->type() == QEvent::TabletMove) { 0130 if(m_tabletDown) { 0131 msg += " (DRAW)"; 0132 m_tabletPath << e->pos(); 0133 update(); 0134 } else { 0135 msg += " (HOVER)"; 0136 } 0137 } 0138 0139 Q_EMIT eventReport(msg); 0140 }