summaryrefslogtreecommitdiff
path: root/noncore/graphics/opie-eye/gui/imagescrollview.cpp
Unidiff
Diffstat (limited to 'noncore/graphics/opie-eye/gui/imagescrollview.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/graphics/opie-eye/gui/imagescrollview.cpp208
1 files changed, 147 insertions, 61 deletions
diff --git a/noncore/graphics/opie-eye/gui/imagescrollview.cpp b/noncore/graphics/opie-eye/gui/imagescrollview.cpp
index d034ee0..3bb07a7 100644
--- a/noncore/graphics/opie-eye/gui/imagescrollview.cpp
+++ b/noncore/graphics/opie-eye/gui/imagescrollview.cpp
@@ -1,60 +1,93 @@
1#include "imagescrollview.h" 1#include "imagescrollview.h"
2 2
3#include "lib/oimagezoomer.h"
4
3#include <opie2/odebug.h> 5#include <opie2/odebug.h>
4#include <opie2/oapplication.h> 6#include <opie2/oapplication.h>
5#include <opie2/owait.h> 7#include <opie2/owait.h>
6 8
7using namespace Opie::Core;
8
9#include <qimage.h> 9#include <qimage.h>
10#include <qlayout.h> 10#include <qlayout.h>
11#include <qpe/qcopenvelope_qws.h> 11#include <qpe/qcopenvelope_qws.h>
12 12
13ImageScrollView::ImageScrollView( QWidget* parent, const char* name, WFlags f ) 13/* for usage with the bitset */
14 :QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(),scale_to_fit(true), 14#define AUTO_SCALE 0
15 rotate_to_fit(true),show_zoomer(true),first_resize_done(false),m_lastName("") 15#define AUTO_ROTATE 1
16{ 16#define SHOW_ZOOMER 2
17#define FIRST_RESIZE_DONE 3
18#define IMAGE_IS_JPEG 4
19#define IMAGE_SCALED_LOADED 5
20
21#define SCROLLVIEW_BITSET_SIZE 6
22
23namespace Opie {
24namespace MM {
25OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f )
26 :QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(),
27 m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("")
28{
29 _zoomer = 0;
30 m_states[AUTO_SCALE]=true;
31 m_states[AUTO_ROTATE]=true;
32 m_states[FIRST_RESIZE_DONE]=false;
33 m_states[IMAGE_IS_JPEG]=false;
34 m_states[IMAGE_SCALED_LOADED]=false;
35 m_states[SHOW_ZOOMER]=true;
17 init(); 36 init();
18} 37}
19 38
20ImageScrollView::ImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) 39OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit)
21 :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img),scale_to_fit(always_scale), 40 :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img),
22 rotate_to_fit(rfit),show_zoomer(true),first_resize_done(false),m_lastName("") 41 m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("")
23{ 42{
43 _zoomer = 0;
44 m_states[AUTO_SCALE]=always_scale;
45 m_states[AUTO_ROTATE]=rfit;
46 m_states[FIRST_RESIZE_DONE]=false;
47 m_states[IMAGE_IS_JPEG]=false;
48 m_states[IMAGE_SCALED_LOADED]=false;
49 m_states[SHOW_ZOOMER]=true;
24 _original_data.convertDepth(QPixmap::defaultDepth()); 50 _original_data.convertDepth(QPixmap::defaultDepth());
25 _original_data.setAlphaBuffer(false); 51 _original_data.setAlphaBuffer(false);
26 init(); 52 init();
27} 53}
28 54
29ImageScrollView::ImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) 55OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit)
30 :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),scale_to_fit(always_scale), 56 :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("")
31 rotate_to_fit(rfit),show_zoomer(true),first_resize_done(false),m_lastName("")
32{ 57{
58 _zoomer = 0;
59 m_states.resize(SCROLLVIEW_BITSET_SIZE);
60 m_states[AUTO_SCALE]=always_scale;
61 m_states[AUTO_ROTATE]=rfit;
62 m_states[FIRST_RESIZE_DONE]=false;
63 m_states[IMAGE_IS_JPEG]=false;
64 m_states[IMAGE_SCALED_LOADED]=false;
65 m_states[SHOW_ZOOMER]=true;
33 init(); 66 init();
34 setImage(img); 67 setImage(img);
35} 68}
36 69
37void ImageScrollView::setImage(const QImage&img) 70void OImageScrollView::setImage(const QImage&img)
38{ 71{
39 _image_data = QImage(); 72 _image_data = QImage();
40 _original_data=img; 73 _original_data=img;
41 _original_data.convertDepth(QPixmap::defaultDepth()); 74 _original_data.convertDepth(QPixmap::defaultDepth());
42 _original_data.setAlphaBuffer(false); 75 _original_data.setAlphaBuffer(false);
43 m_lastName = ""; 76 m_lastName = "";
44 image_is_jpeg = false; 77 setImageIsJpeg(false);
45 image_scaled_loaded = false; 78 setImageScaledLoaded(false);
46 if (first_resize_done) { 79 if (FirstResizeDone()) {
47 generateImage(); 80 generateImage();
48 } 81 }
49} 82}
50 83
51void ImageScrollView::loadJpeg(bool interncall) 84void OImageScrollView::loadJpeg(bool interncall)
52{ 85{
53 if (m_lastName.isEmpty()) return; 86 if (m_lastName.isEmpty()) return;
54 QImageIO iio( m_lastName, 0l ); 87 QImageIO iio( m_lastName, 0l );
55 QString param; 88 QString param;
56 bool real_load = false; 89 bool real_load = false;
57 if (scale_to_fit) { 90 if (AutoScale()) {
58 if (!interncall) { 91 if (!interncall) {
59 int wid, hei; 92 int wid, hei;
60 wid = QApplication::desktop()->width(); 93 wid = QApplication::desktop()->width();
@@ -67,15 +100,15 @@ void ImageScrollView::loadJpeg(bool interncall)
67 param = QString( "Fast Shrink( 7 ) Scale( %1, %2, ScaleFree)" ).arg( wid ).arg( hei ); 100 param = QString( "Fast Shrink( 7 ) Scale( %1, %2, ScaleFree)" ).arg( wid ).arg( hei );
68 odebug << "Load jpeg scaled \"" << param << "\"" << oendl; 101 odebug << "Load jpeg scaled \"" << param << "\"" << oendl;
69 iio.setParameters(param.latin1()); 102 iio.setParameters(param.latin1());
70 image_scaled_loaded = true; 103 setImageScaledLoaded(true);
71 real_load = true; 104 real_load = true;
72 } 105 }
73 } else { 106 } else {
74 if (image_scaled_loaded||!interncall) { 107 if (ImageScaledLoaded()||!interncall) {
75 odebug << "Load jpeg unscaled" << oendl; 108 odebug << "Load jpeg unscaled" << oendl;
76 real_load = true; 109 real_load = true;
77 } 110 }
78 image_scaled_loaded = false; 111 setImageScaledLoaded(false);
79 } 112 }
80 if (real_load) { 113 if (real_load) {
81 { 114 {
@@ -89,20 +122,20 @@ void ImageScrollView::loadJpeg(bool interncall)
89 } 122 }
90} 123}
91 124
92void ImageScrollView::setImage( const QString& path ) { 125void OImageScrollView::setImage( const QString& path ) {
93 odebug << "load new image " << oendl; 126 odebug << "load new image " << oendl;
94 if (m_lastName == path) return; 127 if (m_lastName == path) return;
95 m_lastName = path; 128 m_lastName = path;
96 QString itype = QImage::imageFormat(m_lastName); 129 QString itype = QImage::imageFormat(m_lastName);
97 odebug << "Image type = " << itype << oendl; 130 odebug << "Image type = " << itype << oendl;
98 if (itype == "JPEG") { 131 if (itype == "JPEG") {
99 image_is_jpeg = true; 132 setImageIsJpeg(true);
100 loadJpeg(); 133 loadJpeg();
101 } else { 134 } else {
102 { 135 {
103 QCopEnvelope( "QPE/System", "busy()" ); 136 QCopEnvelope( "QPE/System", "busy()" );
104 } 137 }
105 image_is_jpeg = false; 138 setImageIsJpeg(false);
106 _original_data.load(path); 139 _original_data.load(path);
107 _original_data.convertDepth(QPixmap::defaultDepth()); 140 _original_data.convertDepth(QPixmap::defaultDepth());
108 _original_data.setAlphaBuffer(false); 141 _original_data.setAlphaBuffer(false);
@@ -112,13 +145,13 @@ void ImageScrollView::setImage( const QString& path ) {
112 } 145 }
113 } 146 }
114 _image_data = QImage(); 147 _image_data = QImage();
115 if (first_resize_done) { 148 if (FirstResizeDone()) {
116 generateImage(); 149 generateImage();
117 } 150 }
118} 151}
119 152
120/* should be called every time the QImage changed it content */ 153/* should be called every time the QImage changed it content */
121void ImageScrollView::init() 154void OImageScrollView::init()
122{ 155{
123 odebug << "init " << oendl; 156 odebug << "init " << oendl;
124 157
@@ -129,6 +162,8 @@ void ImageScrollView::init()
129 _zoomer = new Opie::MM::OImageZoomer( this, "The Zoomer" ); 162 _zoomer = new Opie::MM::OImageZoomer( this, "The Zoomer" );
130 connect(_zoomer, SIGNAL( zoomAreaRel(int,int)), 163 connect(_zoomer, SIGNAL( zoomAreaRel(int,int)),
131 this, SLOT(scrollBy(int,int)) ); 164 this, SLOT(scrollBy(int,int)) );
165 connect(_zoomer, SIGNAL( zoomArea(int,int)),
166 this, SLOT(center(int,int)) );
132 connect(this,SIGNAL(contentsMoving(int,int)), 167 connect(this,SIGNAL(contentsMoving(int,int)),
133 _zoomer, (SLOT(setVisiblePoint(int,int))) ); 168 _zoomer, (SLOT(setVisiblePoint(int,int))) );
134 connect(this,SIGNAL(imageSizeChanged(const QSize&)), 169 connect(this,SIGNAL(imageSizeChanged(const QSize&)),
@@ -138,45 +173,55 @@ void ImageScrollView::init()
138 173
139 viewport()->setBackgroundColor(white); 174 viewport()->setBackgroundColor(white);
140 setFocusPolicy(QWidget::StrongFocus); 175 setFocusPolicy(QWidget::StrongFocus);
141 image_scaled_loaded = false; 176 setImageScaledLoaded(false);
142 image_is_jpeg = false; 177 setImageIsJpeg(false);
143 if (first_resize_done) { 178 if (FirstResizeDone()) {
144 last_rot = Rotate0; 179 m_last_rot = Rotate0;
145 generateImage(); 180 generateImage();
146 } else if (_original_data.size().isValid()) { 181 } else if (_original_data.size().isValid()) {
147 if (image_fit_into(_original_data.size()) || !show_zoomer) _zoomer->hide(); 182 if (image_fit_into(_original_data.size()) || !ShowZoomer()) _zoomer->hide();
148 resizeContents(_original_data.width(),_original_data.height()); 183 resizeContents(_original_data.width(),_original_data.height());
149 } 184 }
150} 185}
151 186
152void ImageScrollView::setAutoRotate(bool how) 187void OImageScrollView::setAutoRotate(bool how)
153{ 188{
154 /* to avoid double repaints */ 189 /* to avoid double repaints */
155 if (rotate_to_fit != how) { 190 if (AutoRotate() != how) {
156 rotate_to_fit = how; 191 m_states.setBit(AUTO_ROTATE,how);
157 _image_data = QImage(); 192 _image_data = QImage();
158 generateImage(); 193 generateImage();
159 } 194 }
160} 195}
161 196
162void ImageScrollView::setAutoScale(bool how) 197bool OImageScrollView::AutoRotate()const
163{ 198{
164 scale_to_fit = how; 199 return m_states.testBit(AUTO_ROTATE);
200}
201
202void OImageScrollView::setAutoScale(bool how)
203{
204 m_states.setBit(AUTO_SCALE,how);
165 if (!how) { 205 if (!how) {
166 rotate_to_fit = false; 206 setAutoRotate(false);
167 } 207 }
168 _image_data = QImage(); 208 _image_data = QImage();
169 if (image_is_jpeg && how == false && image_scaled_loaded==true) { 209 if (ImageIsJpeg() && how == false && ImageScaledLoaded()==true) {
170 loadJpeg(true); 210 loadJpeg(true);
171 } 211 }
172 generateImage(); 212 generateImage();
173} 213}
174 214
175ImageScrollView::~ImageScrollView() 215bool OImageScrollView::AutoScale()const
216{
217 return m_states.testBit(AUTO_SCALE);
218}
219
220OImageScrollView::~OImageScrollView()
176{ 221{
177} 222}
178 223
179void ImageScrollView::rescaleImage(int w, int h) 224void OImageScrollView::rescaleImage(int w, int h)
180{ 225{
181 if (_image_data.width()==w && _image_data.height()==h) { 226 if (_image_data.width()==w && _image_data.height()==h) {
182 return; 227 return;
@@ -189,7 +234,7 @@ void ImageScrollView::rescaleImage(int w, int h)
189 _image_data = _image_data.smoothScale(smoothW,smoothH); 234 _image_data = _image_data.smoothScale(smoothW,smoothH);
190} 235}
191 236
192void ImageScrollView::rotate_into_data(Rotation r) 237void OImageScrollView::rotate_into_data(Rotation r)
193{ 238{
194 /* realy - we must do this that way, 'cause when acting direct on _image_data the app will 239 /* realy - we must do this that way, 'cause when acting direct on _image_data the app will
195 segfault :( */ 240 segfault :( */
@@ -303,19 +348,20 @@ void ImageScrollView::rotate_into_data(Rotation r)
303 _image_data = dest; 348 _image_data = dest;
304} 349}
305 350
306void ImageScrollView::generateImage() 351void OImageScrollView::generateImage()
307{ 352{
308 Rotation r = Rotate0; 353 Rotation r = Rotate0;
354 if (_original_data.isNull()) return;
309 { 355 {
310 QCopEnvelope( "QPE/System", "busy()" ); 356 QCopEnvelope( "QPE/System", "busy()" );
311 } 357 }
312 if (width()>height()&&_original_data.width()<_original_data.height() || 358 if (width()>height()&&_original_data.width()<_original_data.height() ||
313 width()<height()&&_original_data.width()>_original_data.height()) { 359 width()<height()&&_original_data.width()>_original_data.height()) {
314 if (rotate_to_fit) r = Rotate90; 360 if (AutoRotate()) r = Rotate90;
315 } 361 }
316 362
317 odebug << " r = " << r << oendl; 363 odebug << " r = " << r << oendl;
318 if (scale_to_fit) { 364 if (AutoScale()) {
319 if (!_image_data.size().isValid()||width()>_image_data.width()||height()>_image_data.height()) { 365 if (!_image_data.size().isValid()||width()>_image_data.width()||height()>_image_data.height()) {
320 odebug << "Rescaling data" << oendl; 366 odebug << "Rescaling data" << oendl;
321 if (r==Rotate0) { 367 if (r==Rotate0) {
@@ -326,13 +372,13 @@ void ImageScrollView::generateImage()
326 } 372 }
327 rescaleImage(width(),height()); 373 rescaleImage(width(),height());
328 resizeContents(_image_data.width(),_image_data.height()); 374 resizeContents(_image_data.width(),_image_data.height());
329 } else if (!first_resize_done||r!=last_rot||_image_data.width()==0) { 375 } else if (!FirstResizeDone()||r!=m_last_rot||_image_data.width()==0) {
330 if (r==Rotate0) { 376 if (r==Rotate0) {
331 _image_data = _original_data; 377 _image_data = _original_data;
332 } else { 378 } else {
333 rotate_into_data(r); 379 rotate_into_data(r);
334 } 380 }
335 last_rot = r; 381 m_last_rot = r;
336 resizeContents(_image_data.width(),_image_data.height()); 382 resizeContents(_image_data.width(),_image_data.height());
337 } 383 }
338 _pdata.convertFromImage(_image_data); 384 _pdata.convertFromImage(_image_data);
@@ -347,10 +393,11 @@ void ImageScrollView::generateImage()
347 /* 393 /*
348 * move scrollbar 394 * move scrollbar
349 */ 395 */
396 if (_zoomer) {
350 _zoomer->setGeometry( viewport()->width()-_image_data.width()/2, viewport()->height()-_image_data.height()/2, 397 _zoomer->setGeometry( viewport()->width()-_image_data.width()/2, viewport()->height()-_image_data.height()/2,
351 _image_data.width()/2, _image_data.height()/2 ); 398 _image_data.width()/2, _image_data.height()/2 );
352
353 _zoomer->setImage( _image_data ); 399 _zoomer->setImage( _image_data );
400 }
354 /* 401 /*
355 * invalidate 402 * invalidate
356 */ 403 */
@@ -361,17 +408,17 @@ void ImageScrollView::generateImage()
361 } 408 }
362} 409}
363 410
364void ImageScrollView::resizeEvent(QResizeEvent * e) 411void OImageScrollView::resizeEvent(QResizeEvent * e)
365{ 412{
366 odebug << "ImageScrollView resizeEvent" << oendl; 413 odebug << "OImageScrollView resizeEvent" << oendl;
367 QScrollView::resizeEvent(e); 414 QScrollView::resizeEvent(e);
368 generateImage(); 415 generateImage();
369 first_resize_done = true; 416 setFirstResizeDone(true);
370 emit viewportSizeChanged( viewport()->size() ); 417 emit viewportSizeChanged( viewport()->size() );
371 418
372} 419}
373 420
374void ImageScrollView::keyPressEvent(QKeyEvent * e) 421void OImageScrollView::keyPressEvent(QKeyEvent * e)
375{ 422{
376 if (!e) return; 423 if (!e) return;
377 int dx = horizontalScrollBar()->lineStep(); 424 int dx = horizontalScrollBar()->lineStep();
@@ -394,7 +441,7 @@ void ImageScrollView::keyPressEvent(QKeyEvent * e)
394 QScrollView::keyPressEvent(e); 441 QScrollView::keyPressEvent(e);
395} 442}
396 443
397void ImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) 444void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph)
398{ 445{
399 int w = clipw; 446 int w = clipw;
400 int h = cliph; 447 int h = cliph;
@@ -427,7 +474,7 @@ void ImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw
427} 474}
428 475
429/* using the real geometry points and not the translated points is wanted! */ 476/* using the real geometry points and not the translated points is wanted! */
430void ImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) 477void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e)
431{ 478{
432 odebug << "Move X and Y " << e->x() << " " << e->y() << oendl; 479 odebug << "Move X and Y " << e->x() << " " << e->y() << oendl;
433 int mx, my; 480 int mx, my;
@@ -456,7 +503,7 @@ void ImageScrollView::viewportMouseMoveEvent(QMouseEvent* e)
456 _mouseStartPosY=my; 503 _mouseStartPosY=my;
457} 504}
458 505
459void ImageScrollView::contentsMousePressEvent ( QMouseEvent * e) 506void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e)
460{ 507{
461 odebug << " X and Y " << e->x() << " " << e->y() << oendl; 508 odebug << " X and Y " << e->x() << " " << e->y() << oendl;
462 /* this marks the beginning of a possible mouse move. Due internal reasons of QT 509 /* this marks the beginning of a possible mouse move. Due internal reasons of QT
@@ -468,7 +515,7 @@ void ImageScrollView::contentsMousePressEvent ( QMouseEvent * e)
468 _mouseStartPosY = -1; 515 _mouseStartPosY = -1;
469} 516}
470 517
471void ImageScrollView::setDestructiveClose() { 518void OImageScrollView::setDestructiveClose() {
472 WFlags fl = getWFlags(); 519 WFlags fl = getWFlags();
473 /* clear it just in case */ 520 /* clear it just in case */
474 fl &= ~WDestructiveClose; 521 fl &= ~WDestructiveClose;
@@ -476,7 +523,7 @@ void ImageScrollView::setDestructiveClose() {
476 setWFlags( fl ); 523 setWFlags( fl );
477} 524}
478 525
479bool ImageScrollView::image_fit_into(const QSize&s ) 526bool OImageScrollView::image_fit_into(const QSize&s )
480{ 527{
481 if (s.width()>width()||s.height()>height()) { 528 if (s.width()>width()||s.height()>height()) {
482 return false; 529 return false;
@@ -484,17 +531,56 @@ bool ImageScrollView::image_fit_into(const QSize&s )
484 return true; 531 return true;
485} 532}
486 533
487void ImageScrollView::setShowZoomer(bool how) 534void OImageScrollView::setShowZoomer(bool how)
488{ 535{
489 show_zoomer = how; 536 m_states.setBit(SHOW_ZOOMER,how);
490 check_zoomer(); 537 check_zoomer();
491} 538}
492 539
493void ImageScrollView::check_zoomer() 540bool OImageScrollView::ShowZoomer()const
541{
542 return m_states.testBit(SHOW_ZOOMER);
543}
544
545void OImageScrollView::check_zoomer()
494{ 546{
495 if ( (!show_zoomer||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) { 547 if (!_zoomer) return;
548 if ( (!ShowZoomer()||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) {
496 _zoomer->hide(); 549 _zoomer->hide();
497 } else if ( show_zoomer && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){ 550 } else if ( ShowZoomer() && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){
498 _zoomer->show(); 551 _zoomer->show();
499 } 552 }
500} 553}
554
555bool OImageScrollView::FirstResizeDone()const
556{
557 return m_states.testBit(FIRST_RESIZE_DONE);
558}
559
560void OImageScrollView::setFirstResizeDone(bool how)
561{
562 m_states.setBit(FIRST_RESIZE_DONE,how);
563}
564
565bool OImageScrollView::ImageIsJpeg()const
566{
567 return m_states.testBit(IMAGE_IS_JPEG);
568}
569
570void OImageScrollView::setImageIsJpeg(bool how)
571{
572 m_states.setBit(IMAGE_IS_JPEG,how);
573}
574
575bool OImageScrollView::ImageScaledLoaded()const
576{
577 return m_states.testBit(IMAGE_SCALED_LOADED);
578}
579
580void OImageScrollView::setImageScaledLoaded(bool how)
581{
582 m_states.setBit(IMAGE_SCALED_LOADED,how);
583}
584
585} // namespace MM
586} // namespace Opie