Skip to content

Commit

Permalink
Use vector to keep provider order
Browse files Browse the repository at this point in the history
  • Loading branch information
Patrik Sylve committed Jan 31, 2025
1 parent b6617a4 commit 09aabff
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Rule based labeling for a vector layer.
%End
public:
typedef QList<QgsRuleBasedLabeling::Rule *> RuleList;
typedef QMap<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *> RuleToProviderMap;
typedef std::vector<std::pair<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *>> RuleToProviderMap;

class Rule
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Rule based labeling for a vector layer.
%End
public:
typedef QList<QgsRuleBasedLabeling::Rule *> RuleList;
typedef QMap<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *> RuleToProviderMap;
typedef std::vector<std::pair<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *>> RuleToProviderMap;

class Rule
{
Expand Down
54 changes: 42 additions & 12 deletions src/core/labeling/qgsrulebasedlabeling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@ QgsVectorLayerLabelProvider *QgsRuleBasedLabelProvider::createProvider( QgsVecto

bool QgsRuleBasedLabelProvider::prepare( QgsRenderContext &context, QSet<QString> &attributeNames )
{
for ( QgsVectorLayerLabelProvider *provider : std::as_const( mSubProviders ) )
provider->setEngine( mEngine );
for ( const auto &subprovider : std::as_const( mSubProviders ) )
{
subprovider.second->setEngine( mEngine );
}

// populate sub-providers
mRules->rootRule()->prepare( context, attributeNames, mSubProviders );
Expand All @@ -48,8 +50,10 @@ QList<QgsLabelFeature *> QgsRuleBasedLabelProvider::registerFeature( const QgsFe
QList<QgsAbstractLabelProvider *> QgsRuleBasedLabelProvider::subProviders()
{
QList<QgsAbstractLabelProvider *> lst;
for ( QgsVectorLayerLabelProvider *subprovider : std::as_const( mSubProviders ) )
lst << subprovider;
for ( const auto &subprovider : std::as_const( mSubProviders ) )
{
lst << subprovider.second;
}
return lst;
}

Expand Down Expand Up @@ -318,8 +322,19 @@ void QgsRuleBasedLabeling::Rule::createSubProviders( QgsVectorLayer *layer, QgsR
{
// add provider!
QgsVectorLayerLabelProvider *p = provider->createProvider( layer, mRuleKey, false, mSettings.get() );
delete subProviders.value( this, nullptr );
subProviders[this] = p;
auto it = std::find_if( subProviders.begin(), subProviders.end(),
[this]( const std::pair<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *> &item )
{
return item.first == this;
} );

if ( it != subProviders.end() )
{
delete it->second;
subProviders.erase( it );
}

subProviders.push_back( {this, p} );
}

// call recursively
Expand All @@ -333,11 +348,20 @@ void QgsRuleBasedLabeling::Rule::prepare( QgsRenderContext &context, QSet<QStrin
{
if ( mSettings )
{
QgsVectorLayerLabelProvider *p = subProviders[this];
if ( !p->prepare( context, attributeNames ) )
auto it = std::find_if( subProviders.begin(), subProviders.end(),
[this]( const std::pair<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *> &item )
{
return item.first == this;
} );

if ( it != subProviders.end() )
{
subProviders.remove( this );
delete p;
QgsVectorLayerLabelProvider *p = it->second;
if ( !p->prepare( context, attributeNames ) )
{
subProviders.erase( it );
delete p;
}
}
}

Expand Down Expand Up @@ -366,9 +390,15 @@ std::tuple< QgsRuleBasedLabeling::Rule::RegisterResult, QList< QgsLabelFeature *
bool registered = false;

// do we have active subprovider for the rule?
if ( subProviders.contains( this ) && mIsActive )
auto it = std::find_if( subProviders.begin(), subProviders.end(),
[this]( const std::pair<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *> &item )
{
return item.first == this;
} );

if ( it != subProviders.end() && mIsActive )
{
labels.append( subProviders[this]->registerFeature( feature, context, obstacleGeometry, symbol ) );
labels.append( it->second->registerFeature( feature, context, obstacleGeometry, symbol ) );
registered = true;
}

Expand Down
4 changes: 2 additions & 2 deletions src/core/labeling/qgsrulebasedlabeling.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class CORE_EXPORT QgsRuleBasedLabeling : public QgsAbstractVectorLayerLabeling
public:
class Rule;
typedef QList<QgsRuleBasedLabeling::Rule *> RuleList;
typedef QMap<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *> RuleToProviderMap;
typedef std::vector<std::pair<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *>> RuleToProviderMap;

/**
* \ingroup core
Expand Down Expand Up @@ -425,7 +425,7 @@ class CORE_EXPORT QgsRuleBasedLabelProvider : public QgsVectorLayerLabelProvider
//! owned copy
std::unique_ptr<QgsRuleBasedLabeling> mRules;
//! label providers are owned by labeling engine
QgsRuleBasedLabeling::RuleToProviderMap mSubProviders;
std::vector<std::pair<QgsRuleBasedLabeling::Rule *, QgsVectorLayerLabelProvider *>> mSubProviders;
};

#endif
Expand Down

0 comments on commit 09aabff

Please sign in to comment.