Skip to content

Commit 545eb97

Browse files
committed
Generation of legend items for mesh layers
1 parent d093455 commit 545eb97

File tree

5 files changed

+129
-0
lines changed

5 files changed

+129
-0
lines changed

python/core/auto_generated/qgsmaplayerlegend.sip.in

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ Create new legend implementation for vector layer
6161
static QgsMapLayerLegend *defaultRasterLegend( QgsRasterLayer *rl ) /Factory/;
6262
%Docstring
6363
Create new legend implementation for raster layer
64+
%End
65+
66+
static QgsMapLayerLegend *defaultMeshLegend( QgsMeshLayer *ml ) /Factory/;
67+
%Docstring
68+
Create new legend implementation for mesh layer
6469
%End
6570

6671
signals:
@@ -192,6 +197,26 @@ Default legend implementation for raster layers
192197
};
193198

194199

200+
class QgsDefaultMeshLayerLegend : QgsMapLayerLegend
201+
{
202+
%Docstring
203+
Default legend implementation for mesh layers
204+
205+
.. versionadded:: 3.4
206+
%End
207+
208+
%TypeHeaderCode
209+
#include "qgsmaplayerlegend.h"
210+
%End
211+
public:
212+
explicit QgsDefaultMeshLayerLegend( QgsMeshLayer *ml );
213+
214+
virtual QList<QgsLayerTreeModelLegendNode *> createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer ) /Factory/;
215+
216+
217+
};
218+
219+
195220
/************************************************************************
196221
* This file has been generated automatically from *
197222
* *

src/core/mesh/qgsmeshlayer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323

2424
#include "qgslogger.h"
25+
#include "qgsmaplayerlegend.h"
2526
#include "qgsmeshdataprovider.h"
2627
#include "qgsmeshlayer.h"
2728
#include "qgsmeshlayerrenderer.h"
@@ -41,6 +42,8 @@ QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath,
4142
QgsDataProvider::ProviderOptions providerOptions;
4243
setDataProvider( providerKey, providerOptions );
4344

45+
setLegend( QgsMapLayerLegend::defaultMeshLegend( this ) );
46+
4447
// show at least the mesh by default so we render something
4548
mRendererNativeMeshSettings.setEnabled( true );
4649

@@ -107,6 +110,7 @@ QgsMeshRendererMeshSettings QgsMeshLayer::rendererNativeMeshSettings() const
107110
void QgsMeshLayer::setRendererNativeMeshSettings( const QgsMeshRendererMeshSettings &settings )
108111
{
109112
mRendererNativeMeshSettings = settings;
113+
emit rendererChanged();
110114
triggerRepaint();
111115
}
112116

@@ -118,6 +122,7 @@ QgsMeshRendererMeshSettings QgsMeshLayer::rendererTriangularMeshSettings() const
118122
void QgsMeshLayer::setRendererTriangularMeshSettings( const QgsMeshRendererMeshSettings &settings )
119123
{
120124
mRendererTriangularMeshSettings = settings;
125+
emit rendererChanged();
121126
triggerRepaint();
122127
}
123128

@@ -129,6 +134,7 @@ QgsMeshRendererScalarSettings QgsMeshLayer::rendererScalarSettings() const
129134
void QgsMeshLayer::setRendererScalarSettings( const QgsMeshRendererScalarSettings &settings )
130135
{
131136
mRendererScalarSettings = settings;
137+
emit rendererChanged();
132138
triggerRepaint();
133139
}
134140

@@ -141,6 +147,7 @@ QgsMeshRendererVectorSettings QgsMeshLayer::rendererVectorSettings() const
141147
void QgsMeshLayer::setRendererVectorSettings( const QgsMeshRendererVectorSettings &settings )
142148
{
143149
mRendererVectorSettings = settings;
150+
emit rendererChanged();
144151
triggerRepaint();
145152
}
146153

@@ -155,6 +162,7 @@ void QgsMeshLayer::setActiveScalarDataset( QgsMeshDatasetIndex index )
155162
else
156163
mActiveScalarDataset = QgsMeshDatasetIndex();
157164

165+
emit rendererChanged();
158166
triggerRepaint();
159167

160168
emit activeScalarDatasetChanged( mActiveScalarDataset );
@@ -178,6 +186,7 @@ void QgsMeshLayer::setActiveVectorDataset( QgsMeshDatasetIndex index )
178186
mActiveVectorDataset = QgsMeshDatasetIndex();
179187
}
180188

189+
emit rendererChanged();
181190
triggerRepaint();
182191

183192
emit activeVectorDatasetChanged( mActiveVectorDataset );

src/core/qgsmaplayerlegend.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgssettings.h"
1919
#include "qgslayertree.h"
2020
#include "qgslayertreemodellegendnode.h"
21+
#include "qgsmeshlayer.h"
2122
#include "qgspluginlayer.h"
2223
#include "qgsrasterlayer.h"
2324
#include "qgsrenderer.h"
@@ -53,6 +54,11 @@ QgsMapLayerLegend *QgsMapLayerLegend::defaultRasterLegend( QgsRasterLayer *rl )
5354
return new QgsDefaultRasterLayerLegend( rl );
5455
}
5556

57+
QgsMapLayerLegend *QgsMapLayerLegend::defaultMeshLegend( QgsMeshLayer *ml )
58+
{
59+
return new QgsDefaultMeshLayerLegend( ml );
60+
}
61+
5662
// -------------------------------------------------------------------------
5763

5864

@@ -330,3 +336,51 @@ QList<QgsLayerTreeModelLegendNode *> QgsDefaultRasterLayerLegend::createLayerTre
330336

331337
return nodes;
332338
}
339+
340+
// -------------------------------------------------------------------------
341+
342+
QgsDefaultMeshLayerLegend::QgsDefaultMeshLayerLegend( QgsMeshLayer *ml )
343+
: mLayer( ml )
344+
{
345+
connect( mLayer, &QgsMapLayer::rendererChanged, this, &QgsMapLayerLegend::itemsChanged );
346+
}
347+
348+
QList<QgsLayerTreeModelLegendNode *> QgsDefaultMeshLayerLegend::createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer )
349+
{
350+
QList<QgsLayerTreeModelLegendNode *> nodes;
351+
352+
QgsMeshDataProvider *provider = mLayer->dataProvider();
353+
if ( !provider )
354+
return nodes;
355+
356+
QgsMeshDatasetIndex indexScalar = mLayer->activeScalarDataset();
357+
QgsMeshDatasetIndex indexVector = mLayer->activeVectorDataset();
358+
359+
QString name;
360+
if ( indexScalar.isValid() && indexVector.isValid() && indexScalar.group() != indexVector.group() )
361+
name = QString( "%1 / %2" ).arg( provider->datasetGroupMetadata( indexScalar.group() ).name(), provider->datasetGroupMetadata( indexVector.group() ).name() );
362+
else if ( indexScalar.isValid() )
363+
name = provider->datasetGroupMetadata( indexScalar.group() ).name();
364+
else if ( indexVector.isValid() )
365+
name = provider->datasetGroupMetadata( indexVector.group() ).name();
366+
else
367+
{
368+
// neither contours nor vectors get rendered - no legend needed
369+
return nodes;
370+
}
371+
372+
nodes << new QgsSimpleLegendNode( nodeLayer, name );
373+
374+
QgsMeshRendererScalarSettings settings = mLayer->rendererScalarSettings();
375+
if ( settings.isEnabled() )
376+
{
377+
QgsLegendColorList items;
378+
settings.colorRampShader().legendSymbologyItems( items );
379+
for ( const QPair< QString, QColor > &item : qgis::as_const( items ) )
380+
{
381+
nodes << new QgsRasterSymbolLegendNode( nodeLayer, item.second, item.first );
382+
}
383+
}
384+
385+
return nodes;
386+
}

src/core/qgsmaplayerlegend.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class QDomElement;
2424

2525
class QgsLayerTreeLayer;
2626
class QgsLayerTreeModelLegendNode;
27+
class QgsMeshLayer;
2728
class QgsPluginLayer;
2829
class QgsRasterLayer;
2930
class QgsReadWriteContext;
@@ -75,6 +76,9 @@ class CORE_EXPORT QgsMapLayerLegend : public QObject
7576
//! Create new legend implementation for raster layer
7677
static QgsMapLayerLegend *defaultRasterLegend( QgsRasterLayer *rl ) SIP_FACTORY;
7778

79+
//! Create new legend implementation for mesh layer
80+
static QgsMapLayerLegend *defaultMeshLegend( QgsMeshLayer *ml ) SIP_FACTORY;
81+
7882
signals:
7983
//! Emitted when existing items/nodes got invalid and should be replaced by new ones
8084
void itemsChanged();
@@ -194,4 +198,23 @@ class CORE_EXPORT QgsDefaultRasterLayerLegend : public QgsMapLayerLegend
194198
};
195199

196200

201+
/**
202+
* \ingroup core
203+
* Default legend implementation for mesh layers
204+
* \since QGIS 3.4
205+
*/
206+
class CORE_EXPORT QgsDefaultMeshLayerLegend : public QgsMapLayerLegend
207+
{
208+
Q_OBJECT
209+
210+
public:
211+
explicit QgsDefaultMeshLayerLegend( QgsMeshLayer *ml );
212+
213+
QList<QgsLayerTreeModelLegendNode *> createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer ) SIP_FACTORY override;
214+
215+
private:
216+
QgsMeshLayer *mLayer = nullptr;
217+
};
218+
219+
197220
#endif // QGSMAPLAYERLEGEND_H

