10#include "qwt_panner.h"
11#include "qwt_picker.h"
12#include "qwt_painter.h"
24 QObjectList children = w->children();
25 for (
int i = 0; i < children.size(); i++ )
27 QwtPicker* picker = qobject_cast< QwtPicker* >( children[i] );
35class QwtPanner::PrivateData
39 : button( Qt::LeftButton )
40 , buttonModifiers( Qt::NoModifier )
41 , abortKey( Qt::Key_Escape )
42 , abortKeyModifiers( Qt::NoModifier )
45 , restoreCursor( NULL )
49 , orientations( Qt::Vertical | Qt::Horizontal )
61 Qt::MouseButton button;
62 Qt::KeyboardModifiers buttonModifiers;
65 Qt::KeyboardModifiers abortKeyModifiers;
75 QCursor* restoreCursor;
79 Qt::Orientations orientations;
90 m_data =
new PrivateData();
92 setAttribute( Qt::WA_TransparentForMouseEvents );
93 setAttribute( Qt::WA_NoSystemBackground );
94 setFocusPolicy( Qt::NoFocus );
111 Qt::KeyboardModifiers modifiers )
113 m_data->button = button;
114 m_data->buttonModifiers = modifiers;
119 Qt::KeyboardModifiers& modifiers )
const
121 button = m_data->button;
122 modifiers = m_data->buttonModifiers;
133 Qt::KeyboardModifiers modifiers )
135 m_data->abortKey = key;
136 m_data->abortKeyModifiers = modifiers;
141 Qt::KeyboardModifiers& modifiers )
const
143 key = m_data->abortKey;
144 modifiers = m_data->abortKeyModifiers;
158 m_data->cursor =
new QCursor(
cursor );
169 if ( m_data->cursor )
170 return *m_data->cursor;
172 if ( parentWidget() )
173 return parentWidget()->cursor();
190 if ( m_data->isEnabled != on )
192 m_data->isEnabled = on;
194 QWidget* w = parentWidget();
197 if ( m_data->isEnabled )
199 w->installEventFilter(
this );
203 w->removeEventFilter(
this );
218 m_data->orientations = o;
224 return m_data->orientations;
233 return m_data->orientations & o;
242 return m_data->isEnabled;
255 int dx = m_data->pos.x() - m_data->initialPos.x();
256 int dy = m_data->pos.y() - m_data->initialPos.y();
260 r.moveCenter( QPointF( r.center().x() + dx, r.center().y() + dy ) );
265 QPainter painter( &pm );
267 if ( !m_data->contentsMask.isNull() )
269 QPixmap masked = m_data->pixmap;
270 masked.setMask( m_data->contentsMask );
271 painter.drawPixmap( r.toRect(), masked );
275 painter.drawPixmap( r.toRect(), m_data->pixmap );
280 if ( !m_data->contentsMask.isNull() )
281 pm.setMask( m_data->contentsMask );
283 painter.begin(
this );
284 painter.setClipRegion( event->region() );
285 painter.drawPixmap( 0, 0, pm );
308#if QT_VERSION >= 0x050000
309 return parentWidget()->grab( parentWidget()->rect() );
311 return QPixmap::grabWidget( parentWidget() );
332 if (
object == NULL ||
object != parentWidget() )
335 switch ( event->type() )
337 case QEvent::MouseButtonPress:
342 case QEvent::MouseMove:
347 case QEvent::MouseButtonRelease:
352 case QEvent::KeyPress:
357 case QEvent::KeyRelease:
383 if ( ( mouseEvent->button() != m_data->button )
384 || ( mouseEvent->modifiers() != m_data->buttonModifiers ) )
389 QWidget* w = parentWidget();
397 m_data->initialPos = m_data->pos = mouseEvent->pos();
399 setGeometry( parentWidget()->rect() );
403 for (
int i = 0; i < pickers.size(); i++ )
406 m_data->pixmap =
grab();
409 for (
int i = 0; i < pickers.size(); i++ )
426 QPoint pos = mouseEvent->pos();
428 pos.setX( m_data->initialPos.x() );
430 pos.setY( m_data->initialPos.y() );
432 if ( pos != m_data->pos && rect().contains( pos ) )
437 Q_EMIT
moved( m_data->pos.x() - m_data->initialPos.x(),
438 m_data->pos.y() - m_data->initialPos.y() );
458 QPoint pos = mouseEvent->pos();
460 pos.setX( m_data->initialPos.x() );
462 pos.setY( m_data->initialPos.y() );
464 m_data->pixmap = QPixmap();
465 m_data->contentsMask = QBitmap();
468 if ( m_data->pos != m_data->initialPos )
470 Q_EMIT
panned( m_data->pos.x() - m_data->initialPos.x(),
471 m_data->pos.y() - m_data->initialPos.y() );
484 if ( ( keyEvent->key() == m_data->abortKey )
485 && ( keyEvent->modifiers() == m_data->abortKeyModifiers ) )
492 m_data->pixmap = QPixmap();
504 Q_UNUSED( keyEvent );
508void QwtPanner::showCursor(
bool on )
510 if ( on == m_data->hasCursor )
513 QWidget* w = parentWidget();
514 if ( w == NULL || m_data->cursor == NULL )
517 m_data->hasCursor = on;
521 if ( w->testAttribute( Qt::WA_SetCursor ) )
523 delete m_data->restoreCursor;
524 m_data->restoreCursor =
new QCursor( w->cursor() );
526 w->setCursor( *m_data->cursor );
530 if ( m_data->restoreCursor )
532 w->setCursor( *m_data->restoreCursor );
533 delete m_data->restoreCursor;
534 m_data->restoreCursor = NULL;
542#include "moc_qwt_panner.cpp"
static void fillPixmap(const QWidget *, QPixmap &, const QPoint &offset=QPoint())
static qreal devicePixelRatio(const QPaintDevice *)
static QPixmap backingStore(QWidget *, const QSize &)
Qt::Orientations orientations() const
Return the orientation, where panning is enabled.
virtual ~QwtPanner()
Destructor.
const QCursor cursor() const
virtual bool eventFilter(QObject *, QEvent *) override
Event filter.
void setEnabled(bool)
En/disable the panner.
virtual void widgetMouseMoveEvent(QMouseEvent *)
void setMouseButton(Qt::MouseButton, Qt::KeyboardModifiers=Qt::NoModifier)
virtual void widgetKeyPressEvent(QKeyEvent *)
void getMouseButton(Qt::MouseButton &button, Qt::KeyboardModifiers &) const
Get mouse button and modifiers used for panning.
virtual void widgetKeyReleaseEvent(QKeyEvent *)
void moved(int dx, int dy)
bool isOrientationEnabled(Qt::Orientation) const
virtual void paintEvent(QPaintEvent *) override
Paint event.
void setOrientations(Qt::Orientations)
virtual QBitmap contentsMask() const
Calculate a mask for the contents of the panned widget.
virtual void widgetMouseReleaseEvent(QMouseEvent *)
void getAbortKey(int &key, Qt::KeyboardModifiers &) const
Get the abort key and modifiers.
virtual QPixmap grab() const
void setCursor(const QCursor &)
void setAbortKey(int key, Qt::KeyboardModifiers=Qt::NoModifier)
virtual void widgetMousePressEvent(QMouseEvent *)
void panned(int dx, int dy)
QwtPanner(QWidget *parent)
QwtPicker provides selections on a widget.