44   mRules->rootRule()->registerFeature( feature, context, 
mSubProviders, obstacleGeometry, symbol );
    49   QList<QgsAbstractLabelProvider *> lst;
    60   , mMaximumScale( scaleMinDenom )
    61   , mMinimumScale( scaleMaxDenom )
    62   , mFilterExp( filterExp )
    63   , mDescription( description )
    64   , mElseRule( elseRule )
    72   qDeleteAll( mChildren );
    81   mSettings.reset( settings );
    87   for ( 
Rule *
c : mChildren )
    90     l += 
c->descendants();
    95 void QgsRuleBasedLabeling::Rule::initFilter()
    97   if ( mElseRule || mFilterExp.compare( QLatin1String( 
"ELSE" ), Qt::CaseInsensitive ) == 0 )
   100     mFilter.reset( 
nullptr );
   102   else if ( !mFilterExp.isEmpty() )
   108     mFilter.reset( 
nullptr );
   112 void QgsRuleBasedLabeling::Rule::updateElseRules()
   115   for ( 
Rule *rule : qgis::as_const( mChildren ) )
   117     if ( rule->isElse() )
   124   if ( mSettings && mSettings->format().containsAdvancedEffects() )
   127   for ( 
Rule *rule : qgis::as_const( mChildren ) )
   129     if ( rule->requiresAdvancedEffects() )
   149   if ( !mChildren.empty() )
   151     for ( 
const Rule *rule : mChildren )
   153       if ( !rule->accept( visitor ) )
   166   for ( 
const Rule *rule : qgis::as_const( mChildren ) )
   168     if ( rule->settings() )
   169       list << rule->ruleKey();
   171     rule->subProviderIds( list );
   178   mChildren.append( rule );
   179   rule->mParent = 
this;
   185   mChildren.insert( i, rule );
   186   rule->mParent = 
this;
   192   delete mChildren.at( i );
   193   mChildren.removeAt( i );
   201   if ( key == mRuleKey )
   204   for ( 
Rule *rule : mChildren )
   215   if ( key == mRuleKey )
   218   for ( 
Rule *rule : qgis::as_const( mChildren ) )
   230   Rule *newrule = 
new Rule( s, mMaximumScale, mMinimumScale, mFilterExp, mDescription );
   233   for ( 
Rule *rule : mChildren )
   241   QDomElement settingsElem = ruleElem.firstChildElement( QStringLiteral( 
"settings" ) );
   242   if ( !settingsElem.isNull() )
   245     settings->
readXml( settingsElem, context );
   248   QString filterExp = ruleElem.attribute( QStringLiteral( 
"filter" ) );
   249   QString 
description = ruleElem.attribute( QStringLiteral( 
"description" ) );
   250   int scaleMinDenom = ruleElem.attribute( QStringLiteral( 
"scalemindenom" ), QStringLiteral( 
"0" ) ).toInt();
   251   int scaleMaxDenom = ruleElem.attribute( QStringLiteral( 
"scalemaxdenom" ), QStringLiteral( 
"0" ) ).toInt();
   252   QString 
ruleKey = ruleElem.attribute( QStringLiteral( 
"key" ) );
   253   Rule *rule = 
new Rule( settings, scaleMinDenom, scaleMaxDenom, filterExp, description );
   255   if ( !ruleKey.isEmpty() )
   256     rule->mRuleKey = ruleKey;
   258   rule->
setActive( ruleElem.attribute( QStringLiteral( 
"active" ), QStringLiteral( 
"1" ) ).toInt() );
   260   QDomElement childRuleElem = ruleElem.firstChildElement( QStringLiteral( 
"rule" ) );
   261   while ( !childRuleElem.isNull() )
   263     Rule *childRule = 
