00001 /* 00002 Copyright © 2010 alexandre petitjean 00003 00004 This file is part of QExtend. 00005 00006 QExtend is free software: you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation, either version 3 of the License, or 00009 any later version. 00010 00011 QExtend is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with QExtend. If not, see <http://www.gnu.org/licenses/>. 00018 */ 00019 00020 #include "imageviewer.hpp" 00021 00022 #include <QtCore/QPointF> 00023 00024 #include <QtGui/QApplication> 00025 #include <QtGui/QMouseEvent> 00026 #include <QtGui/QScrollBar> 00027 #include <QtGui/QWheelEvent> 00028 00029 using namespace QExtend; 00030 00031 ImageViewer::ImageViewer(QWidget *parent) : QScrollArea(parent) 00032 { 00033 this->setWidget(&m_imageRender); 00034 m_mouseInteraction = DragAndWheelzoom; 00035 m_isDragging = false; 00036 } 00037 00038 void ImageViewer::setMouseInteraction(ImageViewer::MouseInteractionMode interaction) 00039 { 00040 m_mouseInteraction = interaction; 00041 } 00042 00043 ImageViewer::MouseInteractionMode ImageViewer::mouseInteraction() const 00044 { 00045 return m_mouseInteraction; 00046 } 00047 00048 void ImageViewer::loadImage(const QString &imagePath) 00049 { 00050 loadImage(QImage(imagePath)); 00051 } 00052 00053 void ImageViewer::loadImage(const QImage &image) 00054 { 00055 loadImage(QPixmap::fromImage(image)); 00056 } 00057 00058 void ImageViewer::loadImage(const QPixmap &pixmap) 00059 { 00060 m_imageRender.setPixmap(pixmap); 00061 m_imageRender.adjustSize(); 00062 m_scaleFactor = 1.0; 00063 m_imageRender.setScaledContents(true); 00064 } 00065 00066 void ImageViewer::mouseMoveEvent(QMouseEvent *event) 00067 { 00068 switch(m_mouseInteraction) 00069 { 00070 case DragAndWheelzoom: 00071 if(m_isDragging) 00072 { 00073 QPointF delta = m_previousPos - event->posF(); 00074 horizontalScrollBar()->setValue(horizontalScrollBar()->value() + delta.x()); 00075 verticalScrollBar()->setValue(verticalScrollBar()->value() + delta.y()); 00076 m_previousPos = event->posF(); 00077 } 00078 break; 00079 00080 default: 00081 case NoInteraction: 00082 QScrollArea::mouseMoveEvent(event); 00083 break; 00084 } 00085 } 00086 00087 void ImageViewer::mousePressEvent(QMouseEvent *event) 00088 { 00089 switch(m_mouseInteraction) 00090 { 00091 case DragAndWheelzoom: 00092 if(event->button() == Qt::LeftButton) 00093 { 00094 m_isDragging = true; 00095 m_previousPos = event->posF(); 00096 QApplication::setOverrideCursor(QCursor(Qt::SizeAllCursor)); 00097 } 00098 break; 00099 00100 default: 00101 case NoInteraction: 00102 QScrollArea::mousePressEvent(event); 00103 break; 00104 } 00105 00106 } 00107 00108 void ImageViewer::mouseReleaseEvent(QMouseEvent *event) 00109 { 00110 switch(m_mouseInteraction) 00111 { 00112 case DragAndWheelzoom: 00113 m_isDragging = false; 00114 QApplication::restoreOverrideCursor(); 00115 break; 00116 00117 default: 00118 case NoInteraction: 00119 QScrollArea::mouseReleaseEvent(event); 00120 break; 00121 } 00122 } 00123 00124 void ImageViewer::wheelEvent(QWheelEvent *event) 00125 { 00126 switch(m_mouseInteraction) 00127 { 00128 case DragAndWheelzoom: 00129 { 00130 if(event->delta() > 0) 00131 scaleImage(1.2); 00132 else if(event->delta() < 0) 00133 scaleImage(0.8); 00134 } 00135 break; 00136 00137 default: 00138 case NoInteraction: 00139 QScrollArea::wheelEvent(event); 00140 break; 00141 } 00142 } 00143 00144 void ImageViewer::scaleImage(double factor) 00145 { 00146 if((0.2 <= (m_scaleFactor * factor)) && ((m_scaleFactor * factor) <= 3.0)) 00147 { 00148 m_scaleFactor *= factor; 00149 m_imageRender.resize(m_scaleFactor * m_imageRender.pixmap()->size()); 00150 00151 adjustScrollBar(horizontalScrollBar(), factor); 00152 adjustScrollBar(verticalScrollBar(), factor); 00153 } 00154 } 00155 00156 void ImageViewer::adjustScrollBar(QScrollBar *scrollBar, double factor) 00157 { 00158 scrollBar->setValue(int(factor * scrollBar->value() 00159 + ((factor - 1) * scrollBar->pageStep()/2))); 00160 }
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2010 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.