Skip to content

Commit

Permalink
We require a per-map-item rendered feature handler
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Aug 17, 2019
1 parent b397b45 commit e66135b
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 13 deletions.
21 changes: 13 additions & 8 deletions src/core/layout/qgslayoutgeopdfexporter.cpp
Expand Up @@ -19,6 +19,7 @@
#include "qgsfeaturerequest.h"
#include "qgslayout.h"
#include "qgslogger.h"
#include "qgsgeometry.h"
#include <QMutex>
#include <QMutexLocker>

Expand All @@ -32,6 +33,7 @@ class QgsGeoPdfRenderedFeatureHandler: public QgsRenderedFeatureHandlerInterface
// and use it to retrieve QgsMapLayers mid-way through a render operation. Lesser of two evils it is!
const QString layerId = context.renderContext->expressionContext().variable( QStringLiteral( "layer_id" ) ).toString();


// we (currently) don't REALLY need a mutex here, because layout maps are always rendered using a single threaded operation.
// but we'll play it safe, just in case this changes in future.
QMutexLocker locker( &mMutex );
Expand All @@ -52,27 +54,30 @@ class QgsGeoPdfRenderedFeatureHandler: public QgsRenderedFeatureHandlerInterface

QgsLayoutGeoPdfExporter::QgsLayoutGeoPdfExporter( QgsLayout *layout )
: mLayout( layout )
, mHandler( qgis::make_unique< QgsGeoPdfRenderedFeatureHandler >() )
{
// on construction, we install a rendered feature handler on layout item maps
mLayout->layoutItems( mMaps );
for ( QgsLayoutItemMap *map : qgis::as_const( mMaps ) )
QList< QgsLayoutItemMap * > maps;
mLayout->layoutItems( maps );
for ( QgsLayoutItemMap *map : qgis::as_const( maps ) )
{
map->addRenderedFeatureHandler( mHandler.get() );
QgsGeoPdfRenderedFeatureHandler *handler = new QgsGeoPdfRenderedFeatureHandler();
mMapHandlers.insert( map, handler );
map->addRenderedFeatureHandler( handler );
}
}

QgsLayoutGeoPdfExporter::~QgsLayoutGeoPdfExporter()
{
// cleanup - remove rendered feature handler from all maps
for ( QgsLayoutItemMap *map : qgis::as_const( mMaps ) )
for ( auto it = mMapHandlers.constBegin(); it != mMapHandlers.constEnd(); ++it )
{
map->removeRenderedFeatureHandler( mHandler.get() );
it.key()->removeRenderedFeatureHandler( it.value() );
delete it.value();
}
}

QMap<QString, QVector<QgsLayoutGeoPdfExporter::RenderedFeature> > QgsLayoutGeoPdfExporter::renderedFeatures() const
QMap<QString, QVector<QgsLayoutGeoPdfExporter::RenderedFeature> > QgsLayoutGeoPdfExporter::renderedFeatures( QgsLayoutItemMap *map ) const
{
return mHandler->renderedFeatures;
return mMapHandlers.value( map )->renderedFeatures;
}

7 changes: 3 additions & 4 deletions src/core/layout/qgslayoutgeopdfexporter.h
Expand Up @@ -82,15 +82,14 @@ class CORE_EXPORT QgsLayoutGeoPdfExporter
};

/**
* Returns a map of rendered features, with layer IDs as map keys.
* Returns a dict of rendered features, with layer IDs as dict keys for the specified \a map item.
*/
QMap< QString, QVector< QgsLayoutGeoPdfExporter::RenderedFeature > > renderedFeatures() const;
QMap< QString, QVector< QgsLayoutGeoPdfExporter::RenderedFeature > > renderedFeatures( QgsLayoutItemMap *map ) const;

private:

QgsLayout *mLayout = nullptr;
QList< QgsLayoutItemMap * > mMaps;
std::unique_ptr< QgsGeoPdfRenderedFeatureHandler > mHandler;
QHash< QgsLayoutItemMap *, QgsGeoPdfRenderedFeatureHandler * > mMapHandlers;

};

Expand Down
2 changes: 1 addition & 1 deletion tests/src/core/testqgslayoutgeopdfexport.cpp
Expand Up @@ -105,7 +105,7 @@ void TestQgsLayoutGeoPdfExport::testCollectingFeatures()
exporter.renderPageToImage( 0 );

// check that features were collected
QMap< QString, QVector< QgsLayoutGeoPdfExporter::RenderedFeature > > renderedFeatures = geoPdfExporter.renderedFeatures();
QMap< QString, QVector< QgsLayoutGeoPdfExporter::RenderedFeature > > renderedFeatures = geoPdfExporter.renderedFeatures( map );
QCOMPARE( renderedFeatures.count(), 2 );
QVector< QgsLayoutGeoPdfExporter::RenderedFeature > lineFeatures = renderedFeatures.value( linesLayer->id() );
QCOMPARE( lineFeatures.count(), 6 );
Expand Down

0 comments on commit e66135b

Please sign in to comment.