bool QgsMapRendererJob::prepareLabelCache() const { bool canCache = mCache; // calculate which layers will be labeled QSet< QgsMapLayer* > labeledLayers; Q_FOREACH ( const QgsMapLayer* ml, mSettings.layers() ) { QgsVectorLayer* vl = const_cast< QgsVectorLayer* >( qobject_cast<const QgsVectorLayer *>( ml ) ); if ( vl && QgsPalLabeling::staticWillUseLayer( vl ) ) labeledLayers << vl; if ( vl && vl->labeling() && vl->labeling()->requiresAdvancedEffects( vl ) ) { canCache = false; break; } } if ( mCache && mCache->hasCacheImage( LABEL_CACHE_ID ) ) { // we may need to clear label cache and re-register labeled features - check for that here // can we reuse the cached label solution? bool canUseCache = canCache && mCache->dependentLayers( LABEL_CACHE_ID ).toSet() == labeledLayers; if ( !canUseCache ) { // no - participating layers have changed mCache->clearCacheImage( LABEL_CACHE_ID ); } } return canCache; }
bool QgsMapToolLabel::createAuxiliaryFields( LabelDetails &details, QgsPalIndexes &indexes ) const { bool newAuxiliaryLayer = false; QgsVectorLayer *vlayer = details.layer; QString providerId = details.pos.providerID; if ( !vlayer || !vlayer->labelsEnabled() ) return false; if ( !vlayer->auxiliaryLayer() ) { QgsNewAuxiliaryLayerDialog dlg( vlayer ); dlg.exec(); newAuxiliaryLayer = true; } if ( !vlayer->auxiliaryLayer() ) return false; for ( const QgsPalLayerSettings::Property &p : qgis::as_const( mPalProperties ) ) { int index = -1; // always use the default activated property QgsProperty prop = details.settings.dataDefinedProperties().property( p ); if ( prop.propertyType() == QgsProperty::FieldBasedProperty && prop.isActive() ) { index = vlayer->fields().lookupField( prop.field() ); } else { index = QgsAuxiliaryLayer::createProperty( p, vlayer ); } indexes[p] = index; } details.settings = vlayer->labeling()->settings( providerId ); return newAuxiliaryLayer; }
void QgsLabelPropertyDialog::init( const QString& layerId, const QString& providerId, int featureId, const QString& labelText ) { //get feature attributes QgsVectorLayer* vlayer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) ); if ( !vlayer ) { return; } if ( !vlayer->labeling() ) { return; } if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( mCurLabelFeat ) ) { return; } QgsAttributes attributeValues = mCurLabelFeat.attributes(); //get layerproperties. Problem: only for pallabeling... blockElementSignals( true ); QgsPalLayerSettings layerSettings = vlayer->labeling()->settings( vlayer, providerId ); //get label field and fill line edit if ( layerSettings.isExpression && !labelText.isNull() ) { mLabelTextLineEdit->setText( labelText ); mLabelTextLineEdit->setEnabled( false ); mLabelTextLabel->setText( tr( "Expression result" ) ); } else { QString labelFieldName = vlayer->customProperty( "labeling/fieldName" ).toString(); if ( !labelFieldName.isEmpty() ) { mCurLabelField = vlayer->fieldNameIndex( labelFieldName ); if ( mCurLabelField >= 0 ) { mLabelTextLineEdit->setText( attributeValues.at( mCurLabelField ).toString() ); const QgsFields& layerFields = vlayer->fields(); switch ( layerFields.at( mCurLabelField ).type() ) { case QVariant::Double: mLabelTextLineEdit->setValidator( new QDoubleValidator( this ) ); break; case QVariant::Int: case QVariant::UInt: case QVariant::LongLong: mLabelTextLineEdit->setValidator( new QIntValidator( this ) ); break; default: break; } } else { mLabelTextLineEdit->setEnabled( false ); } } } //get attributes of the feature and fill data defined values // font is set directly from QgsLabelPosition updateFont( mLabelFont, false ); //set all the gui elements to the default layer-level values mLabelDistanceSpinBox->clear(); mLabelDistanceSpinBox->setSpecialValueText( tr( "Layer default (%1)" ).arg( QString::number( layerSettings.dist, 'f', mLabelDistanceSpinBox->decimals() ) ) ); mBufferSizeSpinBox->clear(); mBufferSizeSpinBox->setSpecialValueText( tr( "Layer default (%1)" ).arg( QString::number( layerSettings.bufferSize, 'f', mBufferSizeSpinBox->decimals() ) ) ); mRotationSpinBox->clear(); mXCoordSpinBox->clear(); mYCoordSpinBox->clear(); mShowLabelChkbx->setChecked( true ); mFontColorButton->setColor( layerSettings.textColor ); mBufferColorButton->setColor( layerSettings.bufferColor ); mMinScaleSpinBox->setValue( layerSettings.scaleMin ); mMaxScaleSpinBox->setValue( layerSettings.scaleMax ); mHaliComboBox->setCurrentIndex( mHaliComboBox->findData( "Left" ) ); mValiComboBox->setCurrentIndex( mValiComboBox->findData( "Bottom" ) ); mFontColorButton->setColorDialogTitle( tr( "Font color" ) ); mBufferColorButton->setColorDialogTitle( tr( "Buffer color" ) ); disableGuiElements(); QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator it = layerSettings.dataDefinedProperties.constBegin(); for ( ; it != layerSettings.dataDefinedProperties.constEnd(); ++it ) { mDataDefinedProperties.insert( it.key(), it.value() ? new QgsDataDefined( *it.value() ) : nullptr ); } //set widget values from data defined results setDataDefinedValues( layerSettings, vlayer ); //enable widgets connected to data defined fields enableDataDefinedWidgets( vlayer ); blockElementSignals( false ); }
void QgsLabelPropertyDialog::init( const QString &layerId, const QString &providerId, int featureId, const QString &labelText ) { //get feature attributes QgsVectorLayer *vlayer = QgsProject::instance()->mapLayer<QgsVectorLayer *>( layerId ); if ( !vlayer ) { return; } if ( !vlayer->labeling() ) { return; } if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( mCurLabelFeat ) ) { return; } QgsAttributes attributeValues = mCurLabelFeat.attributes(); //get layerproperties. Problem: only for pallabeling... blockElementSignals( true ); QgsPalLayerSettings layerSettings = vlayer->labeling()->settings( providerId ); //get label field and fill line edit if ( layerSettings.isExpression && !labelText.isNull() ) { mLabelTextLineEdit->setText( labelText ); mLabelTextLineEdit->setEnabled( false ); mLabelTextLabel->setText( tr( "Expression result" ) ); } else { QString labelFieldName = layerSettings.fieldName; if ( !labelFieldName.isEmpty() ) { mCurLabelField = vlayer->fields().lookupField( labelFieldName ); if ( mCurLabelField >= 0 ) { mLabelTextLineEdit->setText( attributeValues.at( mCurLabelField ).toString() ); if ( vlayer->isEditable() ) mLabelTextLineEdit->setEnabled( true ); else mLabelTextLineEdit->setEnabled( false ); const QgsFields &layerFields = vlayer->fields(); switch ( layerFields.at( mCurLabelField ).type() ) { case QVariant::Double: mLabelTextLineEdit->setValidator( new QDoubleValidator( this ) ); break; case QVariant::Int: case QVariant::UInt: case QVariant::LongLong: mLabelTextLineEdit->setValidator( new QIntValidator( this ) ); break; default: break; } } else { mLabelTextLineEdit->setEnabled( false ); } } } //get attributes of the feature and fill data defined values // font is set directly from QgsLabelPosition updateFont( mLabelFont, false ); QgsTextFormat format = layerSettings.format(); QgsTextBufferSettings buffer = format.buffer(); //set all the gui elements to the default layer-level values mLabelDistanceSpinBox->clear(); mLabelDistanceSpinBox->setSpecialValueText( tr( "Layer default (%1)" ).arg( QString::number( layerSettings.dist, 'f', mLabelDistanceSpinBox->decimals() ) ) ); mBufferSizeSpinBox->clear(); mBufferSizeSpinBox->setSpecialValueText( tr( "Layer default (%1)" ).arg( QString::number( buffer.size(), 'f', mBufferSizeSpinBox->decimals() ) ) ); mRotationSpinBox->clear(); mXCoordSpinBox->clear(); mYCoordSpinBox->clear(); mShowLabelChkbx->setChecked( true ); mFontColorButton->setColor( format.color() ); mBufferColorButton->setColor( buffer.color() ); mMinScaleWidget->setScale( layerSettings.minimumScale ); mMaxScaleWidget->setScale( layerSettings.maximumScale ); mHaliComboBox->setCurrentIndex( mHaliComboBox->findData( "Left" ) ); mValiComboBox->setCurrentIndex( mValiComboBox->findData( "Bottom" ) ); mFontColorButton->setColorDialogTitle( tr( "Font Color" ) ); mBufferColorButton->setColorDialogTitle( tr( "Buffer Color" ) ); disableGuiElements(); mDataDefinedProperties = layerSettings.dataDefinedProperties(); //set widget values from data defined results setDataDefinedValues( vlayer ); //enable widgets connected to data defined fields enableDataDefinedWidgets( vlayer ); blockElementSignals( false ); }