/*! Calculate the bounding rectangle for the tracker text from the current position of the tracker \param font Font of the tracker text \return Bounding rectangle of the tracker text \sa trackerPosition() */ QRect QwtPicker::trackerRect( const QFont &font ) const { if ( trackerMode() == AlwaysOff || ( trackerMode() == ActiveOnly && !isActive() ) ) { return QRect(); } if ( d_data->trackerPosition.x() < 0 || d_data->trackerPosition.y() < 0 ) return QRect(); QwtText text = trackerText( d_data->trackerPosition ); if ( text.isEmpty() ) return QRect(); const QSizeF textSize = text.textSize( font ); QRect textRect( 0, 0, qCeil( textSize.width() ), qCeil( textSize.height() ) ); const QPoint &pos = d_data->trackerPosition; int alignment = 0; if ( isActive() && d_data->pickedPoints.count() > 1 && rubberBand() != NoRubberBand ) { const QPoint last = d_data->pickedPoints[int( d_data->pickedPoints.count() ) - 2]; alignment |= ( pos.x() >= last.x() ) ? Qt::AlignRight : Qt::AlignLeft; alignment |= ( pos.y() > last.y() ) ? Qt::AlignBottom : Qt::AlignTop; } else alignment = Qt::AlignTop | Qt::AlignRight; const int margin = 5; int x = pos.x(); if ( alignment & Qt::AlignLeft ) x -= textRect.width() + margin; else if ( alignment & Qt::AlignRight ) x += margin; int y = pos.y(); if ( alignment & Qt::AlignBottom ) y += margin; else if ( alignment & Qt::AlignTop ) y -= textRect.height() + margin; textRect.moveTopLeft( QPoint( x, y ) ); int right = qMin( textRect.right(), pickRect().right() - margin ); int bottom = qMin( textRect.bottom(), pickRect().bottom() - margin ); textRect.moveBottomRight( QPoint( right, bottom ) ); int left = qMax( textRect.left(), pickRect().left() + margin ); int top = qMax( textRect.top(), pickRect().top() + margin ); textRect.moveTopLeft( QPoint( left, top ) ); return textRect; }
void QwtPicker::updateDisplay() { QWidget *w = parentWidget(); bool showRubberband = false; bool showTracker = false; if ( w && w->isVisible() && d_data->enabled ) { if ( rubberBand() != NoRubberBand && isActive() && rubberBandPen().style() != Qt::NoPen ) { showRubberband = true; } if ( trackerMode() == AlwaysOn || (trackerMode() == ActiveOnly && isActive() ) ) { if ( trackerPen() != Qt::NoPen ) showTracker = true; } } #if QT_VERSION < 0x040000 QGuardedPtr<PrivateData::PickerWidget> &rw = d_data->rubberBandWidget; #else QPointer<PrivateData::PickerWidget> &rw = d_data->rubberBandWidget; #endif if ( showRubberband ) { if ( rw.isNull() ) { rw = new PrivateData::PickerWidget( this, w, PrivateData::PickerWidget::RubberBand); rw->resize(w->size()); } rw->updateMask(); } else delete rw; #if QT_VERSION < 0x040000 QGuardedPtr<PrivateData::PickerWidget> &tw = d_data->textLabelWidget; #else QPointer<PrivateData::PickerWidget> &tw = d_data->textLabelWidget; #endif if ( showTracker ) { if ( tw.isNull() ) { tw = new PrivateData::PickerWidget( this, w, PrivateData::PickerWidget::Text); tw->resize(w->size()); } tw->updateMask(); } else delete tw; }
//! Update the state of rubberband and tracker label void QwtPicker::updateDisplay() { QWidget *w = parentWidget(); bool showRubberband = false; bool showTracker = false; if ( w && w->isVisible() && d_data->enabled ) { if ( rubberBand() != NoRubberBand && isActive() && rubberBandPen().style() != Qt::NoPen ) { showRubberband = true; } if ( trackerMode() == AlwaysOn || ( trackerMode() == ActiveOnly && isActive() ) ) { if ( trackerPen() != Qt::NoPen ) showTracker = true; } } QPointer<PickerWidget> &rw = d_data->rubberBandWidget; if ( showRubberband ) { if ( rw.isNull() ) { rw = new PickerWidget( this, w, PickerWidget::RubberBand ); rw->setObjectName( "PickerRubberBand" ); rw->resize( w->size() ); } rw->updateMask(); rw->update(); // Needed, when the mask doesn't change } else delete rw; QPointer<PickerWidget> &tw = d_data->trackerWidget; if ( showTracker ) { if ( tw.isNull() ) { tw = new PickerWidget( this, w, PickerWidget::Text ); tw->setObjectName( "PickerTracker" ); tw->resize( w->size() ); } tw->setFont( d_data->trackerFont ); tw->updateMask(); tw->update(); // Needed, when the mask doesn't change } else delete tw; }
/*! \brief Close a selection setting the state to inactive. The selection is validated and maybe fixed by QwtPicker::accept(). \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() */ bool QwtPicker::end(bool ok) { if ( d_data->isActive ) { setMouseTracking(false); d_data->isActive = false; if ( trackerMode() == ActiveOnly ) d_data->labelPosition = QPoint(-1, -1); if ( ok ) ok = accept(d_data->selection); if ( ok ) emit selected(d_data->selection); else d_data->selection.resize(0); updateDisplay(); } else ok = false; return ok; }
/*! \brief Close a selection setting the state to inactive. The selection is validated and maybe fixed by accept(). \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() */ bool QwtPicker::end( bool ok ) { if ( d_data->isActive ) { setMouseTracking( false ); d_data->isActive = false; Q_EMIT activated( false ); if ( trackerMode() == ActiveOnly ) d_data->trackerPosition = QPoint( -1, -1 ); if ( ok ) ok = accept( d_data->pickedPoints ); if ( ok ) Q_EMIT selected( d_data->pickedPoints ); else d_data->pickedPoints.resize( 0 ); updateDisplay(); } else ok = false; return ok; }
int QwtPicker::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QObject::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { switch (_id) { case 0: activated((*reinterpret_cast< bool(*)>(_a[1]))); break; case 1: selected((*reinterpret_cast< const QPolygon(*)>(_a[1]))); break; case 2: appended((*reinterpret_cast< const QPoint(*)>(_a[1]))); break; case 3: moved((*reinterpret_cast< const QPoint(*)>(_a[1]))); break; case 4: removed((*reinterpret_cast< const QPoint(*)>(_a[1]))); break; case 5: changed((*reinterpret_cast< const QPolygon(*)>(_a[1]))); break; case 6: setEnabled((*reinterpret_cast< bool(*)>(_a[1]))); break; default: ; } _id -= 7; } #ifndef QT_NO_PROPERTIES else if (_c == QMetaObject::ReadProperty) { void *_v = _a[0]; switch (_id) { case 0: *reinterpret_cast< bool*>(_v) = isEnabled(); break; case 1: *reinterpret_cast< ResizeMode*>(_v) = resizeMode(); break; case 2: *reinterpret_cast< DisplayMode*>(_v) = trackerMode(); break; case 3: *reinterpret_cast< QPen*>(_v) = trackerPen(); break; case 4: *reinterpret_cast< QFont*>(_v) = trackerFont(); break; case 5: *reinterpret_cast< RubberBand*>(_v) = rubberBand(); break; case 6: *reinterpret_cast< QPen*>(_v) = rubberBandPen(); break; } _id -= 7; } else if (_c == QMetaObject::WriteProperty) { void *_v = _a[0]; switch (_id) { case 0: setEnabled(*reinterpret_cast< bool*>(_v)); break; case 1: setResizeMode(*reinterpret_cast< ResizeMode*>(_v)); break; case 2: setTrackerMode(*reinterpret_cast< DisplayMode*>(_v)); break; case 3: setTrackerPen(*reinterpret_cast< QPen*>(_v)); break; case 4: setTrackerFont(*reinterpret_cast< QFont*>(_v)); break; case 5: setRubberBand(*reinterpret_cast< RubberBand*>(_v)); break; case 6: setRubberBandPen(*reinterpret_cast< QPen*>(_v)); break; } _id -= 7; } else if (_c == QMetaObject::ResetProperty) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyDesignable) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyScriptable) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyStored) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyEditable) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyUser) { _id -= 7; } #endif // QT_NO_PROPERTIES return _id; }
int QwtPicker::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QObject::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { if (_id < 4) qt_static_metacall(this, _c, _id, _a); _id -= 4; } #ifndef QT_NO_PROPERTIES else if (_c == QMetaObject::ReadProperty) { void *_v = _a[0]; switch (_id) { case 0: *reinterpret_cast< int*>(_v) = selectionFlags(); break; case 1: *reinterpret_cast< DisplayMode*>(_v) = trackerMode(); break; case 2: *reinterpret_cast< QFont*>(_v) = trackerFont(); break; case 3: *reinterpret_cast< RubberBand*>(_v) = rubberBand(); break; case 4: *reinterpret_cast< ResizeMode*>(_v) = resizeMode(); break; case 5: *reinterpret_cast< bool*>(_v) = isEnabled(); break; case 6: *reinterpret_cast< QPen*>(_v) = trackerPen(); break; case 7: *reinterpret_cast< QPen*>(_v) = rubberBandPen(); break; } _id -= 8; } else if (_c == QMetaObject::WriteProperty) { void *_v = _a[0]; switch (_id) { case 0: setSelectionFlags(*reinterpret_cast< int*>(_v)); break; case 1: setTrackerMode(*reinterpret_cast< DisplayMode*>(_v)); break; case 2: setTrackerFont(*reinterpret_cast< QFont*>(_v)); break; case 3: setRubberBand(*reinterpret_cast< RubberBand*>(_v)); break; case 4: setResizeMode(*reinterpret_cast< ResizeMode*>(_v)); break; case 5: setEnabled(*reinterpret_cast< bool*>(_v)); break; case 6: setTrackerPen(*reinterpret_cast< QPen*>(_v)); break; case 7: setRubberBandPen(*reinterpret_cast< QPen*>(_v)); break; } _id -= 8; } else if (_c == QMetaObject::ResetProperty) { _id -= 8; } else if (_c == QMetaObject::QueryPropertyDesignable) { _id -= 8; } else if (_c == QMetaObject::QueryPropertyScriptable) { _id -= 8; } else if (_c == QMetaObject::QueryPropertyStored) { _id -= 8; } else if (_c == QMetaObject::QueryPropertyEditable) { _id -= 8; } else if (_c == QMetaObject::QueryPropertyUser) { _id -= 8; } #endif // QT_NO_PROPERTIES return _id; }
/*! Open a selection setting the state to active \sa isActive, end(), append(), move() */ void QwtPicker::begin() { if ( d_data->isActive ) return; d_data->selection.resize(0); d_data->isActive = true; if ( trackerMode() != AlwaysOff ) { if ( d_data->labelPosition.x() < 0 || d_data->labelPosition.y() < 0 ) { QWidget *w = parentWidget(); if ( w ) d_data->labelPosition = w->mapFromGlobal(QCursor::pos()); } } updateDisplay(); setMouseTracking(true); }
//! Update the state of rubber band and tracker label void QwtPicker::updateDisplay() { QWidget *w = parentWidget(); bool showRubberband = false; bool showTracker = false; if ( w && w->isVisible() && d_data->enabled ) { if ( rubberBand() != NoRubberBand && isActive() && rubberBandPen().style() != Qt::NoPen ) { showRubberband = true; } if ( trackerMode() == AlwaysOn || ( trackerMode() == ActiveOnly && isActive() ) ) { if ( trackerPen() != Qt::NoPen && !trackerRect( QFont() ).isEmpty() ) { showTracker = true; } } } QPointer< QwtPickerRubberband > &rw = d_data->rubberBandOverlay; if ( showRubberband ) { if ( rw.isNull() ) { rw = new QwtPickerRubberband( this, NULL ); // NULL -> no extra event filter rw->setObjectName( "PickerRubberBand" ); rw->setParent( w ); rw->resize( w->size() ); } 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; } } QPointer< QwtPickerTracker > &tw = d_data->trackerOverlay; if ( showTracker ) { if ( tw.isNull() ) { tw = new QwtPickerTracker( this, NULL ); // NULL -> no extra event filter tw->setObjectName( "PickerTracker" ); tw->setParent( w ); 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; } } }