summaryrefslogtreecommitdiff
path: root/libopie2/opiemm/oimagezoomer.cpp
authoralwin <alwin>2004-04-14 20:50:42 (UTC)
committer alwin <alwin>2004-04-14 20:50:42 (UTC)
commitfe6808b41795d1b6000932bf84d74dbd24c4ed95 (patch) (unidiff)
treeaa351edbbd788708629cf4ad45f617e891c534a6 /libopie2/opiemm/oimagezoomer.cpp
parenta9c1e1a5903f4cf21bcbd5ffd1df46c8211ca502 (diff)
downloadopie-fe6808b41795d1b6000932bf84d74dbd24c4ed95.zip
opie-fe6808b41795d1b6000932bf84d74dbd24c4ed95.tar.gz
opie-fe6808b41795d1b6000932bf84d74dbd24c4ed95.tar.bz2
added the image-display widgets to lib 'cause it may used in other
applications ToDo: Interface description
Diffstat (limited to 'libopie2/opiemm/oimagezoomer.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiemm/oimagezoomer.cpp233
1 files changed, 233 insertions, 0 deletions
diff --git a/libopie2/opiemm/oimagezoomer.cpp b/libopie2/opiemm/oimagezoomer.cpp
new file mode 100644
index 0000000..d1eec67
--- a/dev/null
+++ b/libopie2/opiemm/oimagezoomer.cpp
@@ -0,0 +1,233 @@
1#include "oimagezoomer.h"
2
3#include <opie2/odebug.h>
4
5#include <qimage.h>
6#include <qpixmap.h>
7#include <qpainter.h>
8#include <qrect.h>
9#include <qpoint.h>
10#include <qsize.h>
11
12namespace Opie {
13namespace MM {
14
15/**
16 * \brief The most simple c'tor
17 * The main c'tor. You still need to set a QPixmap/QIMage,
18 * setImageSize,setViewPortSize,setVisiblePoint
19 *
20 * @param parent The parent widget
21 * @param name A name for this widget
22 * @param fl The widget flags
23 *
24 */
25OImageZoomer::OImageZoomer( QWidget* parent, const char* name, WFlags fl )
26 : QFrame( parent, name, fl ) {
27 init();
28}
29
30
31/**
32 * \brief This c'tor takes a QPixmap additional
33 *
34 * You initially set the QPixmap but you still need to provide
35 * the additional data to make this widget useful
36 *
37 * @param pix A Pixmap it'll be converted to a QImage later!
38 * @param par The parent widget
39 * @param name The name of this widget
40 * @param fl The widget flags
41 */
42OImageZoomer::OImageZoomer( const QPixmap& pix, QWidget* par, const char* name, WFlags fl )
43 : QFrame( par, name, fl ) {
44 init();
45 setImage( pix );
46}
47
48
49/**
50 * \brief This c'tor takes a QImage instead
51 * You just provide a QImage which is saved. It behaves the same as the others.
52 *
53 * @param img A Image which will be used for the zoomer content
54 * @param par The parent of the widget
55 * @param name The name of the widget
56 * @param fl The widgets flags
57 */
58OImageZoomer::OImageZoomer( const QImage& img, QWidget* par, const char* name, WFlags fl)
59 : QFrame( par, name, fl ) {
60 init();
61 setImage( img );
62}
63
64
65/**
66 * \brief overloaded c'tor
67 *
68 * This differs only in the arguments it takes
69 *
70 *
71 * @param pSize The size of the Page you show
72 * @param vSize The size of the viewport. The size of the visible part of the widget
73 * @param par The parent of the widget
74 * @param name The name
75 * @param fl The window flags
76 */
77OImageZoomer::OImageZoomer( const QSize& pSize, const QSize& vSize, QWidget* par,
78 const char* name, WFlags fl )
79 : QFrame( par, name, fl ), m_imgSize( pSize ),m_visSize( vSize ) {
80 init();
81}
82
83/**
84 * d'tor
85 */
86OImageZoomer::~OImageZoomer() {
87
88}
89
90void OImageZoomer::init() {
91 m_mevent = false;
92 setFrameStyle( Panel | Sunken );
93}
94
95
96/**
97 * \brief set the page/image size
98 * Tell us the QSize of the Data you show to the user. We need this
99 * to do the calculations
100 *
101 * @param size The size of the stuff you want to zoom on
102 */
103void OImageZoomer::setImageSize( const QSize& size ) {
104 m_imgSize = size;
105 repaint();
106}
107
108/**
109 * \brief Set the size of the viewport
110 * Tell us the QSize of the viewport. The viewport is the part
111 * of the widget which is exposed on the screen
112 *
113 * @param size Te size of the viewport
114 *
115 * @see QScrollView::viewport()
116 */
117void OImageZoomer::setViewPortSize( const QSize& size ) {
118 m_visSize = size;
119 repaint();
120}
121
122/**
123 * \brief the point in the topleft corner which is currently visible
124 * Set the visible point. This most of the times relate to QScrollView::contentsX()
125 * and QScrollView::contentsY()
126 *
127 * @see setVisiblePoint(int,int)
128 */
129void OImageZoomer::setVisiblePoint( const QPoint& pt ) {
130 m_visPt = pt;
131 repaint();
132}
133
134
135/**
136 * Set the Image. The image will be resized on resizeEvent
137 * and it'll set the QPixmap background
138 *
139 * @param img The image will be stored internally and used as the background
140 */
141void OImageZoomer::setImage( const QImage& img) {
142 m_img = img;
143 resizeEvent( 0 );
144 repaint();
145}
146
147/**
148 * overloaded function it calls the QImage version
149 */
150void OImageZoomer::setImage( const QPixmap& pix) {
151 setImage( pix.convertToImage() );
152}
153
154void OImageZoomer::resizeEvent( QResizeEvent* ev ) {
155 QFrame::resizeEvent( ev );
156 setBackgroundOrigin( QWidget::WidgetOrigin );
157 // TODO Qt3 use PalettePixmap and use size
158 QPixmap pix; pix.convertFromImage( m_img.smoothScale( size().width(), size().height() ) );
159 setBackgroundPixmap( pix);
160}
161
162void OImageZoomer::drawContents( QPainter* p ) {
163 /*
164 * if the page size
165 */
166 if ( m_imgSize.isEmpty() )
167 return;
168
169 /*
170 * paint a red rect which represents the visible size
171 *
172 * We need to recalculate x,y and width and height of the
173 * rect. So image size relates to contentRect
174 *
175 */
176 QRect c( contentsRect() );
177 p->setPen( Qt::red );
178
179 /*
180 * the contentRect is set equal to the size of the image
181 * Rect/Original = NewRectORWidth/OriginalVisibleStuff and then simply we
182 * need to add the c.y/x due usage of QFrame
183 * For x and y we use the visiblePoint
184 * For height and width we use the size of the viewport
185 * if width/height would be bigger than our widget we use this width/height
186 *
187 */
188 int len = m_imgSize.width();
189 int x = (c.width()*m_visPt.x())/len + c.x();
190 int w = (c.width()*m_visSize.width() )/len + c.x();
191 if ( w > c.width() ) w = c.width();
192
193 len = m_imgSize.height();
194 int y = (c.height()*m_visPt.y() )/len + c.y();
195 int h = (c.height()*m_visSize.height() )/len + c.y();
196 if ( h > c.height() ) h = c.height();
197
198 p->drawRect( x, y, w, h );
199}
200
201void OImageZoomer::mousePressEvent( QMouseEvent*ev) {
202 m_mouseX = m_mouseY = -1;
203 m_mevent = true;
204}
205
206void OImageZoomer::mouseReleaseEvent( QMouseEvent*ev) {
207 if (!m_mevent) return;
208 int mx, my;
209 mx = ev->x();
210 my = ev->y();
211 int diffx = (mx) * m_imgSize.width() / width();
212 int diffy = (my) * m_imgSize.height() / height();
213 emit zoomArea(diffx,diffy);
214}
215
216void OImageZoomer::mouseMoveEvent( QMouseEvent* ev ) {
217 int mx, my;
218 mx = ev->x();
219 my = ev->y();
220
221 if ( m_mouseX != -1 && m_mouseY != -1 ) {
222 m_mevent = false;
223 int diffx = ( mx - m_mouseX ) * m_imgSize.width() / width();
224 int diffy = ( my - m_mouseY ) * m_imgSize.height() / height();
225 emit zoomAreaRel( diffx, diffy );
226 }
227 m_mouseX = mx;
228 m_mouseY = my;
229}
230
231
232}
233}