demos/chip/view.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/chip/view.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,234 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications 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 Technology Preview License Agreement accompanying
+** this package.
+**
+** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "view.h"
+
+#include <QtGui>
+#ifndef QT_NO_OPENGL
+#include <QtOpenGL>
+#endif
+
+#include <qmath.h>
+
+View::View(const QString &name, QWidget *parent)
+    : QFrame(parent)
+{
+    setFrameStyle(Sunken | StyledPanel);
+    graphicsView = new QGraphicsView;
+    graphicsView->setRenderHint(QPainter::Antialiasing, false);
+    graphicsView->setDragMode(QGraphicsView::RubberBandDrag);
+    graphicsView->setOptimizationFlags(QGraphicsView::DontSavePainterState);
+    graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
+
+    int size = style()->pixelMetric(QStyle::PM_ToolBarIconSize);
+    QSize iconSize(size, size);
+
+    QToolButton *zoomInIcon = new QToolButton;
+    zoomInIcon->setAutoRepeat(true);
+    zoomInIcon->setAutoRepeatInterval(33);
+    zoomInIcon->setAutoRepeatDelay(0);
+    zoomInIcon->setIcon(QPixmap(":/zoomin.png"));
+    zoomInIcon->setIconSize(iconSize);
+    QToolButton *zoomOutIcon = new QToolButton;
+    zoomOutIcon->setAutoRepeat(true);
+    zoomOutIcon->setAutoRepeatInterval(33);
+    zoomOutIcon->setAutoRepeatDelay(0);
+    zoomOutIcon->setIcon(QPixmap(":/zoomout.png"));
+    zoomOutIcon->setIconSize(iconSize);
+    zoomSlider = new QSlider;
+    zoomSlider->setMinimum(0);
+    zoomSlider->setMaximum(500);
+    zoomSlider->setValue(250);
+    zoomSlider->setTickPosition(QSlider::TicksRight);
+
+    // Zoom slider layout
+    QVBoxLayout *zoomSliderLayout = new QVBoxLayout;
+    zoomSliderLayout->addWidget(zoomInIcon);
+    zoomSliderLayout->addWidget(zoomSlider);
+    zoomSliderLayout->addWidget(zoomOutIcon);
+
+    QToolButton *rotateLeftIcon = new QToolButton;
+    rotateLeftIcon->setIcon(QPixmap(":/rotateleft.png"));
+    rotateLeftIcon->setIconSize(iconSize);
+    QToolButton *rotateRightIcon = new QToolButton;
+    rotateRightIcon->setIcon(QPixmap(":/rotateright.png"));
+    rotateRightIcon->setIconSize(iconSize);
+    rotateSlider = new QSlider;
+    rotateSlider->setOrientation(Qt::Horizontal);
+    rotateSlider->setMinimum(-360);
+    rotateSlider->setMaximum(360);
+    rotateSlider->setValue(0);
+    rotateSlider->setTickPosition(QSlider::TicksBelow);
+
+    // Rotate slider layout
+    QHBoxLayout *rotateSliderLayout = new QHBoxLayout;
+    rotateSliderLayout->addWidget(rotateLeftIcon);
+    rotateSliderLayout->addWidget(rotateSlider);
+    rotateSliderLayout->addWidget(rotateRightIcon);
+
+    resetButton = new QToolButton;
+    resetButton->setText(tr("0"));
+    resetButton->setEnabled(false);
+
+    // Label layout
+    QHBoxLayout *labelLayout = new QHBoxLayout;
+    label = new QLabel(name);
+    antialiasButton = new QToolButton;
+    antialiasButton->setText(tr("Antialiasing"));
+    antialiasButton->setCheckable(true);
+    antialiasButton->setChecked(false);
+    openGlButton = new QToolButton;
+    openGlButton->setText(tr("OpenGL"));
+    openGlButton->setCheckable(true);
+#ifndef QT_NO_OPENGL
+    openGlButton->setEnabled(QGLFormat::hasOpenGL());
+#else
+    openGlButton->setEnabled(false);
+#endif
+    printButton = new QToolButton;
+    printButton->setIcon(QIcon(QPixmap(":/fileprint.png")));
+
+    labelLayout->addWidget(label);
+    labelLayout->addStretch();
+    labelLayout->addWidget(antialiasButton);
+    labelLayout->addWidget(openGlButton);
+    labelLayout->addWidget(printButton);
+
+    QGridLayout *topLayout = new QGridLayout;
+    topLayout->addLayout(labelLayout, 0, 0);
+    topLayout->addWidget(graphicsView, 1, 0);
+    topLayout->addLayout(zoomSliderLayout, 1, 1);
+    topLayout->addLayout(rotateSliderLayout, 2, 0);
+    topLayout->addWidget(resetButton, 2, 1);
+    setLayout(topLayout);
+
+    connect(resetButton, SIGNAL(clicked()), this, SLOT(resetView()));
+    connect(zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix()));
+    connect(rotateSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix()));
+    connect(graphicsView->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setResetButtonEnabled()));
+    connect(graphicsView->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setResetButtonEnabled()));
+    connect(antialiasButton, SIGNAL(toggled(bool)), this, SLOT(toggleAntialiasing()));
+    connect(openGlButton, SIGNAL(toggled(bool)), this, SLOT(toggleOpenGL()));
+    connect(rotateLeftIcon, SIGNAL(clicked()), this, SLOT(rotateLeft()));
+    connect(rotateRightIcon, SIGNAL(clicked()), this, SLOT(rotateRight()));
+    connect(zoomInIcon, SIGNAL(clicked()), this, SLOT(zoomIn()));
+    connect(zoomOutIcon, SIGNAL(clicked()), this, SLOT(zoomOut()));
+    connect(printButton, SIGNAL(clicked()), this, SLOT(print()));
+
+    setupMatrix();
+}
+
+QGraphicsView *View::view() const
+{
+    return graphicsView;
+}
+
+void View::resetView()
+{
+    zoomSlider->setValue(250);
+    rotateSlider->setValue(0);
+    setupMatrix();
+    graphicsView->ensureVisible(QRectF(0, 0, 0, 0));
+
+    resetButton->setEnabled(false);
+}
+
+void View::setResetButtonEnabled()
+{
+    resetButton->setEnabled(true);
+}
+
+void View::setupMatrix()
+{
+    qreal scale = qPow(qreal(2), (zoomSlider->value() - 250) / qreal(50));
+
+    QMatrix matrix;
+    matrix.scale(scale, scale);
+    matrix.rotate(rotateSlider->value());
+
+    graphicsView->setMatrix(matrix);
+    setResetButtonEnabled();
+}
+
+void View::toggleOpenGL()
+{
+#ifndef QT_NO_OPENGL
+    graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);
+#endif
+}
+
+void View::toggleAntialiasing()
+{
+    graphicsView->setRenderHint(QPainter::Antialiasing, antialiasButton->isChecked());
+}
+
+void View::print()
+{
+#ifndef QT_NO_PRINTER
+    QPrinter printer;
+    QPrintDialog dialog(&printer, this);
+    if (dialog.exec() == QDialog::Accepted) {
+        QPainter painter(&printer);
+        graphicsView->render(&painter);
+    }
+#endif
+}
+
+void View::zoomIn()
+{
+    zoomSlider->setValue(zoomSlider->value() + 1);
+}
+
+void View::zoomOut()
+{
+    zoomSlider->setValue(zoomSlider->value() - 1);
+}
+
+void View::rotateLeft()
+{
+    rotateSlider->setValue(rotateSlider->value() - 10);
+}
+
+void View::rotateRight()
+{
+    rotateSlider->setValue(rotateSlider->value() + 10);
+}
+