create( childRuleElem, context );
   272     childRuleElem = childRuleElem.nextSiblingElement( QStringLiteral( 
"rule" ) );
   280   QDomElement ruleElem = doc.createElement( QStringLiteral( 
"rule" ) );
   284     ruleElem.appendChild( mSettings->writeXml( doc, context ) );
   286   if ( !mFilterExp.isEmpty() )
   287     ruleElem.setAttribute( QStringLiteral( 
"filter" ), mFilterExp );
   289     ruleElem.setAttribute( QStringLiteral( 
"scalemindenom" ), mMaximumScale );
   291     ruleElem.setAttribute( QStringLiteral( 
"scalemaxdenom" ), mMinimumScale );
   292   if ( !mDescription.isEmpty() )
   293     ruleElem.setAttribute( QStringLiteral( 
"description" ), mDescription );
   295     ruleElem.setAttribute( QStringLiteral( 
"active" ), 0 );
   296   ruleElem.setAttribute( QStringLiteral( 
"key" ), mRuleKey );
   298   for ( RuleList::const_iterator it = mChildren.constBegin(); it != mChildren.constEnd(); ++it )
   312     delete subProviders.value( 
this, 
nullptr );
   313     subProviders[
this] = p;
   317   for ( 
Rule *rule : qgis::as_const( mChildren ) )
   319     rule->createSubProviders( layer, subProviders, provider );
   328     if ( !p->
prepare( context, attributeNames ) )
   330       subProviders.remove( 
this );
   337     attributeNames.unite( mFilter->referencedColumns() );
   342   for ( 
Rule *rule : qgis::as_const( mChildren ) )
   344     rule->prepare( context, attributeNames, subProviders );
   350   if ( !isFilterOK( feature, context )
   356   bool registered = 
false;
   359   if ( subProviders.contains( 
this ) && mIsActive )
   361     subProviders[
this]->registerFeature( feature, context, obstacleGeometry, symbol );
   365   bool willRegisterSomething = 
false;
   368   for ( 
Rule *rule : qgis::as_const( mChildren ) )
   371     if ( !rule->isElse() )
   373       RegisterResult res = rule->registerFeature( feature, context, subProviders, obstacleGeometry );
   376       registered |= willRegisterSomething;
   381   if ( !willRegisterSomething )
   383     for ( 
Rule *rule : qgis::as_const( mElseRules ) )
   385       registered |= rule->registerFeature( feature, context, subProviders, obstacleGeometry, symbol ) != 
Filtered;
   391   else if ( registered )
   399   if ( ! mFilter || mElseRule )
   407 bool QgsRuleBasedLabeling::Rule::isScaleOK( 
double scale )
 const   413   if ( !
qgsDoubleNear( mMaximumScale, 0.0 ) && mMaximumScale > scale )
   415   if ( !
qgsDoubleNear( mMinimumScale, 0.0 ) && mMinimumScale < scale )
   436   Q_ASSERT( origDescendants.count() == clonedDescendants.count() );
   437   for ( 
int i = 0; i < origDescendants.count(); ++i )
   438     clonedDescendants[i]->setRuleKey( origDescendants[i]->ruleKey() );
   460   QDomElement rulesElem = element.firstChildElement( QStringLiteral( 
"rules" ) );
   472   return QStringLiteral( 
"rule-based" );
   477   QDomElement elem = doc.createElement( QStringLiteral( 
"labeling" ) );
   478   elem.setAttribute( QStringLiteral( 
"type" ), QStringLiteral( 
"rule-based" ) );
   480   QDomElement rulesElem = 
mRootRule->save( doc, context );
   481   rulesElem.setTagName( QStringLiteral( 
"rules" ) ); 
   482   elem.appendChild( rulesElem );
   515   return mRootRule->requiresAdvancedEffects();
   536   for ( 
Rule *rule : rules )
   542       QDomDocument doc = parent.ownerDocument();
   544       QDomElement ruleElement = doc.createElement( QStringLiteral( 
"se:Rule" ) );
   545       parent.appendChild( ruleElement );
   547       if ( !rule->filterExpression().isEmpty() )
 static void mergeScaleDependencies(double mScaleMinDenom, double mScaleMaxDenom, QgsStringMap &props)
Merges the local scale limits, if any, with the ones already in the map, if any. 
 
Class for parsing and evaluation of expressions (formerly called "search strings"). 
 
The class is used as a container of context for various read/write operations on other objects...
 
QgsVectorLayerLabelProvider(QgsVectorLayer *layer, const QString &providerId, bool withFeatureLoop, const QgsPalLayerSettings *settings, const QString &layerName=QString())
Convenience constructor to initialize the provider from given vector layer. 
 
bool requiresAdvancedEffects() const
Returns true if this rule or any of its children requires advanced composition effects to render...
 
QgsPalLayerSettings * settings() const
Returns the labeling settings. 
 
Something was registered. 
 
double rendererScale() const
Returns the renderer map scale. 
 
QgsVectorLayerLabelProvider * provider(QgsVectorLayer *layer) const override
 
double maximumScale
The maximum map scale (i.e. 
 
~QgsRuleBasedLabeling() override
 
void setSettings(QgsPalLayerSettings *settings, const QString &providerId=QString()) override
Set pal settings for a specific provider (takes ownership). 
 
QgsRuleBasedLabeling::RuleToProviderMap mSubProviders
label providers are owned by labeling engine 
 
static bool createFunctionElement(QDomDocument &doc, QDomElement &element, const QString &function)
 
void prepare(QgsRenderContext &context, QSet< QString > &attributeNames, RuleToProviderMap &subProviders)
call prepare() on sub-providers and populate attributeNames 
 
bool requiresAdvancedEffects() const override
Returns true if drawing labels requires advanced effects like composition modes, which could prevent ...
 
Abstract base class for all rendered symbols. 
 
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) const override
Returns labeling configuration as XML element. 
 
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) const
store labeling info to XML element 
 
