Skip to content

Commit 212aea7

Browse files
committedApr 10, 2013
Change point displacement renderer to work with new vector api
1 parent fca5ee5 commit 212aea7

File tree

3 files changed

+25
-12
lines changed

3 files changed

+25
-12
lines changed
 

‎src/core/qgsvectorlayer.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,6 @@ void QgsVectorLayer::drawRendererV2( QgsFeatureIterator &fit, QgsRenderContext&
370370
QSettings settings;
371371
bool vertexMarkerOnlyForSelection = settings.value( "/qgis/digitizing/marker_only_for_selected", false ).toBool();
372372

373-
mRendererV2->startRender( rendererContext, this );
374-
375373
#ifndef Q_WS_MAC
376374
int featureCount = 0;
377375
#endif //Q_WS_MAC
@@ -465,9 +463,6 @@ void QgsVectorLayer::drawRendererV2Levels( QgsFeatureIterator &fit, QgsRenderCon
465463
QSettings settings;
466464
bool vertexMarkerOnlyForSelection = settings.value( "/qgis/digitizing/marker_only_for_selected", false ).toBool();
467465

468-
// startRender must be called before symbolForFeature() calls to make sure renderer is ready
469-
mRendererV2->startRender( rendererContext, this );
470-
471466
QgsSingleSymbolRendererV2* selRenderer = NULL;
472467
if ( !mSelectedFeatureIds.isEmpty() )
473468
{
@@ -653,6 +648,9 @@ bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
653648
//register label and diagram layer to the labeling engine
654649
prepareLabelingAndDiagrams( rendererContext, attributes, labeling );
655650

651+
//do startRender before getFeatures to give renderers the possibility of querying features in the startRender method
652+
mRendererV2->startRender( rendererContext, this );
653+
656654
QgsFeatureIterator fit = getFeatures( QgsFeatureRequest()
657655
.setFilterRect( rendererContext.extent() )
658656
.setSubsetOfAttributes( attributes ) );

‎src/core/qgsvectorlayer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,12 +347,12 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
347347
*/
348348
void setRendererV2( QgsFeatureRendererV2* r );
349349

350-
/** Draw layer with renderer V2.
350+
/** Draw layer with renderer V2. QgsFeatureRenderer::startRender() needs to be called before using this method
351351
* @note added in 1.4
352352
*/
353353
void drawRendererV2( QgsFeatureIterator &fit, QgsRenderContext& rendererContext, bool labeling );
354354

355-
/** Draw layer with renderer V2 using symbol levels.
355+
/** Draw layer with renderer V2 using symbol levels. QgsFeatureRenderer::startRender() needs to be called before using this method
356356
* @note added in 1.4
357357
*/
358358
void drawRendererV2Levels( QgsFeatureIterator &fit, QgsRenderContext& rendererContext, bool labeling );

‎src/core/symbology-ng/qgspointdisplacementrenderer.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,9 @@ void QgsPointDisplacementRenderer::createDisplacementGroups( QgsVectorLayer* vla
364364
QgsFeature f;
365365
QList<QgsFeatureId> intersectList;
366366

367+
//Because the new vector api does not allow querying features by id within a nextFeature loop, default constructed QgsFeature() is
368+
//inserted first and the real features are created in a second loop
369+
367370
QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( viewExtent ).setSubsetOfAttributes( attList ) );
368371
while ( fit.nextFeature( f ) )
369372
{
@@ -389,7 +392,7 @@ void QgsPointDisplacementRenderer::createDisplacementGroups( QgsVectorLayer* vla
389392
{
390393
found = true;
391394
QgsFeature feature;
392-
it->insert( f.id(), f );
395+
it->insert( f.id(), QgsFeature() );
393396
mDisplacementIds.insert( f.id() );
394397
break;
395398
}
@@ -398,17 +401,29 @@ void QgsPointDisplacementRenderer::createDisplacementGroups( QgsVectorLayer* vla
398401
if ( !found )//insert the already existing feature and the new one into a map
399402
{
400403
QMap<QgsFeatureId, QgsFeature> newMap;
401-
QgsFeature existingFeature;
402-
vlayer->getFeatures( QgsFeatureRequest().setFilterFid( existingEntry ) ).nextFeature( existingFeature );
403-
newMap.insert( existingEntry, existingFeature );
404+
newMap.insert( existingEntry, QgsFeature() );
404405
mDisplacementIds.insert( existingEntry );
405-
newMap.insert( f.id(), f );
406+
newMap.insert( f.id(), QgsFeature() );
406407
mDisplacementIds.insert( f.id() );
407408
mDisplacementGroups.push_back( newMap );
408409
}
409410
}
410411
}
411412
}
413+
414+
//insert the real features into mDisplacementGroups
415+
QList< QMap<QgsFeatureId, QgsFeature> >::iterator it = mDisplacementGroups.begin();
416+
for ( ; it != mDisplacementGroups.end(); ++it )
417+
{
418+
QMap<QgsFeatureId, QgsFeature>::iterator mapIt = it->begin();
419+
for ( ; mapIt != it->end(); ++mapIt )
420+
{
421+
QgsFeature fet;
422+
vlayer->getFeatures( QgsFeatureRequest().setFilterFid( mapIt.key() ) ).nextFeature( fet );
423+
mapIt.value() = fet;
424+
}
425+
}
426+
412427
}
413428

414429
QgsRectangle QgsPointDisplacementRenderer::searchRect( const QgsPoint& p ) const

0 commit comments

Comments
 (0)
Please sign in to comment.