bool QgsMapToolLabel::layerIsRotatable( QgsVectorLayer *vlayer, int &rotationCol ) const { if ( !vlayer || !vlayer->isEditable() || !vlayer->labelsEnabled() ) { return false; } Q_FOREACH ( const QString &providerId, vlayer->labeling()->subProviders() ) { if ( labelIsRotatable( vlayer, vlayer->labeling()->settings( providerId ), rotationCol ) ) return true; } return false; }
void QgsMapToolRotateLabel::canvasReleaseEvent( QgsMapMouseEvent* e ) { Q_UNUSED( e ); if ( !mLabelRubberBand ) //no rubber band created (most likely because the current label cannot be rotated ) { return; } deleteRubberBands(); delete mRotationItem; mRotationItem = nullptr; delete mRotationPreviewBox; mRotationPreviewBox = nullptr; QgsVectorLayer* vlayer = mCurrentLabel.layer; if ( !vlayer ) { return; } int rotationCol; if ( !labelIsRotatable( vlayer, mCurrentLabel.settings, rotationCol ) ) { return; } double rotation = mCtrlPressed ? roundTo15Degrees( mCurrentRotation ) : mCurrentRotation; if ( rotation == mStartRotation ) //mouse button pressed / released, but no rotation { return; } vlayer->beginEditCommand( tr( "Rotated label" ) + QString( " '%1'" ).arg( currentLabelText( 24 ) ) ); vlayer->changeAttributeValue( mCurrentLabel.pos.featureId, rotationCol, rotation ); vlayer->endEditCommand(); vlayer->triggerRepaint(); }
bool QgsMapToolLabel::currentLabelDataDefinedRotation( double &rotation, bool &rotationSuccess, int &rCol, bool ignoreXY ) const { QgsVectorLayer *vlayer = mCurrentLabel.layer; QgsFeatureId featureId = mCurrentLabel.pos.featureId; rotationSuccess = false; if ( !vlayer ) { return false; } if ( !labelIsRotatable( vlayer, mCurrentLabel.settings, rCol ) ) { return false; } QgsFeature f; if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) ) { return false; } //test, if data defined x- and y- values are not null. Otherwise, the position is determined by PAL and the rotation cannot be fixed if ( !ignoreXY ) { int xCol, yCol; double x, y; bool xSuccess, ySuccess; if ( !currentLabelDataDefinedPosition( x, xSuccess, y, ySuccess, xCol, yCol ) || !xSuccess || !ySuccess ) { return false; } } rotation = f.attribute( rCol ).toDouble( &rotationSuccess ); return true; }