virtual bool prepare(QgsRenderContext &context, QSet< QString > &attributeNames)
Prepare for registration of features. 
 
const QgsLabelingEngine * mEngine
Associated labeling engine. 
 
static void applyScaleDependency(QDomDocument &doc, QDomElement &ruleElem, QgsStringMap &props)
Checks if the properties contain scaleMinDenom and scaleMaxDenom, if available, they are added into t...
 
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context. 
 
void insertChild(int i, QgsRuleBasedLabeling::Rule *rule)
add child rule, take ownership, sets this as parent 
 
RegisterResult
The result of registering a rule. 
 
QgsRuleBasedLabeling::Rule * clone() const
clone this rule, return new instance 
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference) 
 
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified symbology visitor, causing it to visit all symbols associated with the labeling...
 
QString description() const
A human readable description for this rule. 
 
The QgsVectorLayerLabelProvider class implements a label provider for vector layers. 
 
A geometry is the spatial representation of a feature. 
 
bool drawLabels
Whether to draw labels for this layer. 
 
QList< QgsAbstractLabelProvider * > subProviders() override
Returns subproviders. 
 
QString ruleKey() const
Unique rule identifier (for identification of rule within labeling, used as provider ID) ...
 
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
 
QMap< QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider * > RuleToProviderMap
 
