QgsRubberBand* QgsMapToolRotateLabel::createRotationPreviewBox() { delete mRotationPreviewBox; QVector< QgsPoint > boxPoints = mCurrentLabel.pos.cornerPoints; if ( boxPoints.size() < 1 ) { return nullptr; } mRotationPreviewBox = new QgsRubberBand( mCanvas, QgsWkbTypes::LineGeometry ); mRotationPreviewBox->setColor( QColor( 0, 0, 255, 65 ) ); mRotationPreviewBox->setWidth( 3 ); setRotationPreviewBox( mCurrentRotation - mStartRotation ); return mRotationPreviewBox; }
void QgsMapToolRotateLabel::canvasMoveEvent( QgsMapMouseEvent *e ) { if ( mLabelRubberBand ) { QgsPointXY currentPoint = toMapCoordinates( e->pos() ); double azimuth = convertAzimuth( mRotationPoint.azimuth( currentPoint ) ); double azimuthDiff = azimuth - mCurrentMouseAzimuth; azimuthDiff = azimuthDiff > 180 ? azimuthDiff - 360 : azimuthDiff; mCurrentRotation += azimuthDiff; if ( mCurrentRotation >= 360 || mCurrentRotation <= -360 ) mCurrentRotation = std::fmod( mCurrentRotation, 360.0 ); if ( mCurrentRotation < 0 ) mCurrentRotation += 360.0; mCurrentMouseAzimuth = std::fmod( azimuth, 360.0 ); //if shift-modifier is pressed, round to 15 degrees int displayValue; if ( e->modifiers() & Qt::ControlModifier ) { displayValue = roundTo15Degrees( mCurrentRotation ); mCtrlPressed = true; } else { displayValue = ( int )( mCurrentRotation ); mCtrlPressed = false; } if ( mRotationItem ) { mRotationItem->setSymbolRotation( displayValue ); setRotationPreviewBox( displayValue - mStartRotation ); mRotationItem->update(); } } }
void QgsMapToolRotateLabel::canvasMoveEvent( QgsMapMouseEvent* e ) { if ( mLabelRubberBand ) { QgsPoint currentPoint = toMapCoordinates( e->pos() ); double azimuth = azimuthToCCW( mRotationPoint.azimuth( currentPoint ) ); double azimuthDiff = azimuth - mCurrentMouseAzimuth; azimuthDiff = azimuthDiff > 180 ? azimuthDiff - 360 : azimuthDiff; mCurrentRotation += azimuthDiff; mCurrentRotation = mCurrentRotation - static_cast<float>( static_cast<int>( mCurrentRotation / 360 ) ) * 360; //mCurrentRotation % 360; mCurrentRotation = mCurrentRotation < 0 ? 360 - mCurrentRotation : mCurrentRotation; mCurrentMouseAzimuth = azimuth - static_cast<float>( static_cast<int>( azimuth / 360 ) ) * 360; //if shift-modifier is pressed, round to 15 degrees int displayValue; if ( e->modifiers() & Qt::ControlModifier ) { displayValue = roundTo15Degrees( mCurrentRotation ); mCtrlPressed = true; } else { displayValue = ( int )( mCurrentRotation ); mCtrlPressed = false; } if ( mRotationItem ) { mRotationItem->setSymbolRotation( displayValue ); setRotationPreviewBox( displayValue - mStartRotation ); mRotationItem->update(); } } }