summaryrefslogtreecommitdiff
path: root/libopie2/opiemm/oimagezoomer.cpp
Side-by-side diff
Diffstat (limited to 'libopie2/opiemm/oimagezoomer.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiemm/oimagezoomer.cpp233
1 files changed, 233 insertions, 0 deletions
diff --git a/libopie2/opiemm/oimagezoomer.cpp b/libopie2/opiemm/oimagezoomer.cpp
new file mode 100644
index 0000000..d1eec67
--- a/dev/null
+++ b/libopie2/opiemm/oimagezoomer.cpp
@@ -0,0 +1,233 @@
+#include "oimagezoomer.h"
+
+#include <opie2/odebug.h>
+
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qpainter.h>
+#include <qrect.h>
+#include <qpoint.h>
+#include <qsize.h>
+
+namespace Opie {
+namespace MM {
+
+/**
+ * \brief The most simple c'tor
+ * The main c'tor. You still need to set a QPixmap/QIMage,
+ * setImageSize,setViewPortSize,setVisiblePoint
+ *
+ * @param parent The parent widget
+ * @param name A name for this widget
+ * @param fl The widget flags
+ *
+ */
+OImageZoomer::OImageZoomer( QWidget* parent, const char* name, WFlags fl )
+ : QFrame( parent, name, fl ) {
+ init();
+}
+
+
+/**
+ * \brief This c'tor takes a QPixmap additional
+ *
+ * You initially set the QPixmap but you still need to provide
+ * the additional data to make this widget useful
+ *
+ * @param pix A Pixmap it'll be converted to a QImage later!
+ * @param par The parent widget
+ * @param name The name of this widget
+ * @param fl The widget flags
+ */
+OImageZoomer::OImageZoomer( const QPixmap& pix, QWidget* par, const char* name, WFlags fl )
+ : QFrame( par, name, fl ) {
+ init();
+ setImage( pix );
+}
+
+
+/**
+ * \brief This c'tor takes a QImage instead
+ * You just provide a QImage which is saved. It behaves the same as the others.
+ *
+ * @param img A Image which will be used for the zoomer content
+ * @param par The parent of the widget
+ * @param name The name of the widget
+ * @param fl The widgets flags
+ */
+OImageZoomer::OImageZoomer( const QImage& img, QWidget* par, const char* name, WFlags fl)
+ : QFrame( par, name, fl ) {
+ init();
+ setImage( img );
+}
+
+
+/**
+ * \brief overloaded c'tor
+ *
+ * This differs only in the arguments it takes
+ *
+ *
+ * @param pSize The size of the Page you show
+ * @param vSize The size of the viewport. The size of the visible part of the widget
+ * @param par The parent of the widget
+ * @param name The name
+ * @param fl The window flags
+ */
+OImageZoomer::OImageZoomer( const QSize& pSize, const QSize& vSize, QWidget* par,
+ const char* name, WFlags fl )
+ : QFrame( par, name, fl ), m_imgSize( pSize ),m_visSize( vSize ) {
+ init();
+}
+
+/**
+ * d'tor
+ */
+OImageZoomer::~OImageZoomer() {
+
+}
+
+void OImageZoomer::init() {
+ m_mevent = false;
+ setFrameStyle( Panel | Sunken );
+}
+
+
+/**
+ * \brief set the page/image size
+ * Tell us the QSize of the Data you show to the user. We need this
+ * to do the calculations
+ *
+ * @param size The size of the stuff you want to zoom on
+ */
+void OImageZoomer::setImageSize( const QSize& size ) {
+ m_imgSize = size;
+ repaint();
+}
+
+/**
+ * \brief Set the size of the viewport
+ * Tell us the QSize of the viewport. The viewport is the part
+ * of the widget which is exposed on the screen
+ *
+ * @param size Te size of the viewport
+ *
+ * @see QScrollView::viewport()
+ */
+void OImageZoomer::setViewPortSize( const QSize& size ) {
+ m_visSize = size;
+ repaint();
+}
+
+/**
+ * \brief the point in the topleft corner which is currently visible
+ * Set the visible point. This most of the times relate to QScrollView::contentsX()
+ * and QScrollView::contentsY()
+ *
+ * @see setVisiblePoint(int,int)
+ */
+void OImageZoomer::setVisiblePoint( const QPoint& pt ) {
+ m_visPt = pt;
+ repaint();
+}
+
+
+/**
+ * Set the Image. The image will be resized on resizeEvent
+ * and it'll set the QPixmap background
+ *
+ * @param img The image will be stored internally and used as the background
+ */
+void OImageZoomer::setImage( const QImage& img) {
+ m_img = img;
+ resizeEvent( 0 );
+ repaint();
+}
+
+/**
+ * overloaded function it calls the QImage version
+ */
+void OImageZoomer::setImage( const QPixmap& pix) {
+ setImage( pix.convertToImage() );
+}
+
+void OImageZoomer::resizeEvent( QResizeEvent* ev ) {
+ QFrame::resizeEvent( ev );
+ setBackgroundOrigin( QWidget::WidgetOrigin );
+ // TODO Qt3 use PalettePixmap and use size
+ QPixmap pix; pix.convertFromImage( m_img.smoothScale( size().width(), size().height() ) );
+ setBackgroundPixmap( pix);
+}
+
+void OImageZoomer::drawContents( QPainter* p ) {
+ /*
+ * if the page size
+ */
+ if ( m_imgSize.isEmpty() )
+ return;
+
+ /*
+ * paint a red rect which represents the visible size
+ *
+ * We need to recalculate x,y and width and height of the
+ * rect. So image size relates to contentRect
+ *
+ */
+ QRect c( contentsRect() );
+ p->setPen( Qt::red );
+
+ /*
+ * the contentRect is set equal to the size of the image
+ * Rect/Original = NewRectORWidth/OriginalVisibleStuff and then simply we
+ * need to add the c.y/x due usage of QFrame
+ * For x and y we use the visiblePoint
+ * For height and width we use the size of the viewport
+ * if width/height would be bigger than our widget we use this width/height
+ *
+ */
+ int len = m_imgSize.width();
+ int x = (c.width()*m_visPt.x())/len + c.x();
+ int w = (c.width()*m_visSize.width() )/len + c.x();
+ if ( w > c.width() ) w = c.width();
+
+ len = m_imgSize.height();
+ int y = (c.height()*m_visPt.y() )/len + c.y();
+ int h = (c.height()*m_visSize.height() )/len + c.y();
+ if ( h > c.height() ) h = c.height();
+
+ p->drawRect( x, y, w, h );
+}
+
+void OImageZoomer::mousePressEvent( QMouseEvent*ev) {
+ m_mouseX = m_mouseY = -1;
+ m_mevent = true;
+}
+
+void OImageZoomer::mouseReleaseEvent( QMouseEvent*ev) {
+ if (!m_mevent) return;
+ int mx, my;
+ mx = ev->x();
+ my = ev->y();
+ int diffx = (mx) * m_imgSize.width() / width();
+ int diffy = (my) * m_imgSize.height() / height();
+ emit zoomArea(diffx,diffy);
+}
+
+void OImageZoomer::mouseMoveEvent( QMouseEvent* ev ) {
+ int mx, my;
+ mx = ev->x();
+ my = ev->y();
+
+ if ( m_mouseX != -1 && m_mouseY != -1 ) {
+ m_mevent = false;
+ int diffx = ( mx - m_mouseX ) * m_imgSize.width() / width();
+ int diffy = ( my - m_mouseY ) * m_imgSize.height() / height();
+ emit zoomAreaRel( diffx, diffy );
+ }
+ m_mouseX = mx;
+ m_mouseY = my;
+}
+
+
+}
+}