An interface for classes which can visit style entity (e.g. 
 
void registerFeature(const QgsFeature &feature, QgsRenderContext &context, const QgsGeometry &obstacleGeometry=QgsGeometry(), const QgsSymbol *symbol=nullptr) override
Register a feature for labeling as one or more QgsLabelFeature objects stored into mLabels...
 
QMap< QString, QString > QgsStringMap
 
QgsRuleBasedLabeling::RuleList descendants() const
Returns all children, grand-children, grand-grand-children, grand-gra... 
 
QList< QgsRuleBasedLabeling::Rule * > RuleList
 
virtual bool visit(const QgsStyleEntityVisitorInterface::StyleLeaf &entity)
Called when the visitor will visit a style entity. 
 
RegisterResult registerFeature(const QgsFeature &feature, QgsRenderContext &context, RuleToProviderMap &subProviders, const QgsGeometry &obstacleGeometry=QgsGeometry(), const QgsSymbol *symbol=nullptr)
register individual features 
 
static QgsRuleBasedLabeling::Rule * create(const QDomElement &ruleElem, const QgsReadWriteContext &context)
Create a rule from an XML definition. 
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
 
QgsMapLayer * layer() const
Returns the associated layer, or nullptr if no layer is associated with the provider. 
 
QString type() const override
Unique type string of the labeling configuration implementation. 
 
void appendChild(QgsRuleBasedLabeling::Rule *rule)
add child rule, take ownership, sets this as parent 
 
QStringList subProviders() const override
Gets list of sub-providers within the layer's labeling. 
 
std::unique_ptr< QgsRuleBasedLabeling > mRules
owned copy 
 
virtual bool visitExit(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor stops visiting a node. 
 
std::unique_ptr< Rule > mRootRule
 
virtual QgsVectorLayerLabelProvider * createProvider(QgsVectorLayer *layer, const QString &providerId, bool withFeatureLoop, const QgsPalLayerSettings *settings)
create a label provider 
 
void setSettings(QgsPalLayerSettings *settings)
Sets new settings (or nullptr). Deletes old settings if any. 
 
QgsPalLayerSettings mSettings
Layer's labeling configuration. 
 
const QgsPalLayerSettings & settings() const
Returns the layer's settings. 
 
Contains information relating to a node (i.e. 
 
QgsRuleBasedLabeling(QgsRuleBasedLabeling::Rule *root)
Constructs the labeling from given tree of rules (takes ownership) 
 
const QgsRuleBasedLabeling::Rule * findRuleByKey(const QString &key) const
Try to find a rule given its unique key. 
 
bool prepare(QgsRenderContext &context, QSet< QString > &attributeNames) override
Prepare for registration of features. 
 
void setActive(bool state)
Sets if this rule is active. 
 
bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified symbology visitor, causing it to visit all child rules associated with the rule...
 
QgsExpressionContext & expressionContext()
Gets the expression context. 
 
Rule based symbology or label child rule. 
 
static QgsRuleBasedLabeling * create(const QDomElement &element, const QgsReadWriteContext &context)
Create the instance from a DOM element with saved configuration. 
 
QgsRuleBasedLabeling * clone() const override
Returns a new copy of the object. 
 
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element. 
 
void setRuleKey(const QString &key)
Override the assigned rule key (should be used just internally by rule-based labeling) ...
 
QgsPalLayerSettings settings(const QString &providerId=QString()) const override
Gets associated label settings. 
 
void subProviderIds(QStringList &list) const
append rule keys of descendants that contain valid settings (i.e. 
 
Contains information about the context of a rendering operation. 
 
bool scaleVisibility
Set to true to limit label visibility to a range of scales. 
 
virtual bool visitEnter(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor starts visiting a node. 
 
Rule(QgsPalLayerSettings *settings, double maximumScale=0, double minimumScale=0, const QString &filterExp=QString(), const QString &description=QString(), bool elseRule=false)
takes ownership of settings, settings may be nullptr 
 
A label settings entity for QgsStyle databases. 
 
virtual void writeTextSymbolizer(QDomNode &parent, QgsPalLayerSettings &settings, const QgsStringMap &props) const
Writes a TextSymbolizer element contents based on the provided labeling settings. ...
 
QString providerId() const
Returns provider ID - useful in case there is more than one label provider within a layer (e...
 
void toSld(QDomNode &parent, const QgsStringMap &props) const override
Writes the SE 1.1 TextSymbolizer element based on the current layer labeling settings. 
 
void removeChildAt(int i)
delete child rule 
 
QgsRuleBasedLabeling::Rule * rootRule()
 
Represents a vector layer which manages a vector based data sets. 
 
void createSubProviders(QgsVectorLayer *layer, RuleToProviderMap &subProviders, QgsRuleBasedLabelProvider *provider)
add providers 
 
QgsRuleBasedLabelProvider(const QgsRuleBasedLabeling &rules, QgsVectorLayer *layer, bool withFeatureLoop=true)
 
Contains information relating to the style entity currently being visited. 
 
double minimumScale
The minimum map scale (i.e.