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->labelsEnabled() && vl->labeling()->requiresAdvancedEffects() ) { 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; }