demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/embedded/embeddedsvgviewer/embeddedsvgviewer.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** 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 <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();
+}
+
+
+
+
+