Newer
Older
*/
void QwtPicker::widgetEnterEvent( QEvent *event )
{
transition( event );
}
/*!
Handle a leave event for the observed widget.
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
transition( event );
d_data->trackerPosition = QPoint( -1, -1 );
\sa eventFilter(), widgetMousePressEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
void QwtPicker::widgetMouseReleaseEvent( QMouseEvent *mouseEvent )
}
/*!
Handle mouse double click event for the observed widget.
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
void QwtPicker::widgetMouseDoubleClickEvent( QMouseEvent *mouseEvent )
/*!
Handle a wheel event for the observed widget.
Move the last point of the selection in case of isActive() == true
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
void QwtPicker::widgetWheelEvent( QWheelEvent *wheelEvent )
if ( pickArea().contains( wheelEvent->pos() ) )
d_data->trackerPosition = wheelEvent->pos();
}
/*!
Handle a key press event for the observed widget.
Selections can be completely done by the keyboard. The arrow keys
move the cursor, the abort key aborts a selection. All other keys
are handled by the current state machine.
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyReleaseEvent(), stateMachine(),
QwtEventPattern::KeyPatternCode
*/
if ( dx != 0 || dy != 0 )
{
const QRect rect = pickArea().boundingRect().toRect();
const QPoint pos = parentWidget()->mapFromGlobal( QCursor::pos() );
x = qMax( rect.left(), x );
x = qMin( rect.right(), x );
y = qMax( rect.top(), y );
y = qMin( rect.bottom(), y );
QCursor::setPos( parentWidget()->mapToGlobal( QPoint( x, y ) ) );
/*!
Handle a key release event for the observed widget.
Passes the event to the state machine.
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), stateMachine()
*/
void QwtPicker::widgetKeyReleaseEvent( QKeyEvent *keyEvent )
Passes an event to the state machine and executes the resulting
const QList<QwtPickerMachine::Command> commandList =
d_data->stateMachine->transition( *this, event );
switch ( event->type() )
{
case QEvent::MouseButtonDblClick:
case QEvent::MouseButtonPress:
case QEvent::MouseButtonRelease:
case QEvent::MouseMove:
{
const QMouseEvent *me =
static_cast< const QMouseEvent * >( event );
pos = me->pos();
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
default:
pos = parentWidget()->mapFromGlobal( QCursor::pos() );
}
for ( int i = 0; i < commandList.count(); i++ )
{
switch ( commandList[i] )
{
case QwtPickerMachine::Begin:
{
begin();
break;
}
case QwtPickerMachine::Append:
{
append( pos );
break;
}
case QwtPickerMachine::Move:
{
move( pos );
break;
}
case QwtPickerMachine::Remove:
{
remove();
break;
}
case QwtPickerMachine::End:
{
end();
break;
}
}
}
}
/*!
Open a selection setting the state to active
*/
void QwtPicker::begin()
{
if ( d_data->isActive )
return;
if ( trackerMode() != AlwaysOff )
{
if ( d_data->trackerPosition.x() < 0 || d_data->trackerPosition.y() < 0 )
{
d_data->trackerPosition = w->mapFromGlobal( QCursor::pos() );
}
/*!
\brief Close a selection setting the state to inactive.
\param ok If true, complete the selection and emit a selected signal
otherwise discard the selection.
\return true if the selection is accepted, false otherwise
\sa isActive(), begin(), append(), move(), selected(), accept()
if ( d_data->isActive )
{
setMouseTracking( false );
Reset the state machine and terminate ( end(false) ) the selection
*/
void QwtPicker::reset()
{
if ( d_data->stateMachine )
d_data->stateMachine->reset();
Append a point to the selection and update rubber band and tracker.
The appended() signal is emitted.
\param pos Additional point
if ( d_data->isActive )
{
const int idx = d_data->pickedPoints.count();
d_data->pickedPoints.resize( idx + 1 );
d_data->pickedPoints[idx] = pos;
}
}
/*!
Move the last point of the selection
The moved() signal is emitted.
\param pos New position
if ( d_data->isActive )
{
const int idx = d_data->pickedPoints.count() - 1;
if ( idx >= 0 )
{
if ( d_data->pickedPoints[idx] != pos )
{
d_data->pickedPoints[idx] = pos;
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
/*!
Remove the last point of the selection
The removed() signal is emitted.
\sa isActive(), begin(), end(), append(), move()
*/
void QwtPicker::remove()
{
if ( d_data->isActive )
{
const int idx = d_data->pickedPoints.count() - 1;
if ( idx > 0 )
{
const int idx = d_data->pickedPoints.count();
const QPoint pos = d_data->pickedPoints[idx - 1];
d_data->pickedPoints.resize( idx - 1 );
updateDisplay();
Q_EMIT removed( pos );
}
}
}
/*!
\brief Validate and fix up the selection
Accepts all selections unmodified
\param selection Selection to validate and fix up
\return true, when accepted, false otherwise
*/
bool QwtPicker::accept( QPolygon &selection ) const
return true;
}
/*!
A picker is active between begin() and end().
\return true if the selection is active.
*/
/*!
Return the points, that have been collected so far. The selection()
is calculated from the pickedPoints() in adjustedPoints().
\return Picked points
*/
const QPolygon &QwtPicker::pickedPoints() const
}
/*!
Scale the selection by the ratios of oldSize and newSize
The changed() signal is emitted.
\param oldSize Previous size
\param newSize Current size
\sa ResizeMode, setResizeMode(), resizeMode()
*/
void QwtPicker::stretchSelection( const QSize &oldSize, const QSize &newSize )
// avoid division by zero. But scaling for small sizes also
// doesn't make much sense, because of rounding losses. TODO ...
return;
}
const double xRatio =
for ( int i = 0; i < int( d_data->pickedPoints.count() ); i++ )
{
QPoint &p = d_data->pickedPoints[i];
p.setX( qRound( p.x() * xRatio ) );
p.setY( qRound( p.y() * yRatio ) );
}
}
/*!
Set mouse tracking for the observed widget.
In case of enable is true, the previous value
is saved, that is restored when enable is false.
\warning Even when enable is false, mouse tracking might be restored
to true. When mouseTracking for the observed widget
has been changed directly by QWidget::setMouseTracking
while mouse tracking has been set to true, this value can't
be restored.
*/
{
QWidget *widget = parentWidget();
if ( !widget )
return;
widget->setMouseTracking( true );
}
else
{
widget->setMouseTracking( d_data->mouseTracking );
}
}
/*!
Find the area of the observed widget, where selection might happen.
void QwtPicker::updateDisplay()
{
QWidget *w = parentWidget();
bool showRubberband = false;
bool showTracker = false;
showRubberband = true;
}
if ( trackerMode() == AlwaysOn ||
( trackerMode() == ActiveOnly && isActive() ) )
{
if ( trackerPen() != Qt::NoPen
&& !trackerRect( QFont() ).isEmpty() )
{
QPointer< QwtPickerRubberband > &rw = d_data->rubberBandOverlay;
if ( showRubberband )
{
if ( rw.isNull() )
{
rw = new QwtPickerRubberband( this, w );
rw->setObjectName( "PickerRubberBand" );
rw->resize( w->size() );
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
if ( d_data->rubberBand <= RectRubberBand )
rw->setMaskMode( QwtWidgetOverlay::MaskHint );
else
rw->setMaskMode( QwtWidgetOverlay::AlphaMask );
rw->updateOverlay();
}
else
{
if ( d_data->openGL )
{
// Qt 4.8 crashes for a delete
if ( !rw.isNull() )
{
rw->hide();
rw->deleteLater();
rw = NULL;
}
}
else
{
delete rw;
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
}
QPointer< QwtPickerTracker > &tw = d_data->trackerOverlay;
if ( showTracker )
{
if ( tw.isNull() )
{
tw = new QwtPickerTracker( this, w );
tw->setObjectName( "PickerTracker" );
tw->resize( w->size() );
}
tw->setFont( d_data->trackerFont );
tw->updateOverlay();
}
else
{
if ( d_data->openGL )
{
// Qt 4.8 crashes for a delete
if ( !tw.isNull() )
{
tw->hide();
tw->deleteLater();
tw = NULL;
}
}
else
{
delete tw;
}
}
//! \return Overlay displaying the rubber band
const QwtWidgetOverlay *QwtPicker::rubberBandOverlay() const
//! \return Overlay displaying the tracker text
const QwtWidgetOverlay *QwtPicker::trackerOverlay() const