tests/src/core/testqgsmeshlayerrenderer.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "qgsmaplayer.h"
3030
#include "qgsmeshlayer.h"
3131
#include "qgsapplication.h"
32+
#include "qgsmaplayerlegend.h"
3233
#include "qgsproviderregistry.h"
3334
#include "qgsproject.h"
3435
#include "qgsmaprenderersequentialjob.h"
@@ -69,6 +70,8 @@ class TestQgsMeshRenderer : public QObject
6970
void test_vertex_vector_dataset_rendering();
7071
void test_face_scalar_dataset_rendering();
7172
void test_face_vector_dataset_rendering();
73+
74+
void test_signals();
7275
};
7376

7477
void TestQgsMeshRenderer::init()
@@ -194,5 +197,20 @@ void TestQgsMeshRenderer::test_face_vector_dataset_rendering()
194197
QVERIFY( imageCheck( "quad_and_triangle_face_vector_dataset" ) );
195198
}
196199

200+
void TestQgsMeshRenderer::test_signals()
201+
{
202+
mMemoryLayer->setActiveScalarDataset( QgsMeshDatasetIndex( 0, 0 ) );
203+
204+
QSignalSpy spy1( mMemoryLayer, &QgsMapLayer::rendererChanged );
205+
QSignalSpy spy2( mMemoryLayer->legend(), &QgsMapLayerLegend::itemsChanged );
206+
QSignalSpy spy3( mMemoryLayer, &QgsMapLayer::legendChanged );
207+
208+
mMemoryLayer->setActiveScalarDataset( QgsMeshDatasetIndex( 1, 0 ) );
209+
210+
QCOMPARE( spy1.count(), 1 );
211+
QCOMPARE( spy2.count(), 1 );
212+
QCOMPARE( spy3.count(), 1 );
213+
}
214+
197215
QGSTEST_MAIN( TestQgsMeshRenderer )
198216
#include "testqgsmeshlayerrenderer.moc"

0 commit comments

Comments
 (0)