Skip to content

Commit e1a6231

Browse files
author
wonder
committed
Applied patch from #2461: add support for incremental rendering with symbology-ng.
Fixes $2409. Contributed by Jeremy Palmer, thanks! git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@12961 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 86674a9 commit e1a6231

File tree

3 files changed

+81
-17
lines changed

3 files changed

+81
-17
lines changed

CONTRIBUTORS

+1
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,4 @@ Richard Duivenvoorde
4242
Alexander Bruy
4343
Andres Manz
4444
Mark Baas
45+
Jeremy Palmer

src/core/qgsvectorlayer.cpp

+77-17
Original file line numberDiff line numberDiff line change
@@ -718,11 +718,35 @@ void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool lab
718718
selRenderer->startRender( rendererContext, this );
719719
}
720720

721+
#ifndef Q_WS_MAC
722+
int totalFeatures = pendingFeatureCount();
723+
int featureCount = 0;
724+
#endif //Q_WS_MAC
725+
721726
QgsFeature fet;
722727
while ( nextFeature( fet ) )
723728
{
724729
try
725730
{
731+
if ( rendererContext.renderingStopped() )
732+
{
733+
break;
734+
}
735+
736+
#ifndef Q_WS_MAC //MH: disable this on Mac for now to avoid problems with resizing
737+
if ( mUpdateThreshold > 0 && 0 == featureCount % mUpdateThreshold )
738+
{
739+
emit screenUpdateRequested();
740+
emit drawingProgress( featureCount, totalFeatures );
741+
qApp->processEvents();
742+
}
743+
else if ( featureCount % 1000 == 0 )
744+
{
745+
emit drawingProgress( featureCount, totalFeatures );
746+
qApp->processEvents();
747+
}
748+
#endif //Q_WS_MAC
749+
726750
bool sel = mSelectedFeatureIds.contains( fet.id() );
727751
bool drawMarker = ( mEditable && ( !vertexMarkerOnlyForSelection || sel ) );
728752

@@ -749,15 +773,12 @@ void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool lab
749773
msg += cse.what();
750774
QgsLogger::warning( msg );
751775
}
776+
#ifndef Q_WS_MAC
777+
++featureCount;
778+
#endif //Q_WS_MAC
752779
}
753780

754-
mRendererV2->stopRender( rendererContext );
755-
756-
if ( selRenderer )
757-
{
758-
selRenderer->stopRender( rendererContext );
759-
delete selRenderer;
760-
}
781+
stopRendererV2( rendererContext, selRenderer );
761782
}
762783

763784
void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bool labeling )
@@ -781,8 +802,22 @@ void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bo
781802

782803
// 1. fetch features
783804
QgsFeature fet;
805+
#ifndef Q_WS_MAC
806+
int featureCount = 0;
807+
#endif //Q_WS_MAC
784808
while ( nextFeature( fet ) )
785809
{
810+
if ( rendererContext.renderingStopped() )
811+
{
812+
stopRendererV2( rendererContext, selRenderer );
813+
return;
814+
}
815+
#ifndef Q_WS_MAC
816+
if ( featureCount % 1000 == 0 )
817+
{
818+
qApp->processEvents();
819+
}
820+
#endif //Q_WS_MAC
786821
QgsSymbolV2* sym = mRendererV2->symbolForFeature( fet );
787822
if ( !features.contains( sym ) )
788823
{
@@ -798,6 +833,9 @@ void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bo
798833
// Cache this for the use of (e.g.) modifying the feature's uncommitted geometry.
799834
mCachedGeometries[fet.id()] = *fet.geometry();
800835
}
836+
#ifndef Q_WS_MAC
837+
++featureCount;
838+
#endif //Q_WS_MAC
801839
}
802840

803841
// find out the order
@@ -831,8 +869,22 @@ void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bo
831869
int layer = item.layer();
832870
QList<QgsFeature>& lst = features[item.symbol()];
833871
QList<QgsFeature>::iterator fit;
872+
#ifndef Q_WS_MAC
873+
featureCount = 0;
874+
#endif //Q_WS_MAC
834875
for ( fit = lst.begin(); fit != lst.end(); ++fit )
835876
{
877+
if ( rendererContext.renderingStopped() )
878+
{
879+
stopRendererV2( rendererContext, selRenderer );
880+
return;
881+
}
882+
#ifndef Q_WS_MAC
883+
if ( featureCount % 1000 == 0 )
884+
{
885+
qApp->processEvents();
886+
}
887+
#endif //Q_WS_MAC
836888
bool sel = mSelectedFeatureIds.contains( fit->id() );
837889
// maybe vertex markers should be drawn only during the last pass...
838890
bool drawMarker = ( mEditable && ( !vertexMarkerOnlyForSelection || sel ) );
@@ -851,21 +903,22 @@ void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bo
851903
msg += cse.what();
852904
QgsLogger::warning( msg );
853905
}
906+
#ifndef Q_WS_MAC
907+
++featureCount;
908+
#endif //Q_WS_MAC
854909
}
855910
}
856911
}
857912

858-
mRendererV2->stopRender( rendererContext );
859-
860-
if ( selRenderer )
861-
{
862-
selRenderer->stopRender( rendererContext );
863-
delete selRenderer;
864-
}
913+
stopRendererV2( rendererContext, selRenderer );
865914
}
866915

867916
bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
868917
{
918+
//set update threshold before each draw to make sure the current setting is picked up
919+
QSettings settings;
920+
mUpdateThreshold = settings.value( "Map/updateThreshold", 0 ).toInt();
921+
869922
if ( mUsingRendererV2 )
870923
{
871924
if ( mRendererV2 == NULL )
@@ -916,9 +969,6 @@ bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
916969
return TRUE;
917970
}
918971

919-
//set update threshold before each draw to make sure the current setting is picked up
920-
QSettings settings;
921-
mUpdateThreshold = settings.value( "Map/updateThreshold", 0 ).toInt();
922972
//draw ( p, viewExtent, theMapToPixelTransform, ct, drawingToEditingCanvas, 1., 1.);
923973

924974
if ( mRenderer )
@@ -4540,3 +4590,13 @@ int QgsVectorLayer::fieldNameIndex( const QString& fieldName ) const
45404590
}
45414591
return -1;
45424592
}
4593+
4594+
void QgsVectorLayer::stopRendererV2( QgsRenderContext& rendererContext, QgsSingleSymbolRendererV2* selRenderer )
4595+
{
4596+
mRendererV2->stopRender( rendererContext );
4597+
if ( selRenderer )
4598+
{
4599+
selRenderer->stopRender( rendererContext );
4600+
delete selRenderer;
4601+
}
4602+
}

src/core/qgsvectorlayer.h

+3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class QgsRenderer;
4444
class QgsUndoCommand;
4545
class QgsVectorDataProvider;
4646
class QgsVectorOverlay;
47+
class QgsSingleSymbolRendererV2;
4748

4849
class QgsRectangle;
4950

@@ -660,6 +661,8 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
660661
/** Record changed attribute, store in active command (if any) */
661662
void editAttributeChange( int featureId, int field, QVariant value );
662663

664+
/** Stop version 2 renderer and selected renderer (if required) */
665+
void stopRendererV2( QgsRenderContext& rendererContext, QgsSingleSymbolRendererV2* selRenderer );
663666

664667
private: // Private attributes
665668

0 commit comments

Comments
 (0)