Skip to content

Commit

Permalink
Generation of legend items for mesh layers
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Aug 14, 2018
1 parent d093455 commit 545eb97
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 0 deletions.
25 changes: 25 additions & 0 deletions python/core/auto_generated/qgsmaplayerlegend.sip.in
Expand Up @@ -61,6 +61,11 @@ Create new legend implementation for vector layer
static QgsMapLayerLegend *defaultRasterLegend( QgsRasterLayer *rl ) /Factory/;
%Docstring
Create new legend implementation for raster layer
%End

static QgsMapLayerLegend *defaultMeshLegend( QgsMeshLayer *ml ) /Factory/;
%Docstring
Create new legend implementation for mesh layer
%End

signals:
Expand Down Expand Up @@ -192,6 +197,26 @@ Default legend implementation for raster layers
};


class QgsDefaultMeshLayerLegend : QgsMapLayerLegend
{
%Docstring
Default legend implementation for mesh layers

.. versionadded:: 3.4
%End

%TypeHeaderCode
#include "qgsmaplayerlegend.h"
%End
public:
explicit QgsDefaultMeshLayerLegend( QgsMeshLayer *ml );

virtual QList<QgsLayerTreeModelLegendNode *> createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer ) /Factory/;


};


/************************************************************************
* This file has been generated automatically from *
* *
Expand Down
9 changes: 9 additions & 0 deletions src/core/mesh/qgsmeshlayer.cpp
Expand Up @@ -22,6 +22,7 @@


#include "qgslogger.h"
#include "qgsmaplayerlegend.h"
#include "qgsmeshdataprovider.h"
#include "qgsmeshlayer.h"
#include "qgsmeshlayerrenderer.h"
Expand All @@ -41,6 +42,8 @@ QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath,
QgsDataProvider::ProviderOptions providerOptions;
setDataProvider( providerKey, providerOptions );

setLegend( QgsMapLayerLegend::defaultMeshLegend( this ) );

// show at least the mesh by default so we render something
mRendererNativeMeshSettings.setEnabled( true );

Expand Down Expand Up @@ -107,6 +110,7 @@ QgsMeshRendererMeshSettings QgsMeshLayer::rendererNativeMeshSettings() const
void QgsMeshLayer::setRendererNativeMeshSettings( const QgsMeshRendererMeshSettings &settings )
{
mRendererNativeMeshSettings = settings;
emit rendererChanged();
triggerRepaint();
}

Expand All @@ -118,6 +122,7 @@ QgsMeshRendererMeshSettings QgsMeshLayer::rendererTriangularMeshSettings() const
void QgsMeshLayer::setRendererTriangularMeshSettings( const QgsMeshRendererMeshSettings &settings )
{
mRendererTriangularMeshSettings = settings;
emit rendererChanged();
triggerRepaint();
}

Expand All @@ -129,6 +134,7 @@ QgsMeshRendererScalarSettings QgsMeshLayer::rendererScalarSettings() const
void QgsMeshLayer::setRendererScalarSettings( const QgsMeshRendererScalarSettings &settings )
{
mRendererScalarSettings = settings;
emit rendererChanged();
triggerRepaint();
}

Expand All @@ -141,6 +147,7 @@ QgsMeshRendererVectorSettings QgsMeshLayer::rendererVectorSettings() const
void QgsMeshLayer::setRendererVectorSettings( const QgsMeshRendererVectorSettings &settings )
{
mRendererVectorSettings = settings;
emit rendererChanged();
triggerRepaint();
}

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

emit rendererChanged();
triggerRepaint();

emit activeScalarDatasetChanged( mActiveScalarDataset );
Expand All @@ -178,6 +186,7 @@ void QgsMeshLayer::setActiveVectorDataset( QgsMeshDatasetIndex index )
mActiveVectorDataset = QgsMeshDatasetIndex();
}

emit rendererChanged();
triggerRepaint();

emit activeVectorDatasetChanged( mActiveVectorDataset );
Expand Down
54 changes: 54 additions & 0 deletions src/core/qgsmaplayerlegend.cpp
Expand Up @@ -18,6 +18,7 @@
#include "qgssettings.h"
#include "qgslayertree.h"
#include "qgslayertreemodellegendnode.h"
#include "qgsmeshlayer.h"
#include "qgspluginlayer.h"
#include "qgsrasterlayer.h"
#include "qgsrenderer.h"
Expand Down Expand Up @@ -53,6 +54,11 @@ QgsMapLayerLegend *QgsMapLayerLegend::defaultRasterLegend( QgsRasterLayer *rl )
return new QgsDefaultRasterLayerLegend( rl );
}

QgsMapLayerLegend *QgsMapLayerLegend::defaultMeshLegend( QgsMeshLayer *ml )
{
return new QgsDefaultMeshLayerLegend( ml );
}

// -------------------------------------------------------------------------


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

return nodes;
}

// -------------------------------------------------------------------------

QgsDefaultMeshLayerLegend::QgsDefaultMeshLayerLegend( QgsMeshLayer *ml )
: mLayer( ml )
{
connect( mLayer, &QgsMapLayer::rendererChanged, this, &QgsMapLayerLegend::itemsChanged );
}

QList<QgsLayerTreeModelLegendNode *> QgsDefaultMeshLayerLegend::createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer )
{
QList<QgsLayerTreeModelLegendNode *> nodes;

QgsMeshDataProvider *provider = mLayer->dataProvider();
if ( !provider )
return nodes;

QgsMeshDatasetIndex indexScalar = mLayer->activeScalarDataset();
QgsMeshDatasetIndex indexVector = mLayer->activeVectorDataset();

QString name;
if ( indexScalar.isValid() && indexVector.isValid() && indexScalar.group() != indexVector.group() )
name = QString( "%1 / %2" ).arg( provider->datasetGroupMetadata( indexScalar.group() ).name(), provider->datasetGroupMetadata( indexVector.group() ).name() );
else if ( indexScalar.isValid() )
name = provider->datasetGroupMetadata( indexScalar.group() ).name();
else if ( indexVector.isValid() )
name = provider->datasetGroupMetadata( indexVector.group() ).name();
else
{
// neither contours nor vectors get rendered - no legend needed
return nodes;
}

nodes << new QgsSimpleLegendNode( nodeLayer, name );

QgsMeshRendererScalarSettings settings = mLayer->rendererScalarSettings();
if ( settings.isEnabled() )
{
QgsLegendColorList items;
settings.colorRampShader().legendSymbologyItems( items );
for ( const QPair< QString, QColor > &item : qgis::as_const( items ) )
{
nodes << new QgsRasterSymbolLegendNode( nodeLayer, item.second, item.first );
}
}

return nodes;
}
23 changes: 23 additions & 0 deletions src/core/qgsmaplayerlegend.h
Expand Up @@ -24,6 +24,7 @@ class QDomElement;

class QgsLayerTreeLayer;
class QgsLayerTreeModelLegendNode;
class QgsMeshLayer;
class QgsPluginLayer;
class QgsRasterLayer;
class QgsReadWriteContext;
Expand Down Expand Up @@ -75,6 +76,9 @@ class CORE_EXPORT QgsMapLayerLegend : public QObject
//! Create new legend implementation for raster layer
static QgsMapLayerLegend *defaultRasterLegend( QgsRasterLayer *rl ) SIP_FACTORY;

//! Create new legend implementation for mesh layer
static QgsMapLayerLegend *defaultMeshLegend( QgsMeshLayer *ml ) SIP_FACTORY;

signals:
//! Emitted when existing items/nodes got invalid and should be replaced by new ones
void itemsChanged();
Expand Down Expand Up @@ -194,4 +198,23 @@ class CORE_EXPORT QgsDefaultRasterLayerLegend : public QgsMapLayerLegend
};


/**
* \ingroup core
* Default legend implementation for mesh layers
* \since QGIS 3.4
*/
class CORE_EXPORT QgsDefaultMeshLayerLegend : public QgsMapLayerLegend
{
Q_OBJECT

public:
explicit QgsDefaultMeshLayerLegend( QgsMeshLayer *ml );

QList<QgsLayerTreeModelLegendNode *> createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer ) SIP_FACTORY override;

