author | alwin <alwin> | 2004-04-06 23:54:50 (UTC) |
---|---|---|
committer | alwin <alwin> | 2004-04-06 23:54:50 (UTC) |
commit | 1b7aaf904fa70c16eee03155bd826e921798cc22 (patch) (side-by-side diff) | |
tree | da95ac3da9717101bfdc685e59a12a1e331f9ec0 | |
parent | 5cab9e2717383faaebb44cbb57df5badc3056206 (diff) | |
download | opie-1b7aaf904fa70c16eee03155bd826e921798cc22.zip opie-1b7aaf904fa70c16eee03155bd826e921798cc22.tar.gz opie-1b7aaf904fa70c16eee03155bd826e921798cc22.tar.bz2 |
fixed mousescroll handling so users kann move image with mouse/pen
implement key handler for arrow keys
-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 @@ -7,17 +7,16 @@ 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(); } @@ -51,16 +50,17 @@ void ImageScrollView::setImage( const QString& path ) { } } /* 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()); } } @@ -249,16 +249,39 @@ void ImageScrollView::generateImage() 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; @@ -287,51 +310,49 @@ void ImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw } /* 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 @@ -12,22 +12,22 @@ 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 }; @@ -43,30 +43,20 @@ protected: 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 |