diff options
Diffstat (limited to 'demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp')
-rw-r--r-- | demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp b/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp new file mode 100644 index 0000000..297806a --- /dev/null +++ b/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp @@ -0,0 +1,181 @@ +/**************************************************************************** +** +** Copyright (C) 2011 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 <QPainter> +#include <QApplication> + +#include "embeddedsvgviewer.h" + + + +EmbeddedSvgViewer::EmbeddedSvgViewer(const QString &filePath) +{ + qApp->setStyleSheet(" QSlider:vertical { width: 50px; } \ + QSlider::groove:vertical { border: 1px solid black; border-radius: 3px; width: 6px; } \ + QSlider::handle:vertical { height: 25px; margin: 0 -22px; image: url(':/files/v-slider-handle.svg'); } \ + "); + + m_renderer = new QSvgRenderer(filePath); + m_imageSize = m_renderer->viewBox().size(); + + m_viewBoxCenter = (QPointF(m_imageSize.width() / qreal(2.0), m_imageSize.height() / qreal(2.0))); + + m_zoomSlider = new QSlider(Qt::Vertical, this); + m_zoomSlider->setMaximum(150); + m_zoomSlider->setMinimum(1); + + connect(m_zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(setZoom(int))); + m_zoomSlider->setValue(100); + + m_quitButton = new QPushButton("Quit", this); + + connect(m_quitButton, SIGNAL(pressed()), QApplication::instance(), SLOT(quit())); + + if (m_renderer->animated()) + connect(m_renderer, SIGNAL(repaintNeeded()), this, SLOT(update())); + +} + +void EmbeddedSvgViewer::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event) + QPainter painter(this); + m_renderer->setViewBox(m_viewBox); + m_renderer->render(&painter); +} + + +void EmbeddedSvgViewer::mouseMoveEvent ( QMouseEvent * event ) +{ + int incX = int((event->globalX() - m_mousePress.x()) * m_imageScale); + int incY = int((event->globalY() - m_mousePress.y()) * m_imageScale); + + QPointF newCenter; + newCenter.setX(m_viewBoxCenterOnMousePress.x() - incX); + newCenter.setY(m_viewBoxCenterOnMousePress.y() - incY); + + QRectF newViewBox = getViewBox(newCenter); + + + // Do a bounded move on the horizontal: + if ( (newViewBox.left() >= m_viewBoxBounds.left()) && + (newViewBox.right() <= m_viewBoxBounds.right()) ) + { + m_viewBoxCenter.setX(newCenter.x()); + m_viewBox.setLeft(newViewBox.left()); + m_viewBox.setRight(newViewBox.right()); + } + + // do a bounded move on the vertical: + if ( (newViewBox.top() >= m_viewBoxBounds.top()) && + (newViewBox.bottom() <= m_viewBoxBounds.bottom()) ) + { + m_viewBoxCenter.setY(newCenter.y()); + m_viewBox.setTop(newViewBox.top()); + m_viewBox.setBottom(newViewBox.bottom()); + } + + update(); +} + +void EmbeddedSvgViewer::mousePressEvent ( QMouseEvent * event ) +{ + m_viewBoxCenterOnMousePress = m_viewBoxCenter; + m_mousePress = event->globalPos(); +} + + +QRectF EmbeddedSvgViewer::getViewBox(QPointF viewBoxCenter) +{ + QRectF result; + result.setLeft(viewBoxCenter.x() - (m_viewBoxSize.width() / 2)); + result.setTop(viewBoxCenter.y() - (m_viewBoxSize.height() / 2)); + result.setRight(viewBoxCenter.x() + (m_viewBoxSize.width() / 2)); + result.setBottom(viewBoxCenter.y() + (m_viewBoxSize.height() / 2)); + return result; +} + +void EmbeddedSvgViewer::updateImageScale() +{ + m_imageScale = qMax( (qreal)m_imageSize.width() / (qreal)width(), + (qreal)m_imageSize.height() / (qreal)height())*m_zoomLevel; + + m_viewBoxSize.setWidth((qreal)width() * m_imageScale); + m_viewBoxSize.setHeight((qreal)height() * m_imageScale); +} + + +void EmbeddedSvgViewer::resizeEvent ( QResizeEvent * /* event */ ) +{ + qreal origZoom = m_zoomLevel; + + // Get the new bounds: + m_zoomLevel = 1.0; + updateImageScale(); + m_viewBoxBounds = getViewBox(QPointF(m_imageSize.width() / 2.0, m_imageSize.height() / 2.0)); + + m_zoomLevel = origZoom; + updateImageScale(); + m_viewBox = getViewBox(m_viewBoxCenter); + + QRect sliderRect; + sliderRect.setLeft(width() - m_zoomSlider->sizeHint().width()); + sliderRect.setRight(width()); + sliderRect.setTop(height()/4); + sliderRect.setBottom(height() - (height()/4)); + m_zoomSlider->setGeometry(sliderRect); +} + + +void EmbeddedSvgViewer::setZoom(int newZoom) +{ + m_zoomLevel = qreal(newZoom) / qreal(100); + + updateImageScale(); + m_viewBox = getViewBox(m_viewBoxCenter); + + update(); +} + + + + + |