qwt_panner.cpp

00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
00008  *****************************************************************************/
00009 
00010 // vim: expandtab
00011 
00012 #include <qpainter.h>
00013 #include <qpixmap.h>
00014 #include <qevent.h>
00015 #include <qframe.h>
00016 #include <qcursor.h>
00017 #include "qwt_panner.h"
00018 
00019 class QwtPanner::PrivateData
00020 {
00021 public:
00022     PrivateData():
00023         isEnabled(false),
00024         button(Qt::LeftButton),
00025         buttonState(Qt::NoButton),
00026         abortKey(Qt::Key_Escape),
00027         abortKeyState(Qt::NoButton),
00028         cursor(NULL),
00029         restoreCursor(NULL)
00030     {
00031     }
00032 
00033     ~PrivateData()
00034     {
00035         delete cursor;
00036         delete restoreCursor;
00037     }
00038         
00039     bool isEnabled;
00040     int button;
00041     int buttonState;
00042     int abortKey;
00043     int abortKeyState;
00044 
00045     QPoint initialPos;
00046     QPoint pos;
00047 
00048     QPixmap pixmap;
00049     QCursor *cursor;
00050     QCursor *restoreCursor;
00051 };
00052 
00058 QwtPanner::QwtPanner(QWidget *parent):
00059     QWidget(parent)
00060 {
00061     d_data = new PrivateData();
00062 
00063 #if QT_VERSION >= 0x040000
00064     setAttribute(Qt::WA_TransparentForMouseEvents);
00065     setAttribute(Qt::WA_NoSystemBackground);
00066     setAttribute(Qt::WA_PaintOnScreen);
00067     setFocusPolicy(Qt::NoFocus);
00068 #else
00069     setBackgroundMode(Qt::NoBackground);
00070     setFocusPolicy(QWidget::NoFocus);
00071 #endif
00072     hide();
00073 
00074     setEnabled(true);
00075 }
00076 
00078 QwtPanner::~QwtPanner()
00079 {
00080     delete d_data;
00081 }
00082 
00087 void QwtPanner::setMouseButton(int button, int buttonState)
00088 {
00089     d_data->button = button;
00090     d_data->buttonState = buttonState;
00091 }
00092 
00094 void QwtPanner::getMouseButton(int &button, int &buttonState) const
00095 {
00096     button = d_data->button;
00097     buttonState = d_data->buttonState;
00098 }
00099 
00104 void QwtPanner::setAbortKey(int key, int state)
00105 {
00106     d_data->abortKey = key;
00107     d_data->abortKeyState = state;
00108 }
00109 
00111 void QwtPanner::getAbortKey(int &key, int &state) const
00112 {
00113     key = d_data->abortKey;
00114     state = d_data->abortKeyState;
00115 }
00116 
00125 void QwtPanner::setCursor(const QCursor &cursor)
00126 {
00127     d_data->cursor = new QCursor(cursor);
00128 }
00129 
00134 const QCursor QwtPanner::cursor() const
00135 {
00136     if ( d_data->cursor )
00137         return *d_data->cursor;
00138 
00139     if ( parentWidget() )
00140         return parentWidget()->cursor();
00141 
00142     return QCursor();
00143 }
00144 
00154 void QwtPanner::setEnabled(bool on)
00155 {
00156     if ( d_data->isEnabled != on )
00157     {
00158         d_data->isEnabled = on;
00159 
00160         QWidget *w = parentWidget();
00161         if ( w )
00162         {
00163             if ( d_data->isEnabled )
00164             {
00165                 w->installEventFilter(this);
00166             }
00167             else
00168             {
00169                 w->removeEventFilter(this);
00170                 hide();
00171             }
00172         }
00173     }
00174 }
00175 
00180 bool QwtPanner::isEnabled() const
00181 {
00182     return d_data->isEnabled;
00183 }
00184 
00193 void QwtPanner::paintEvent(QPaintEvent *pe)
00194 {
00195     QPixmap pm(size());
00196 
00197     QPainter painter(&pm);
00198 
00199     const QColor bg =
00200 #if QT_VERSION < 0x040000
00201         parentWidget()->palette().color(
00202             QPalette::Normal, QColorGroup::Background);
00203 #else
00204         parentWidget()->palette().color(
00205             QPalette::Normal, QPalette::Background);
00206 #endif
00207 
00208     painter.setPen(Qt::NoPen);
00209     painter.setBrush(QBrush(bg));
00210     painter.drawRect(0, 0, pm.width(), pm.height());
00211 
00212     int dx = d_data->pos.x() - d_data->initialPos.x();
00213     int dy = d_data->pos.y() - d_data->initialPos.y();
00214 
00215     QRect r(0, 0, d_data->pixmap.width(), d_data->pixmap.height());
00216     r.moveCenter(QPoint(r.center().x() + dx, r.center().y() + dy));
00217 
00218     painter.drawPixmap(r, d_data->pixmap);
00219     painter.end();
00220 
00221     painter.begin(this);
00222     painter.setClipRegion(pe->region());
00223     painter.drawPixmap(0, 0, pm);
00224 }
00225 
00234 bool QwtPanner::eventFilter(QObject *o, QEvent *e)
00235 {
00236     if ( o == NULL || o != parentWidget() )
00237         return false;
00238 
00239     switch(e->type())
00240     {
00241         case QEvent::MouseButtonPress:
00242         {
00243             widgetMousePressEvent((QMouseEvent *)e);
00244             break;
00245         }
00246         case QEvent::MouseMove:
00247         {
00248             widgetMouseMoveEvent((QMouseEvent *)e);
00249             break;
00250         }
00251         case QEvent::MouseButtonRelease:
00252         {
00253             widgetMouseReleaseEvent((QMouseEvent *)e);
00254             break;
00255         }
00256         case QEvent::KeyPress:
00257         {
00258             widgetKeyPressEvent((QKeyEvent *)e);
00259             break;
00260         }
00261         case QEvent::KeyRelease:
00262         {
00263             widgetKeyReleaseEvent((QKeyEvent *)e);
00264             break;
00265         }
00266         default:;
00267     }
00268 
00269     return false;
00270 }
00271 
00279 void QwtPanner::widgetMousePressEvent(QMouseEvent *me)
00280 {
00281     if ( me->button() != d_data->button )
00282         return;
00283 
00284     QWidget *w = parentWidget();
00285     if ( w == NULL )
00286         return;
00287 
00288 #if QT_VERSION < 0x040000
00289     if ( (me->state() & Qt::KeyButtonMask) !=
00290         (d_data->buttonState & Qt::KeyButtonMask) )
00291 #else
00292     if ( (me->modifiers() & Qt::KeyboardModifierMask) !=
00293         (int)(d_data->buttonState & Qt::KeyboardModifierMask) )
00294 #endif
00295     {
00296         return;
00297     }
00298 
00299     showCursor(true);
00300 
00301     d_data->initialPos = d_data->pos = me->pos();
00302 
00303     QRect cr = parentWidget()->rect();
00304     if ( parentWidget()->inherits("QFrame") )
00305     {
00306         const QFrame* frame = (QFrame*)parentWidget();
00307         cr = frame->contentsRect();
00308     }
00309     setGeometry(cr);
00310     d_data->pixmap = QPixmap::grabWidget(parentWidget(),
00311         cr.x(), cr.y(), cr.width(), cr.height());
00312     show();
00313 }
00314 
00322 void QwtPanner::widgetMouseMoveEvent(QMouseEvent *me)
00323 {
00324     if ( isVisible() && rect().contains(me->pos()) )
00325     {
00326         d_data->pos = me->pos();
00327         update();
00328 
00329         emit moved(d_data->pos.x() - d_data->initialPos.x(), 
00330             d_data->pos.y() - d_data->initialPos.y());
00331     }
00332 }
00333 
00339 void QwtPanner::widgetMouseReleaseEvent(QMouseEvent *me)
00340 {
00341     if ( isVisible() )
00342     {
00343         hide();
00344         showCursor(false);
00345 
00346         d_data->pixmap = QPixmap();
00347         d_data->pos = me->pos();
00348 
00349         if ( d_data->pos != d_data->initialPos )
00350         {
00351             emit panned(d_data->pos.x() - d_data->initialPos.x(), 
00352                 d_data->pos.y() - d_data->initialPos.y());
00353         }
00354     }
00355 }
00356 
00363 void QwtPanner::widgetKeyPressEvent(QKeyEvent *ke)
00364 {
00365     if ( ke->key() == d_data->abortKey )
00366     {
00367         const bool matched =
00368 #if QT_VERSION < 0x040000
00369             (ke->state() & Qt::KeyButtonMask) ==
00370                 (d_data->abortKeyState & Qt::KeyButtonMask);
00371 #else
00372             (ke->modifiers() & Qt::KeyboardModifierMask) ==
00373                 (int)(d_data->abortKeyState & Qt::KeyboardModifierMask);
00374 #endif
00375         if ( matched )
00376         {
00377             hide();
00378             showCursor(false);
00379             d_data->pixmap = QPixmap();
00380         }
00381     }
00382 }
00383 
00390 void QwtPanner::widgetKeyReleaseEvent(QKeyEvent *)
00391 {
00392 }
00393 
00394 void QwtPanner::showCursor(bool on)
00395 {
00396     QWidget *w = parentWidget();
00397     if ( w == NULL || d_data->cursor == NULL )
00398         return;
00399 
00400     if ( on )
00401     {
00402 #if QT_VERSION < 0x040000
00403         if ( w->testWState(WState_OwnCursor) )
00404 #else
00405         if ( w->testAttribute(Qt::WA_SetCursor) )
00406 #endif
00407         {
00408             delete d_data->restoreCursor;
00409             d_data->restoreCursor = new QCursor(w->cursor());
00410         }
00411         w->setCursor(*d_data->cursor);
00412     }
00413     else
00414     {
00415         if ( d_data->restoreCursor ) 
00416         {
00417             w->setCursor(*d_data->restoreCursor);
00418             delete d_data->restoreCursor;
00419             d_data->restoreCursor = NULL;
00420         }
00421         else
00422             w->unsetCursor();
00423     }
00424 }

Generated on Mon Nov 6 20:32:57 2006 for Qwt User's Guide by  doxygen 1.4.6