summaryrefslogtreecommitdiffstats
path: root/examples/widgets/tablet/tabletcanvas.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/widgets/tablet/tabletcanvas.cpp')
-rw-r--r--examples/widgets/tablet/tabletcanvas.cpp257
1 files changed, 257 insertions, 0 deletions
diff --git a/examples/widgets/tablet/tabletcanvas.cpp b/examples/widgets/tablet/tabletcanvas.cpp
new file mode 100644
index 0000000..dc42c3c
--- /dev/null
+++ b/examples/widgets/tablet/tabletcanvas.cpp
@@ -0,0 +1,257 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include <math.h>
+
+#include "tabletcanvas.h"
+
+//! [0]
+TabletCanvas::TabletCanvas()
+{
+ resize(500, 500);
+ myBrush = QBrush();
+ myPen = QPen();
+ initImage();
+ setAutoFillBackground(true);
+ deviceDown = false;
+ myColor = Qt::red;
+ myTabletDevice = QTabletEvent::Stylus;
+ alphaChannelType = NoAlpha;
+ colorSaturationType = NoSaturation;
+ lineWidthType = LineWidthPressure;
+}
+
+void TabletCanvas::initImage()
+{
+ QImage newImage = QImage(width(), height(), QImage::Format_ARGB32);
+ QPainter painter(&newImage);
+ painter.fillRect(0, 0, newImage.width(), newImage.height(), Qt::white);
+ if (!image.isNull())
+ painter.drawImage(0, 0, image);
+ painter.end();
+ image = newImage;
+}
+//! [0]
+
+//! [1]
+bool TabletCanvas::saveImage(const QString &file)
+{
+ return image.save(file);
+}
+//! [1]
+
+//! [2]
+bool TabletCanvas::loadImage(const QString &file)
+{
+ bool success = image.load(file);
+
+ if (success) {
+ update();
+ return true;
+ }
+ return false;
+}
+//! [2]
+
+//! [3]
+void TabletCanvas::tabletEvent(QTabletEvent *event)
+{
+
+ switch (event->type()) {
+ case QEvent::TabletPress:
+ if (!deviceDown)
+ deviceDown = true;
+ break;
+ case QEvent::TabletRelease:
+ if (deviceDown)
+ deviceDown = false;
+ break;
+ case QEvent::TabletMove:
+ polyLine[2] = polyLine[1];
+ polyLine[1] = polyLine[0];
+ polyLine[0] = event->pos();
+
+ if (deviceDown) {
+ updateBrush(event);
+ QPainter painter(&image);
+ paintImage(painter, event);
+ }
+ break;
+ default:
+ break;
+ }
+ update();
+}
+//! [3]
+
+//! [4]
+void TabletCanvas::paintEvent(QPaintEvent *)
+{
+ QPainter painter(this);
+ painter.drawImage(QPoint(0, 0), image);
+}
+//! [4]
+
+//! [5]
+void TabletCanvas::paintImage(QPainter &painter, QTabletEvent *event)
+{
+ QPoint brushAdjust(10, 10);
+
+ switch (myTabletDevice) {
+ case QTabletEvent::Stylus:
+ painter.setBrush(myBrush);
+ painter.setPen(myPen);
+ painter.drawLine(polyLine[1], event->pos());
+ break;
+ case QTabletEvent::Airbrush:
+ myBrush.setColor(myColor);
+ myBrush.setStyle(brushPattern(event->pressure()));
+ painter.setPen(Qt::NoPen);
+ painter.setBrush(myBrush);
+
+ for (int i = 0; i < 3; ++i) {
+ painter.drawEllipse(QRect(polyLine[i] - brushAdjust,
+ polyLine[i] + brushAdjust));
+ }
+ break;
+ case QTabletEvent::Puck:
+ case QTabletEvent::FourDMouse:
+ case QTabletEvent::RotationStylus:
+ qWarning("This input device is not supported by the example.");
+ break;
+ default:
+ qWarning("Unknown tablet device.");
+ }
+}
+//! [5]
+
+//! [6]
+Qt::BrushStyle TabletCanvas::brushPattern(qreal value)
+{
+ int pattern = int((value) * 100.0) % 7;
+
+ switch (pattern) {
+ case 0:
+ return Qt::SolidPattern;
+ case 1:
+ return Qt::Dense1Pattern;
+ case 2:
+ return Qt::Dense2Pattern;
+ case 3:
+ return Qt::Dense3Pattern;
+ case 4:
+ return Qt::Dense4Pattern;
+ case 5:
+ return Qt::Dense5Pattern;
+ case 6:
+ return Qt::Dense6Pattern;
+ default:
+ return Qt::Dense7Pattern;
+ }
+}
+//! [6]
+
+//! [7]
+void TabletCanvas::updateBrush(QTabletEvent *event)
+{
+ int hue, saturation, value, alpha;
+ myColor.getHsv(&hue, &saturation, &value, &alpha);
+
+ int vValue = int(((event->yTilt() + 60.0) / 120.0) * 255);
+ int hValue = int(((event->xTilt() + 60.0) / 120.0) * 255);
+//! [7] //! [8]
+
+ switch (alphaChannelType) {
+ case AlphaPressure:
+ myColor.setAlpha(int(event->pressure() * 255.0));
+ break;
+ case AlphaTilt:
+ myColor.setAlpha(maximum(abs(vValue - 127), abs(hValue - 127)));
+ break;
+ default:
+ myColor.setAlpha(255);
+ }
+
+//! [8] //! [9]
+ switch (colorSaturationType) {
+ case SaturationVTilt:
+ myColor.setHsv(hue, vValue, value, alpha);
+ break;
+ case SaturationHTilt:
+ myColor.setHsv(hue, hValue, value, alpha);
+ break;
+ case SaturationPressure:
+ myColor.setHsv(hue, int(event->pressure() * 255.0), value, alpha);
+ break;
+ default:
+ ;
+ }
+
+//! [9] //! [10]
+ switch (lineWidthType) {
+ case LineWidthPressure:
+ myPen.setWidthF(event->pressure() * 10 + 1);
+ break;
+ case LineWidthTilt:
+ myPen.setWidthF(maximum(abs(vValue - 127), abs(hValue - 127)) / 12);
+ break;
+ default:
+ myPen.setWidthF(1);
+ }
+
+//! [10] //! [11]
+ if (event->pointerType() == QTabletEvent::Eraser) {
+ myBrush.setColor(Qt::white);
+ myPen.setColor(Qt::white);
+ myPen.setWidthF(event->pressure() * 10 + 1);
+ } else {
+ myBrush.setColor(myColor);
+ myPen.setColor(myColor);
+ }
+}
+//! [11]
+
+void TabletCanvas::resizeEvent(QResizeEvent *event)
+{
+ initImage();
+ polyLine[0] = polyLine[1] = polyLine[2] = QPoint();
+}