00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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 }