summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/graphics/opie-eye/gui/imagescrollview.cpp81
-rw-r--r--noncore/graphics/opie-eye/gui/imagescrollview.h28
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