#ifndef OPIE_ODP_IMAGE_ZOOMER_H #define OPIE_ODP_IMAGE_ZOOMER_H #include #include class QPixmap; class QRect; class QPoint; namespace Opie { namespace MM { /** * \brief small class to zoom over a Page * * This class represents your page but smaller. * It can draw a Rect on top of an Image/Pixmap you supply * and you can allow the user easily zooming/moving * over your widget. * All you need to do is to supply a image/pixmap, the visible size * and the original image/pixmap size and the current visible top/left * position. * * This Image works perfectly with QScrollView as you can connect * QScrollView::contentsMoving to setVisiblePoint slot and the zoomAreRel * to the QScrollView::scrollBy slot. Now you would only need to watch * the resize event anf give us the new information about QScrollView::viewport * * You need to position and set the size of this widget! using setFixedSize() is quite * a good idea for this widget * * @see QScrollView * @see QScrollView::viewport() * * @since 1.2 * */ class OImageZoomer : public QFrame { Q_OBJECT public: OImageZoomer( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); OImageZoomer( const QPixmap&,QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); OImageZoomer( const QImage&, QWidget* parent = 0, const char* name= 0, WFlags fl = 0 ); OImageZoomer( const QSize&, const QSize&, QWidget* par, const char*, WFlags fl ); ~OImageZoomer(); public slots: void setImageSize( const QSize& ); void setViewPortSize( const QSize& ); void setVisiblePoint( const QPoint& ); void setVisiblePoint( int x, int y ); void setImage( const QImage& ); void setImage( const QPixmap& ); signals: /** * Relative movement in the coordinates of the viewport * This signal can easily be connected to QScrollView::scrollBy. * This signal is emitted from within the mouseMoveEvent of this widget * * * @param x The way to move relative on the X-Axis * @param y The way to move relative on the Y-Axis * * @see setVisiblePoint * @see QScrollView::scrollBy */ void zoomAreaRel( int x,int y); /** * Here you get absolute coordinates. * This slot will be emitted from within the mouseReleaseEvent of this widget. * if no mouse move where done. * So you may not delete this widget * * @param x The absolute X Coordinate to scroll to. * @param y The absolute Y Coordinate to scroll to. * */ void zoomArea( int x,int y); public: /** * make sure to call these if you reimplement * @internal */ void resizeEvent( QResizeEvent* ); protected: /** * make sure to call these if you reimplement * @internal */ void drawContents( QPainter* p ); /** * make sure to call these if you reimplememt * @internal */ virtual void mousePressEvent( QMouseEvent* ev ); /** * make sure to call these if you reimplement * @internal */ virtual void mouseMoveEvent( QMouseEvent* ev ); /** * make sure to call these if you reimplement * @internal */ virtual void mouseReleaseEvent( QMouseEvent* ev ); private: /** * @internal */ void init(); QImage m_img; QSize m_imgSize, m_visSize; QPoint m_visPt; int m_mouseX, m_mouseY; bool m_mevent; }; /** * This slot is present for convience. You can connect the * QScrollView::contentsMoved to this slot and it calls the QPoint * version for you * This realtes to QScrollView::contentsX() and QScrollView::contentsY() * * @param x The top left x coordinate * @param y The top left y coorisnate */ inline void OImageZoomer::setVisiblePoint( int x, int y ) { setVisiblePoint( QPoint( x, y ) ); } } } #endif