private:
QgsMeshLayer *mLayer = nullptr;
};


#endif // QGSMAPLAYERLEGEND_H
18 changes: 18 additions & 0 deletions tests/src/core/testqgsmeshlayerrenderer.cpp
Expand Up @@ -29,6 +29,7 @@
#include "qgsmaplayer.h"
#include "qgsmeshlayer.h"
#include "qgsapplication.h"
#include "qgsmaplayerlegend.h"
#include "qgsproviderregistry.h"
#include "qgsproject.h"
#include "qgsmaprenderersequentialjob.h"
Expand Down Expand Up @@ -69,6 +70,8 @@ class TestQgsMeshRenderer : public QObject
void test_vertex_vector_dataset_rendering();
void test_face_scalar_dataset_rendering();
void test_face_vector_dataset_rendering();

void test_signals();
};

void TestQgsMeshRenderer::init()
Expand Down Expand Up @@ -194,5 +197,20 @@ void TestQgsMeshRenderer::test_face_vector_dataset_rendering()
QVERIFY( imageCheck( "quad_and_triangle_face_vector_dataset" ) );
}

void TestQgsMeshRenderer::test_signals()
{
mMemoryLayer->setActiveScalarDataset( QgsMeshDatasetIndex( 0, 0 ) );

QSignalSpy spy1( mMemoryLayer, &QgsMapLayer::rendererChanged );
QSignalSpy spy2( mMemoryLayer->legend(), &QgsMapLayerLegend::itemsChanged );
QSignalSpy spy3( mMemoryLayer, &QgsMapLayer::legendChanged );

mMemoryLayer->setActiveScalarDataset( QgsMeshDatasetIndex( 1, 0 ) );

QCOMPARE( spy1.count(), 1 );
QCOMPARE( spy2.count(), 1 );
QCOMPARE( spy3.count(), 1 );
}

QGSTEST_MAIN( TestQgsMeshRenderer )
#include "testqgsmeshlayerrenderer.moc"

0 comments on commit 545eb97

Please sign in to comment.