1 //
2 // C++ Implementation: iview
3 //
4 // Description:
5 //
6 //
7 // Author: Pierre Marchand <pierremarc@oep-h.com>, (C) 2009
8 //
9 // Copyright: See COPYING file that comes with this distribution
10 //
11 //
12 
13 #include "iview.h"
14 
15 #include <QApplication>
16 #include <QMouseEvent>
17 #include <QScrollBar>
18 #include <QPolygonF>
19 #include <QDebug>
20 
IView(QWidget * parent)21 IView::IView ( QWidget * parent )
22 		:QGraphicsView ( parent )
23 {
24 	curImage = nullptr;
25 	setScene ( new QGraphicsScene );
26 	setInteractive ( true );
27 	isPanning = false;
28 	m_keepFitted = false;
29 	setAlignment ( Qt::AlignTop | Qt::AlignLeft );
30 	setTransformationAnchor ( QGraphicsView::NoAnchor );
31 	setRenderHint(QPainter::SmoothPixmapTransform);
32 }
33 
~IView()34 IView::~ IView()
35 {
36 	QGraphicsScene * s(scene());
37 	delete s;
38 }
39 
mouseMoveEvent(QMouseEvent * e)40 void IView::mouseMoveEvent ( QMouseEvent * e )
41 {
42 	////qDebug()<<"IView::mouseMoveEvent";
43 	if ( isPanning )
44 	{
45 		QPointF pos ( e->pos() );
46 		int vDelta ( qRound ( mouseStartPoint.y() - pos.y() ) );
47 		int hDelta ( qRound ( mouseStartPoint.x() - pos.x() ) );
48 		verticalScrollBar()->setValue ( verticalScrollBar()->value() + vDelta );
49 		horizontalScrollBar()->setValue ( horizontalScrollBar()->value() + hDelta );
50 		mouseStartPoint = pos;
51 		return;
52 	}
53 }
54 
mousePressEvent(QMouseEvent * e)55 void IView::mousePressEvent ( QMouseEvent * e )
56 {
57 	//qDebug()<<"IView::mousePressEvent";
58 	if ( !scene() )
59 		return;
60 
61 // 	if ( e->button() == Qt::MidButton )
62 	{
63 		mouseStartPoint =  e->pos() ;
64 		isPanning = true;
65 		QApplication::setOverrideCursor ( QCursor ( Qt::ClosedHandCursor ) );
66 	}
67 }
68 
mouseReleaseEvent(QMouseEvent * e)69 void IView::mouseReleaseEvent ( QMouseEvent * e )
70 {
71 	//qDebug()<<"IView::mouseReleaseEvent";
72 	if ( isPanning )
73 	{
74 		isPanning = false;
75 		QApplication::restoreOverrideCursor();
76 		return;
77 	}
78 }
79 
80 
setImage(const QPixmap & pixmap)81 void IView::setImage(const QPixmap & pixmap)
82 {
83 	//qDebug()<<"IView::setImage";
84 	if ( curImage )
85 	{
86 		delete curImage;
87 		curImage = nullptr;
88 	}
89 
90 	curImage = scene()->addPixmap ( pixmap );
91 }
92 
getPixmap()93 QPixmap IView::getPixmap()
94 {
95 	//qDebug()<<"IView::getPixmap";
96 	if ( curImage )
97 	{
98 		return  curImage->pixmap();
99 	}
100 	return QPixmap();
101 }
102 
103 
104 
fitImage()105 void IView::fitImage()
106 {
107 	//qDebug()<<"IView::fitImage";
108 	if(!curImage)
109 		return;
110 
111 	double wR = width() /curImage->boundingRect().width()  ;
112 	double hR =  height()/ curImage->boundingRect().height();
113 
114 	double R = (wR > hR) ? hR : wR;
115 	QTransform T;
116 	T.scale(R,R);
117 	setTransform( T  , false);
118 
119 }
120 
resizeEvent(QResizeEvent * event)121 void IView::resizeEvent(QResizeEvent * event)
122 {
123 	//qDebug()<<"View::resizeEvent";
124 	if(m_keepFitted)
125 		fitImage();
126 }
127 
setZoom(double xz,double yz)128 void IView::setZoom(double xz, double yz)
129 {
130 	QTransform T;
131 	T.scale(xz, (yz > 0) ? yz : xz);
132 	setTransform( T  , false);
133 }
134 
getZoom() const135 double IView::getZoom() const
136 {
137 	return transform().m11();
138 }
139 
140