CanvasPicker::CanvasPicker( QwtPlot *plot ): QObject( plot ), d_selectedCurve( NULL ), d_selectedPoint( -1 ) { QwtPlotCanvas *canvas = qobject_cast<QwtPlotCanvas *>( plot->canvas() ); canvas->installEventFilter( this ); // We want the focus, but no focus rect. The // selected point will be highlighted instead. canvas->setFocusPolicy( Qt::StrongFocus ); #ifndef QT_NO_CURSOR canvas->setCursor( Qt::PointingHandCursor ); #endif canvas->setFocusIndicator( QwtPlotCanvas::ItemFocusIndicator ); canvas->setFocus(); const char *text = "All points can be moved using the left mouse button " "or with these keys:\n\n" "- Up:\t\tSelect next curve\n" "- Down:\t\tSelect previous curve\n" "- Left, ´-´:\tSelect next point\n" "- Right, ´+´:\tSelect previous point\n" "- 7, 8, 9, 4, 6, 1, 2, 3:\tMove selected point"; canvas->setWhatsThis( text ); shiftCurveCursor( true ); }
bool CanvasPicker::eventFilter( QObject *object, QEvent *event ) { if ( plot() == NULL || object != plot()->canvas() ) return false; switch( event->type() ) { case QEvent::FocusIn: { showCursor( true ); break; } case QEvent::FocusOut: { showCursor( false ); break; } case QEvent::Paint: { QApplication::postEvent( this, new QEvent( QEvent::User ) ); break; } case QEvent::MouseButtonPress: { const QMouseEvent *mouseEvent = static_cast<QMouseEvent *>( event ); select( mouseEvent->pos() ); return true; } case QEvent::MouseMove: { const QMouseEvent *mouseEvent = static_cast<QMouseEvent *>( event ); move( mouseEvent->pos() ); return true; } case QEvent::KeyPress: { const QKeyEvent *keyEvent = static_cast<QKeyEvent *>( event ); const int delta = 5; switch( keyEvent->key() ) { case Qt::Key_Up: { shiftCurveCursor( true ); return true; } case Qt::Key_Down: { shiftCurveCursor( false ); return true; } case Qt::Key_Right: case Qt::Key_Plus: { if ( d_selectedCurve ) shiftPointCursor( true ); else shiftCurveCursor( true ); return true; } case Qt::Key_Left: case Qt::Key_Minus: { if ( d_selectedCurve ) shiftPointCursor( false ); else shiftCurveCursor( true ); return true; } // The following keys represent a direction, they are // organized on the keyboard. case Qt::Key_1: { moveBy( -delta, delta ); break; } case Qt::Key_2: { moveBy( 0, delta ); break; } case Qt::Key_3: { moveBy( delta, delta ); break; } case Qt::Key_4: { moveBy( -delta, 0 ); break; } case Qt::Key_6: { moveBy( delta, 0 ); break; } case Qt::Key_7: { moveBy( -delta, -delta ); break; } case Qt::Key_8: { moveBy( 0, -delta ); break; } case Qt::Key_9: { moveBy( delta, -delta ); break; } default: break; } } default: break; } return QObject::eventFilter( object, event ); }
bool CanvasPicker::eventFilter(QObject *object, QEvent *e) { if ( object != (QObject *)plot()->canvas() ) return false; switch(e->type()) { case QEvent::FocusIn: showCursor(true); case QEvent::FocusOut: showCursor(false); case QEvent::Paint: { QApplication::postEvent(this, new QEvent(QEvent::User)); break; } case QEvent::MouseButtonPress: { select(((QMouseEvent *)e)->pos()); return true; } case QEvent::MouseMove: { move(((QMouseEvent *)e)->pos()); return true; } case QEvent::KeyPress: { const int delta = 5; switch(((const QKeyEvent *)e)->key()) { case Qt::Key_Up: shiftCurveCursor(true); return true; case Qt::Key_Down: shiftCurveCursor(false); return true; case Qt::Key_Right: case Qt::Key_Plus: if ( d_selectedCurve ) shiftPointCursor(true); else shiftCurveCursor(true); return true; case Qt::Key_Left: case Qt::Key_Minus: if ( d_selectedCurve ) shiftPointCursor(false); else shiftCurveCursor(true); return true; // The following keys represent a direction, they are // organized on the keyboard. case Qt::Key_1: moveBy(-delta, delta); break; case Qt::Key_2: moveBy(0, delta); break; case Qt::Key_3: moveBy(delta, delta); break; case Qt::Key_4: moveBy(-delta, 0); break; case Qt::Key_6: moveBy(delta, 0); break; case Qt::Key_7: moveBy(-delta, -delta); break; case Qt::Key_8: moveBy(0, -delta); break; case Qt::Key_9: moveBy(delta, -delta); break; default: break; } } default: break; } return QObject::eventFilter(object, e); }