From e026fdc4a79a5c0bea9c7ceec8477b7826e552ea Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Mon, 27 Jul 2015 17:58:03 +0200 Subject: [PATCH] Tablet example: update the cursor according to the tool Change-Id: Ibbe530856bb833e465dd9fa1da5425c018fecc21 Reviewed-by: Laszlo Agocs --- examples/widgets/widgets/tablet/images.qrc | 8 ++++ .../widgets/tablet/images/cursor-airbrush.png | Bin 0 -> 823 bytes .../widgets/tablet/images/cursor-eraser.png | Bin 0 -> 1454 bytes .../tablet/images/cursor-felt-marker.png | Bin 0 -> 513 bytes .../widgets/tablet/images/cursor-pencil.png | Bin 0 -> 1307 bytes examples/widgets/widgets/tablet/tablet.pro | 11 +++-- .../widgets/tablet/tabletapplication.cpp | 3 +- .../widgets/widgets/tablet/tabletcanvas.cpp | 44 +++++++++++++++++- .../widgets/widgets/tablet/tabletcanvas.h | 7 +-- 9 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 examples/widgets/widgets/tablet/images.qrc create mode 100644 examples/widgets/widgets/tablet/images/cursor-airbrush.png create mode 100644 examples/widgets/widgets/tablet/images/cursor-eraser.png create mode 100644 examples/widgets/widgets/tablet/images/cursor-felt-marker.png create mode 100644 examples/widgets/widgets/tablet/images/cursor-pencil.png diff --git a/examples/widgets/widgets/tablet/images.qrc b/examples/widgets/widgets/tablet/images.qrc new file mode 100644 index 00000000000..eb3eabbace0 --- /dev/null +++ b/examples/widgets/widgets/tablet/images.qrc @@ -0,0 +1,8 @@ + + + images/cursor-airbrush.png + images/cursor-eraser.png + images/cursor-felt-marker.png + images/cursor-pencil.png + + diff --git a/examples/widgets/widgets/tablet/images/cursor-airbrush.png b/examples/widgets/widgets/tablet/images/cursor-airbrush.png new file mode 100644 index 0000000000000000000000000000000000000000..bea756ed6f520b3a9fe08de50fb093ad2f98fb55 GIT binary patch literal 823 zcmV-71IYY|P)ekkj+2UylZlX(_;YiNkduy(kc^R)jggd!l9!H> zm5-8@jFXp-la`Q_my(s2k(!>FnVI~7ftQ@0mY<`Zo}QYYqMf0no};Foq^6^zqnxI! zo~Ejzrm6XlkEp1qrmC&_l$4~bv8$`As;;rCuCe=?ny#|7thBeSwYsvkxV5*rxVpNv zyui7@!@R@C!^OzP#>T_Q%*V;g&CSis&d|!w(#z1((bClS$jH#u*V5M6)z{eA+1b|G z+}hgO+S}dO+}_*V-rC*Y+uq>b;Njro<>BMy;^X7vFVg}>+9_7 z?CtLG@$vEU^Yrxf_V)Mp_xBf1_Rs(T00DGTPE!Ct=GbNc0004EOGiWihy@);00009 za7bBm0004s0004s0W+5{SO5S32XskIMF-yp90v*%VksIQ0002`NklYHpav+# zFC7(|gje2FSr4DItf-g-9%%<1X(7DE`^iwnlMIH2#L7$JkPm|}jDv9)5FHPq67%bF zu`3Al)l^`}=;)u&g3ASFp7PbbT}`#v<((>HY`oIz%Zu_tvC7*wH%8jHXJu!mhGRFt zr@bb`#?r{u$^=Ik1oTt{*|-Sf4y1^_5`P=VyMoJTY)0K zp`oD&3r=}%9-zDcA8rE}#Z{$PwY6|7;NTSWc6QXjtw6uHJI&5T4YvY=vd&~1HznK( zEUMZPY&_+0E3j>7jj_?ilN>#o8-wwtSL+-G1^^=XFg&xJ<%0kS(-9E%S;KM;yZZYjC`SYX z3>ZS#t@7i}i(E^IAcFP8C?paBup}h~gmM25k91aIq)pDHAuvdHGH?_~00KdQgdP3_ zf`1@^Lf93&Gcb5Z&otX^X@eFvRAdKuAa+jx0&xLkt{IB%nh=91&zf zjK#~Ga+n&!b!i&N5D5e#A>vXLyJncK5qu^Hi|~YiKz!en`85Ez`;j9kp_tYJ28DvU zu&_^|V6k*Mr|GDQbJWxmC;HAEQs{K;?FncVRjMN^N^WSij*5zLO~Hdosk-JG&6miB@}|4aPQYGrlPn5Mv(LTgN- zo=>DK;33a4I4VHJ3P!*PwBr2W`%S*6ws3vYnO}D)ug*+U=<;gK`E^blt-a_d&MBzs zyr)!*9LpS6=HA6nEW4|ejTg(naucS=Ebr20rpM-;Z&5fF*KdAQ!dC zQJVs>9gz&?NrzHd!x)UU_V#MKp~h~kv3JyuTxb~SX&te&jab@8`i!HN_R(I$?R5T~ zbp8x~q8a-|lF;bL7{JZlW69E`OP8%!;pO$-s?|Pg)_sKgbj#Ll+jo4o?+}R`osg6w zk;=++r%u<^H=J)X7&}azSFT*`xz=wR92}mUntJ%xqes)zkDorB`TNC-7cc*LH9I>u zH#a~3=Iz^e@3hxT&jNrOJ)F3o@})iJckpNTsMU%|W4G)1CaM)_UB{2|@#yZG5lZD} zHm(%UB&?rkw(Ib-!>gC@M!h5R9{(AxnQDxV35PbWPrKQ_8Qf)R;|6SL9#w|E3I zJkDH8IS*yB$!CYmM~DpK5RU_8g}~2zKRd&XI%vD&r-l6X4tqLiwEMX?JNL*M-KwdE^YQ*7F6D1Uv8Su{x)Cm zJYF?F;V{_TOs~_sV^6OlGvfH;+Z9h{s}IX}y=rf<0;c%qF&QzprduAov4_%X=UOay Yesyo^ecw$1*mniOLnDbz2a=Ec2bNW#Hvj+t literal 0 HcmV?d00001 diff --git a/examples/widgets/widgets/tablet/images/cursor-felt-marker.png b/examples/widgets/widgets/tablet/images/cursor-felt-marker.png new file mode 100644 index 0000000000000000000000000000000000000000..132f09aa391ba1912d1ac581dfe9c27f19a2fb67 GIT binary patch literal 513 zcmV+c0{;DpP)ShILKxdsq#K9l*9mHL95Ntu{8#oqx0GG}_go8Mi7Tgr7g0vPX zl~!%6n&vuGl20fm(J$bTGu?b}?%~|?-Jbw4V#J6XQdq*-N_|5;*}RNMpfc61o*F>X z9&02oto+`UA43TeQqd@0ae2p}>)*odQ5bk8}9k(VIGOQsFppwpWR-+I|5MPUYOXO`G z;=sRA0}DuEn1Fwy{>A~VPDGFai6B6u{!u{41(Qoa3=;sv8oPt<6lZ}wWC=>2)aTe8 z0IE$KOtbF;Kqn5IH2V?(D$O7j#S%FhG-yzvAR!-R*zV*39$}@tTTQyo)mZnzEAGi# zM0)PeGrlSS8@F&s0P=e7i7^9#8`zY*vtQ;riv)0o9;FtuMb>9a6CFw{Ww*m0EI;7o zqd{r4@#SE=z#+E|M-;T>HtM34Xzo75{|zx>{3Cn<2@Gr1nMH}i00000NkvXXu0mjf DW0=c+ literal 0 HcmV?d00001 diff --git a/examples/widgets/widgets/tablet/images/cursor-pencil.png b/examples/widgets/widgets/tablet/images/cursor-pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2f447d02481b5eb930a8d94fd3e27fe641e23f GIT binary patch literal 1307 zcmV+$1?2jPP)F25-k%CBo_uE7ZW8I2q_l{CKw4Y6%sEO z1tS?1A{iMl7X~R95iu4MCmIYT8W$!V9VZ?hDIOar9v>zk8#EpsDj^|2AP7bv1UDlS zHX|56BOo#-BTFO^OeG9SC=yjC3PLL@LoFCVFDO4SGDj~eVk`|mGcQ0iFi2l6!K$Z)vY~a?o@oqh1s2%v!|!>mzdg~ zn&z9Fn7hS8~v`=&71sE6^NqWY&f%B-35saEEwr17m-(6N{2siozqtMR6% z`K?U&tyAWztn{x_^QWluuUh)9RP?Z0+^?+Yt*-X6T=A@{-L;qUt*qv;u*tf#;J2B| zySB@`x8u5;^0ct?f^+~OK_vzE?+!Ob&0~M@wL|4G&m)h|D zX4bjqkMCarD)7dLOX2X;$i(HlZoGJW_xkDe+L(z!Qa_<{=8C11 RToC{O002ovPDHLkV1jw0MUnsj literal 0 HcmV?d00001 diff --git a/examples/widgets/widgets/tablet/tablet.pro b/examples/widgets/widgets/tablet/tablet.pro index de81e7b198b..9b8927f483b 100644 --- a/examples/widgets/widgets/tablet/tablet.pro +++ b/examples/widgets/widgets/tablet/tablet.pro @@ -1,12 +1,13 @@ QT += widgets HEADERS = mainwindow.h \ - tabletcanvas.h \ - tabletapplication.h + tabletcanvas.h \ + tabletapplication.h SOURCES = mainwindow.cpp \ - main.cpp \ - tabletcanvas.cpp \ - tabletapplication.cpp + main.cpp \ + tabletcanvas.cpp \ + tabletapplication.cpp +RESOURCES += images.qrc # install target.path = $$[QT_INSTALL_EXAMPLES]/widgets/widgets/tablet diff --git a/examples/widgets/widgets/tablet/tabletapplication.cpp b/examples/widgets/widgets/tablet/tabletapplication.cpp index c3210f822c7..3e1356ee9cc 100644 --- a/examples/widgets/widgets/tablet/tabletapplication.cpp +++ b/examples/widgets/widgets/tablet/tabletapplication.cpp @@ -47,8 +47,7 @@ bool TabletApplication::event(QEvent *event) { if (event->type() == QEvent::TabletEnterProximity || event->type() == QEvent::TabletLeaveProximity) { - myCanvas->setTabletDevice( - static_cast(event)->device()); + myCanvas->setTabletDevice(static_cast(event)); return true; } return QApplication::event(event); diff --git a/examples/widgets/widgets/tablet/tabletcanvas.cpp b/examples/widgets/widgets/tablet/tabletcanvas.cpp index bf98a6d6217..8ff3d41e0e6 100644 --- a/examples/widgets/widgets/tablet/tabletcanvas.cpp +++ b/examples/widgets/widgets/tablet/tabletcanvas.cpp @@ -103,6 +103,8 @@ void TabletCanvas::tabletEvent(QTabletEvent *event) } break; case QEvent::TabletMove: + if (event->device() == QTabletEvent::RotationStylus) + updateCursor(event); if (deviceDown) { updateBrush(event); QPainter painter(&pixmap); @@ -201,7 +203,7 @@ void TabletCanvas::paintPixmap(QPainter &painter, QTabletEvent *event) //! [5] //! [7] -void TabletCanvas::updateBrush(QTabletEvent *event) +void TabletCanvas::updateBrush(const QTabletEvent *event) { int hue, saturation, value, alpha; myColor.getHsv(&hue, &saturation, &value, &alpha); @@ -266,6 +268,46 @@ void TabletCanvas::updateBrush(QTabletEvent *event) } //! [11] +void TabletCanvas::updateCursor(const QTabletEvent *event) +{ + QCursor cursor; + if (event->type() != QEvent::TabletLeaveProximity) { + if (event->pointerType() == QTabletEvent::Eraser) { + cursor = QCursor(QPixmap(":/images/cursor-eraser.png"), 3, 28); + } else { + switch (event->device()) { + case QTabletEvent::Stylus: + cursor = QCursor(QPixmap(":/images/cursor-pencil.png"), 0, 0); + break; + case QTabletEvent::Airbrush: + cursor = QCursor(QPixmap(":/images/cursor-airbrush.png"), 3, 4); + break; + case QTabletEvent::RotationStylus: { + QImage origImg(QLatin1String(":/images/cursor-felt-marker.png")); + QImage img(32, 32, QImage::Format_ARGB32); + QColor solid = myColor; + solid.setAlpha(255); + img.fill(solid); + QPainter painter(&img); + QTransform transform = painter.transform(); + transform.translate(16, 16); + transform.rotate(-event->rotation()); + painter.setTransform(transform); + painter.setCompositionMode(QPainter::CompositionMode_DestinationIn); + painter.drawImage(-24, -24, origImg); + painter.setCompositionMode(QPainter::CompositionMode_HardLight); + painter.drawImage(-24, -24, origImg); + painter.end(); + cursor = QCursor(QPixmap::fromImage(img), 16, 16); + } break; + default: + break; + } + } + } + setCursor(cursor); +} + void TabletCanvas::resizeEvent(QResizeEvent *) { initPixmap(); diff --git a/examples/widgets/widgets/tablet/tabletcanvas.h b/examples/widgets/widgets/tablet/tabletcanvas.h index 06090a9052c..a7335dbaf0b 100644 --- a/examples/widgets/widgets/tablet/tabletcanvas.h +++ b/examples/widgets/widgets/tablet/tabletcanvas.h @@ -80,8 +80,8 @@ public: { myColor = color; } QColor color() const { return myColor; } - void setTabletDevice(QTabletEvent::TabletDevice device) - { myTabletDevice = device; } + void setTabletDevice(QTabletEvent *event) + { myTabletDevice = event->device(); updateCursor(event); } int maximum(int a, int b) { return a > b ? a : b; } @@ -94,7 +94,8 @@ private: void initPixmap(); void paintPixmap(QPainter &painter, QTabletEvent *event); Qt::BrushStyle brushPattern(qreal value); - void updateBrush(QTabletEvent *event); + void updateBrush(const QTabletEvent *event); + void updateCursor(const QTabletEvent *event); AlphaChannelType alphaChannelType; ColorSaturationType colorSaturationType;