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 }