-rw-r--r-- | noncore/graphics/opie-eye/gui/imagescrollview.cpp | 81 | ||||
-rw-r--r-- | noncore/graphics/opie-eye/gui/imagescrollview.h | 28 |
2 files changed, 60 insertions, 49 deletions
diff --git a/noncore/graphics/opie-eye/gui/imagescrollview.cpp b/noncore/graphics/opie-eye/gui/imagescrollview.cpp index 99fdc51..98054ff 100644 --- a/noncore/graphics/opie-eye/gui/imagescrollview.cpp +++ b/noncore/graphics/opie-eye/gui/imagescrollview.cpp @@ -3,25 +3,24 @@ #include <opie2/odebug.h> using namespace Opie::Core; #include <qimage.h> #include <qlayout.h> ImageScrollView::ImageScrollView( QWidget* parent, const char* name, WFlags f ) :QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(),scale_to_fit(true), rotate_to_fit(true),first_resize_done(false),m_lastName("") { init(); - qDebug("constructor done"); } ImageScrollView::ImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img),scale_to_fit(always_scale), rotate_to_fit(rfit),first_resize_done(false),m_lastName("") { init(); } ImageScrollView::ImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),scale_to_fit(always_scale), rotate_to_fit(rfit),first_resize_done(false),m_lastName("") @@ -47,24 +46,25 @@ void ImageScrollView::setImage( const QString& path ) { _original_data.load(path); _image_data = QImage(); if (first_resize_done) { generateImage(); } } /* should be called every time the QImage changed it content */ void ImageScrollView::init() { odebug << "init " << oendl; viewport()->setBackgroundColor(white); + setFocusPolicy(QWidget::StrongFocus); if (first_resize_done) { last_rot = Rotate0; generateImage(); odebug << "reinit display " << oendl; } else if (_original_data.size().isValid()) { resizeContents(_original_data.width(),_original_data.height()); } } void ImageScrollView::setAutoRotate(bool how) { /* to avoid double repaints */ @@ -245,24 +245,47 @@ void ImageScrollView::generateImage() resizeContents(_image_data.width(),_image_data.height()); } } void ImageScrollView::resizeEvent(QResizeEvent * e) { odebug << "ImageScrollView resizeEvent" << oendl; QScrollView::resizeEvent(e); generateImage(); first_resize_done = true; } +void ImageScrollView::keyPressEvent(QKeyEvent * e) +{ + if (!e) return; + int dx = horizontalScrollBar()->lineStep(); + int dy = verticalScrollBar()->lineStep(); + if (e->key()==Qt::Key_Right) { + scrollBy(dx,0); + e->accept(); + } else if (e->key()==Qt::Key_Left) { + scrollBy(0-dx,0); + e->accept(); + } else if (e->key()==Qt::Key_Up) { + scrollBy(0,0-dy); + e->accept(); + } else if (e->key()==Qt::Key_Down) { + scrollBy(0,dy); + e->accept(); + } else { + e->ignore(); + } + QScrollView::keyPressEvent(e); +} + void ImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) { int w = clipw; int h = cliph; int x = clipx; int y = clipy; bool erase = false; if (!_image_data.size().isValid()) { p->fillRect(clipx,clipy,clipw,cliph,white); return; } @@ -283,55 +306,53 @@ void ImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw if (erase||_image_data.hasAlphaBuffer()) { p->fillRect(clipx,clipy,clipw,cliph,white); } p->drawImage(clipx,clipy,_image_data,x,y,w,h); } /* using the real geometry points and not the translated points is wanted! */ void ImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) { int mx, my; mx = e->x(); my = e->y(); - int diffx = _mouseStartPosX-mx; - int diffy = _mouseStartPosY-my; - scrollBy(diffx,diffy); + if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { + int diffx = _mouseStartPosX-mx; + int diffy = _mouseStartPosY-my; +#if 0 + QScrollBar*xbar = horizontalScrollBar(); + QScrollBar*ybar = verticalScrollBar(); + if (xbar->value()+diffx>xbar->maxValue()) { + diffx = xbar->maxValue()-xbar->value(); + } else if (xbar->value()+diffx<0) { + diffx=0-xbar->value(); + } + if (ybar->value()+diffy>ybar->maxValue()) { + diffy = ybar->maxValue()-ybar->value(); + } else if (ybar->value()+diffy<0) { + diffy=0-ybar->value(); + } +#endif + scrollBy(diffx,diffy); + } _mouseStartPosX=mx; _mouseStartPosY=my; } -void ImageScrollView::contentsMouseReleaseEvent ( QMouseEvent * e) +void ImageScrollView::contentsMousePressEvent ( QMouseEvent * ) { - _mouseStartPosX = e->x(); - _mouseStartPosY = e->y(); -} - -void ImageScrollView::contentsMousePressEvent ( QMouseEvent * e) -{ - _mouseStartPosX = e->x(); - _mouseStartPosY = e->y(); + /* this marks the beginning of a possible mouse move. Due internal reasons of QT + the geometry values here may real differ from that set in MoveEvent (I don't know + why). For getting them in real context, we use the first move-event to set the start + position ;) + */ + _mouseStartPosX = -1; + _mouseStartPosY = -1; } void ImageScrollView::setDestructiveClose() { WFlags fl = getWFlags(); /* clear it just in case */ fl &= ~WDestructiveClose; fl |= WDestructiveClose; setWFlags( fl ); } - - -/* for testing */ -ImageDlg::ImageDlg(const QString&fname,QWidget * parent, const char * name) - :QDialog(parent,name,true,WStyle_ContextHelp) -{ - QVBoxLayout*dlglayout = new QVBoxLayout(this); - dlglayout->setSpacing(2); - dlglayout->setMargin(1); - ImageScrollView*inf = new ImageScrollView(fname,this); - dlglayout->addWidget(inf); - odebug << "Imagedlg constructor end" << oendl; -} - -ImageDlg::~ImageDlg() -{ -} diff --git a/noncore/graphics/opie-eye/gui/imagescrollview.h b/noncore/graphics/opie-eye/gui/imagescrollview.h index 44f2a64..17e2f5f 100644 --- a/noncore/graphics/opie-eye/gui/imagescrollview.h +++ b/noncore/graphics/opie-eye/gui/imagescrollview.h @@ -8,30 +8,30 @@ class QPainter; class ImageScrollView:public QScrollView { Q_OBJECT public: ImageScrollView( QWidget* parent, const char* name = 0, WFlags fl = 0 ); ImageScrollView (const QImage&, QWidget * parent=0, const char * name=0, WFlags f=0,bool always_scale=false,bool rfit=false ); ImageScrollView (const QString&, QWidget * parent=0, const char * name=0, WFlags f=0,bool always_scale=false,bool rfit=false ); virtual ~ImageScrollView(); - void setImage(const QImage&); - void setImage( const QString& path ); - void setDestructiveClose(); + virtual void setImage(const QImage&); + virtual void setImage( const QString& path ); + virtual void setDestructiveClose(); - void setAutoRotate(bool); - void setAutoScale(bool); + virtual void setAutoRotate(bool); + virtual void setAutoScale(bool); enum Rotation { Rotate0, Rotate90, Rotate180, Rotate270 }; signals: void sig_return(); protected: @@ -39,34 +39,24 @@ protected: void init(); QImage _image_data; QImage _original_data; int _mouseStartPosX,_mouseStartPosY; bool scale_to_fit; bool rotate_to_fit; bool first_resize_done; Rotation last_rot; QString m_lastName; - void rescaleImage(int w, int h); + virtual void rescaleImage(int w, int h); - void rotate_into_data(Rotation r); - void generateImage(); + virtual void rotate_into_data(Rotation r); + virtual void generateImage(); protected slots: virtual void viewportMouseMoveEvent(QMouseEvent* e); virtual void contentsMousePressEvent ( QMouseEvent * e); - virtual void contentsMouseReleaseEvent ( QMouseEvent * e); virtual void resizeEvent(QResizeEvent * e); + virtual void keyPressEvent(QKeyEvent * e); }; - -/* for testing */ -class ImageDlg:public QDialog -{ - Q_OBJECT -public: - ImageDlg(const QString&,QWidget * parent=0, const char * name=0); - virtual ~ImageDlg(); -}; - #endif |