Tablet manual test: show rotated ellipse if the stylus has rotation

Followup to da9e02eb83ea6eecf3cdb16b11241c91f5029380:
If the stylus is a Wacom Art Pen for example, the regular_widgets
test will show a rotated ellipse with size proportional to pressure
for each tablet point, instead of a circle.

Task-number: QTBUG-39458
Change-Id: I4bbb5f8ceabf7006928d95df3ecd62378394f085
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
This commit is contained in:
Shawn Rutledge 2014-08-15 13:09:18 +02:00
parent 74805930d1
commit 2f9c00d9a0

View File

@ -60,14 +60,15 @@ enum TabletPointType {
struct TabletPoint struct TabletPoint
{ {
TabletPoint(const QPointF &p = QPointF(), TabletPointType t = TabletMove, TabletPoint(const QPointF &p = QPointF(), TabletPointType t = TabletMove,
Qt::MouseButton b = Qt::LeftButton, QTabletEvent::PointerType pt = QTabletEvent::UnknownPointer, qreal prs = 0) : Qt::MouseButton b = Qt::LeftButton, QTabletEvent::PointerType pt = QTabletEvent::UnknownPointer, qreal prs = 0, qreal rotation = 0) :
pos(p), type(t), button(b), ptype(pt), pressure(prs) {} pos(p), type(t), button(b), ptype(pt), pressure(prs), angle(rotation) {}
QPointF pos; QPointF pos;
TabletPointType type; TabletPointType type;
Qt::MouseButton button; Qt::MouseButton button;
QTabletEvent::PointerType ptype; QTabletEvent::PointerType ptype;
qreal pressure; qreal pressure;
qreal angle;
}; };
class EventReportWidget : public QWidget class EventReportWidget : public QWidget
@ -111,6 +112,8 @@ void EventReportWidget::paintEvent(QPaintEvent *)
p.fillRect(geom, Qt::white); p.fillRect(geom, Qt::white);
p.drawRect(QRectF(geom.topLeft(), geom.bottomRight() - QPointF(1,1))); p.drawRect(QRectF(geom.topLeft(), geom.bottomRight() - QPointF(1,1)));
p.setPen(Qt::white); p.setPen(Qt::white);
QPainterPath ellipse;
ellipse.addEllipse(0, 0, 50, 10);
foreach (const TabletPoint &t, m_points) { foreach (const TabletPoint &t, m_points) {
if (geom.contains(t.pos)) { if (geom.contains(t.pos)) {
QPainterPath pp; QPainterPath pp;
@ -130,7 +133,16 @@ void EventReportWidget::paintEvent(QPaintEvent *)
case TabletMove: case TabletMove:
if (t.pressure > 0.0) { if (t.pressure > 0.0) {
p.setPen(t.ptype == QTabletEvent::Eraser ? Qt::red : Qt::black); p.setPen(t.ptype == QTabletEvent::Eraser ? Qt::red : Qt::black);
p.drawEllipse(t.pos, t.pressure * 10.0, t.pressure * 10.0); if (t.angle != 0.0) {
p.save();
p.translate(t.pos);
p.scale(t.pressure, t.pressure);
p.rotate(t.angle);
p.drawPath(ellipse);
p.restore();
} else {
p.drawEllipse(t.pos, t.pressure * 10.0, t.pressure * 10.0);
}
p.setPen(Qt::white); p.setPen(Qt::white);
} else { } else {
p.fillRect(t.pos.x() - 2, t.pos.y() - 2, 4, 4, Qt::black); p.fillRect(t.pos.x() - 2, t.pos.y() - 2, 4, 4, Qt::black);
@ -155,18 +167,18 @@ void EventReportWidget::tabletEvent(QTabletEvent *event)
break; break;
case QEvent::TabletMove: case QEvent::TabletMove:
type = QString::fromLatin1("TabletMove"); type = QString::fromLatin1("TabletMove");
m_points.push_back(TabletPoint(event->pos(), TabletMove, m_lastButton, event->pointerType(), event->pressure())); m_points.push_back(TabletPoint(event->pos(), TabletMove, m_lastButton, event->pointerType(), event->pressure(), event->rotation()));
update(); update();
break; break;
case QEvent::TabletPress: case QEvent::TabletPress:
type = QString::fromLatin1("TabletPress"); type = QString::fromLatin1("TabletPress");
m_points.push_back(TabletPoint(event->pos(), TabletButtonPress, event->button(), event->pointerType())); m_points.push_back(TabletPoint(event->pos(), TabletButtonPress, event->button(), event->pointerType(), event->rotation()));
m_lastButton = event->button(); m_lastButton = event->button();
update(); update();
break; break;
case QEvent::TabletRelease: case QEvent::TabletRelease:
type = QString::fromLatin1("TabletRelease"); type = QString::fromLatin1("TabletRelease");
m_points.push_back(TabletPoint(event->pos(), TabletButtonRelease, event->button(), event->pointerType())); m_points.push_back(TabletPoint(event->pos(), TabletButtonRelease, event->button(), event->pointerType(), event->rotation()));
update(); update();
break; break;
default: default: