Skip to content

Commit 615745f

Browse files
committed
Use weak layer pointers in labeling engine instead of layer ids
1 parent 6c928ef commit 615745f

7 files changed

+26
-77
lines changed

src/core/qgslabelingengine.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "pal.h"
2626
#include "problem.h"
2727
#include "qgsrendercontext.h"
28+
#include "qgsmaplayer.h"
2829

2930

3031
// helper function for checking for job cancelation within PAL
@@ -88,20 +89,20 @@ QgsLabelingEngine::~QgsLabelingEngine()
8889
qDeleteAll( mSubProviders );
8990
}
9091

91-
QStringList QgsLabelingEngine::participatingLayerIds() const
92+
QList< QgsMapLayer* > QgsLabelingEngine::participatingLayers() const
9293
{
93-
QSet< QString > ids;
94+
QSet< QgsMapLayer* > layers;
9495
Q_FOREACH ( QgsAbstractLabelProvider* provider, mProviders )
9596
{
96-
if ( !provider->layerId().isEmpty() )
97-
ids << provider->layerId();
97+
if ( provider->layer() )
98+
layers << provider->layer();
9899
}
99100
Q_FOREACH ( QgsAbstractLabelProvider* provider, mSubProviders )
100101
{
101-
if ( !provider->layerId().isEmpty() )
102-
ids << provider->layerId();
102+
if ( provider->layer() )
103+
layers << provider->layer();
103104
}
104-
return ids.toList();
105+
return layers.toList();
105106
}
106107

107108
void QgsLabelingEngine::addProvider( QgsAbstractLabelProvider* provider )
@@ -230,7 +231,7 @@ void QgsLabelingEngine::run( QgsRenderContext& context )
230231
Q_FOREACH ( QgsAbstractLabelProvider* provider, mProviders )
231232
{
232233
bool appendedLayerScope = false;
233-
if ( QgsMapLayer* ml = QgsProject::instance()->mapLayer( provider->layerId() ) )
234+
if ( QgsMapLayer* ml = provider->layer() )
234235
{
235236
appendedLayerScope = true;
236237
context.expressionContext().appendScope( QgsExpressionContextUtils::layerScope( ml ) );
@@ -415,9 +416,10 @@ QgsAbstractLabelProvider*QgsLabelFeature::provider() const
415416

416417
}
417418

418-
QgsAbstractLabelProvider::QgsAbstractLabelProvider( const QString& layerId, const QString& providerId )
419+
QgsAbstractLabelProvider::QgsAbstractLabelProvider( QgsMapLayer* layer, const QString& providerId )
419420
: mEngine( nullptr )
420-
, mLayerId( layerId )
421+
, mLayerId( layer ? layer->id() : QString() )
422+
, mLayer( layer )
421423
, mProviderId( providerId )
422424
, mFlags( DrawLabels )
423425
, mPlacement( QgsPalLayerSettings::AroundPoint )

src/core/qgslabelingengine.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class CORE_EXPORT QgsAbstractLabelProvider
4343

4444
public:
4545
//! Construct the provider with default values
46-
QgsAbstractLabelProvider( const QString& layerId = QString(), const QString& providerId = QString() );
46+
QgsAbstractLabelProvider( QgsMapLayer* layer, const QString& providerId = QString() );
4747

4848
virtual ~QgsAbstractLabelProvider() = default;
4949

@@ -75,6 +75,9 @@ class CORE_EXPORT QgsAbstractLabelProvider
7575
//! Returns ID of associated layer, or empty string if no layer is associated with the provider.
7676
QString layerId() const { return mLayerId; }
7777

78+
//! Returns the associated layer, or nullptr if no layer is associated with the provider.
79+
QgsMapLayer* layer() const { return mLayer.data(); }
80+
7881
//! Returns provider ID - useful in case there is more than one label provider within a layer
7982
//! (e.g. in case of rule-based labeling - provider ID = rule's key). May be empty string if
8083
//! layer ID is sufficient for identification of provider's configuration.
@@ -106,6 +109,8 @@ class CORE_EXPORT QgsAbstractLabelProvider
106109
QString mName;
107110
//! Associated layer's ID, if applicable
108111
QString mLayerId;
112+
//! Weak pointer to source layer
113+
QgsWeakMapLayerPointer mLayer;
109114
//! Associated provider ID (one layer may have multiple providers, e.g. in rule-based labeling)
110115
QString mProviderId;
111116
//! Flags altering drawing and registration of features
@@ -187,10 +192,10 @@ class CORE_EXPORT QgsLabelingEngine
187192
const QgsMapSettings& mapSettings() const { return mMapSettings; }
188193

189194
/**
190-
* Returns a list of layer IDs for layers with providers in the engine.
195+
* Returns a list of layers with providers in the engine.
191196
* @note added in QGIS 3.0
192197
*/
193-
QStringList participatingLayerIds() const;
198+
QList< QgsMapLayer* > participatingLayers() const;
194199

195200
//! Add provider of label features. Takes ownership of the provider
196201
void addProvider( QgsAbstractLabelProvider* provider );

src/core/qgsvectorlayerdiagramprovider.cpp

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,8 @@
2424
#include "feature.h"
2525
#include "labelposition.h"
2626

27-
28-
QgsVectorLayerDiagramProvider::QgsVectorLayerDiagramProvider(
29-
const QgsDiagramLayerSettings* diagSettings,
30-
const QgsDiagramRenderer* diagRenderer,
31-
const QString& layerId,
32-
const QgsFields& fields,
33-
const QgsCoordinateReferenceSystem& crs,
34-
QgsAbstractFeatureSource* source,
35-
bool ownsSource )
36-
: QgsAbstractLabelProvider( layerId )
37-
, mSettings( *diagSettings )
38-
, mDiagRenderer( diagRenderer->clone() )
39-
, mFields( fields )
40-
, mLayerCrs( crs )
41-
, mSource( source )
42-
, mOwnsSource( ownsSource )
43-
{
44-
init();
45-
}
46-
47-
4827
QgsVectorLayerDiagramProvider::QgsVectorLayerDiagramProvider( QgsVectorLayer* layer, bool ownFeatureLoop )
49-
: QgsAbstractLabelProvider( layer->id() )
28+
: QgsAbstractLabelProvider( layer )
5029
, mSettings( *layer->diagramLayerSettings() )
5130
, mDiagRenderer( layer->diagramRenderer()->clone() )
5231
, mFields( layer->fields() )

src/core/qgsvectorlayerdiagramprovider.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,6 @@ class CORE_EXPORT QgsVectorLayerDiagramProvider : public QgsAbstractLabelProvide
6262
//! Convenience constructor to initialize the provider from given vector layer
6363
explicit QgsVectorLayerDiagramProvider( QgsVectorLayer* layer, bool ownFeatureLoop = true );
6464

65-
//! Construct diagram provider with all the necessary configuration parameters
66-
QgsVectorLayerDiagramProvider( const QgsDiagramLayerSettings* diagSettings,
67-
const QgsDiagramRenderer* diagRenderer,
68-
const QString& layerId,
69-
const QgsFields& fields,
70-
const QgsCoordinateReferenceSystem& crs,
71-
QgsAbstractFeatureSource* source,
72-
bool ownsSource );
73-
7465
//! Clean up
7566
~QgsVectorLayerDiagramProvider();
7667

src/core/qgsvectorlayerlabelprovider.cpp

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
using namespace pal;
3636

3737
QgsVectorLayerLabelProvider::QgsVectorLayerLabelProvider( QgsVectorLayer* layer, const QString& providerId, bool withFeatureLoop, const QgsPalLayerSettings* settings, const QString& layerName )
38-
: QgsAbstractLabelProvider( layer->id(), providerId )
38+
: QgsAbstractLabelProvider( layer, providerId )
3939
, mSettings( settings ? *settings : QgsPalLayerSettings::fromLayer( layer ) )
4040
, mLayerGeometryType( layer->geometryType() )
4141
, mRenderer( layer->renderer() )
@@ -58,25 +58,6 @@ QgsVectorLayerLabelProvider::QgsVectorLayerLabelProvider( QgsVectorLayer* layer,
5858
init();
5959
}
6060

61-
QgsVectorLayerLabelProvider::QgsVectorLayerLabelProvider( const QgsPalLayerSettings& settings,
62-
const QString& layerId,
63-
const QgsFields& fields,
64-
const QgsCoordinateReferenceSystem& crs,
65-
QgsAbstractFeatureSource* source,
66-
bool ownsSource, QgsFeatureRenderer* renderer )
67-
: QgsAbstractLabelProvider( layerId )
68-
, mSettings( settings )
69-
, mLayerGeometryType( QgsWkbTypes::UnknownGeometry )
70-
, mRenderer( renderer )
71-
, mFields( fields )
72-
, mCrs( crs )
73-
, mSource( source )
74-
, mOwnsSource( ownsSource )
75-
{
76-
init();
77-
}
78-
79-
8061
void QgsVectorLayerLabelProvider::init()
8162
{
8263
mPlacement = mSettings.placement;

src/core/qgsvectorlayerlabelprovider.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,6 @@ class CORE_EXPORT QgsVectorLayerLabelProvider : public QgsAbstractLabelProvider
4444
const QgsPalLayerSettings* settings = nullptr,
4545
const QString& layerName = QString() );
4646

47-
//! Construct diagram provider with all the necessary configuration parameters
48-
QgsVectorLayerLabelProvider( const QgsPalLayerSettings& settings,
49-
const QString& layerId,
50-
const QgsFields& fields,
51-
const QgsCoordinateReferenceSystem& crs,
52-
QgsAbstractFeatureSource* source,
53-
bool ownsSource,
54-
QgsFeatureRenderer* renderer = nullptr );
55-
5647
~QgsVectorLayerLabelProvider();
5748

5849
virtual QList<QgsLabelFeature*> labelFeatures( QgsRenderContext& context ) override;

tests/src/core/testqgslabelingengine.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,18 +538,18 @@ void TestQgsLabelingEngine::testCapitalization()
538538
void TestQgsLabelingEngine::testParticipatingLayers()
539539
{
540540
QgsLabelingEngine engine;
541-
QVERIFY( engine.participatingLayerIds().isEmpty() );
541+
QVERIFY( engine.participatingLayers().isEmpty() );
542542

543543
QgsPalLayerSettings settings1;
544544
QgsVectorLayerLabelProvider* provider = new QgsVectorLayerLabelProvider( vl, QStringLiteral( "test" ), true, &settings1 );
545545
engine.addProvider( provider );
546-
QCOMPARE( engine.participatingLayerIds(), QStringList() << vl->id() );
546+
QCOMPARE( engine.participatingLayers(), QList<QgsMapLayer*>() << vl );
547547

548548
QgsVectorLayer* layer2 = new QgsVectorLayer( QStringLiteral( "Point?field=col1:integer" ), QStringLiteral( "layer2" ), QStringLiteral( "memory" ) );
549549
QgsPalLayerSettings settings2;
550550
QgsVectorLayerLabelProvider* provider2 = new QgsVectorLayerLabelProvider( layer2, QStringLiteral( "test2" ), true, &settings2 );
551551
engine.addProvider( provider2 );
552-
QCOMPARE( engine.participatingLayerIds().toSet(), QSet< QString >() << vl->id() << layer2->id() );
552+
QCOMPARE( engine.participatingLayers().toSet(), QSet< QgsMapLayer* >() << vl << layer2 );
553553

554554
// add a rule-based labeling node
555555
QgsRuleBasedLabeling::Rule* root = new QgsRuleBasedLabeling::Rule( 0 );
@@ -561,7 +561,7 @@ void TestQgsLabelingEngine::testParticipatingLayers()
561561
QgsVectorLayer* layer3 = new QgsVectorLayer( QStringLiteral( "Point?field=col1:integer" ), QStringLiteral( "layer3" ), QStringLiteral( "memory" ) );
562562
QgsRuleBasedLabelProvider* ruleProvider = new QgsRuleBasedLabelProvider( QgsRuleBasedLabeling( root ), layer3 );
563563
engine.addProvider( ruleProvider );
564-
QCOMPARE( engine.participatingLayerIds().toSet(), QSet< QString >() << vl->id() << layer2->id() << layer3->id() );
564+
QCOMPARE( engine.participatingLayers().toSet(), QSet< QgsMapLayer* >() << vl << layer2 << layer3 );
565565
}
566566

567567
bool TestQgsLabelingEngine::imageCheck( const QString& testName, QImage &image, int mismatchCount )

0 commit comments

Comments
 (0)