Index: src/gui/qgsgraduatedsymbolrenderer.h =================================================================== --- src/gui/qgsgraduatedsymbolrenderer.h (revision 6456) +++ src/gui/qgsgraduatedsymbolrenderer.h (working copy) @@ -33,6 +33,9 @@ /**This class contains the information for graduate symbol rendering*/ class QgsGraduatedSymbolRenderer: public QgsRenderer { + private: + /**Helper function for finding symbol having feature value in range*/ + std::list < QgsSymbol* >::iterator firstSymbolForFeature(QgsFeature *f); public: QgsGraduatedSymbolRenderer(QGis::VectorType type); QgsGraduatedSymbolRenderer(const QgsGraduatedSymbolRenderer& other); @@ -45,6 +48,9 @@ int classificationField() const; /**Removes all symbols*/ void removeSymbols(); + /**Determines if an OGRFeature is in range of any symbol's upper and lower bounds + \param f a pointer to the feature to check*/ + bool willRenderFeature(QgsFeature *f); /**Renders an OGRFeature \param p a painter (usually the one from the current map canvas) \param f a pointer to a feature to render Index: src/gui/qgsvectorlayer.cpp =================================================================== --- src/gui/qgsvectorlayer.cpp (revision 6456) +++ src/gui/qgsvectorlayer.cpp (working copy) @@ -360,9 +360,12 @@ if(mDeletedFeatureIds.find(fet->featureId())==mDeletedFeatureIds.end()) { bool sel=mSelectedFeatureIds.find(fet->featureId()) != mSelectedFeatureIds.end(); - mLabel->renderLabel ( p, viewExtent, *mCoordinateTransform, + if (m_renderer && m_renderer->willRenderFeature(fet)) + { + mLabel->renderLabel ( p, viewExtent, *mCoordinateTransform, projectionsEnabledFlag, theMapToPixelTransform, fet, sel, 0, scale); + } } } delete fet; @@ -374,8 +377,11 @@ for(std::vector::iterator it=mAddedFeatures.begin();it!=mAddedFeatures.end();++it) { bool sel=mSelectedFeatureIds.find((*it)->featureId()) != mSelectedFeatureIds.end(); - mLabel->renderLabel ( p, viewExtent, *mCoordinateTransform, projectionsEnabledFlag, + if (m_renderer && m_renderer->willRenderFeature(*it)) + { + mLabel->renderLabel ( p, viewExtent, *mCoordinateTransform, projectionsEnabledFlag, theMapToPixelTransform, *it, sel, 0, scale); + } } } catch (QgsCsException &e) @@ -880,17 +886,20 @@ sel = FALSE; } - m_renderer->renderFeature(p, fet, &marker, &markerScaleFactor, sel, widthScale ); - double scale = markerScaleFactor * symbolScale; - drawFeature(p, + if (m_renderer->willRenderFeature(fet)) + { + m_renderer->renderFeature(p, fet, &marker, &markerScaleFactor, sel, widthScale ); + double scale = markerScaleFactor * symbolScale; + drawFeature(p, fet, theMapToPixelTransform, &marker, scale, projectionsEnabledFlag, drawingToEditingCanvas); - ++featureCount; - delete fet; + ++featureCount; + delete fet; + } } //also draw the not yet commited features @@ -899,6 +908,10 @@ for(std::vector::iterator it = mAddedFeatures.begin(); it != mAddedFeatures.end(); ++it) { bool sel=mSelectedFeatureIds.find((*it)->featureId()) != mSelectedFeatureIds.end(); + if (!m_renderer->willRenderFeature(*it)) + { + continue; + } m_renderer->renderFeature(p, *it, &marker, &markerScaleFactor, sel, widthScale); double scale = markerScaleFactor * symbolScale; if (mChangedGeometries.find((*it)->featureId()) != mChangedGeometries.end()) Index: src/gui/qgsgraduatedsymbolrenderer.cpp =================================================================== --- src/gui/qgsgraduatedsymbolrenderer.cpp (revision 6456) +++ src/gui/qgsgraduatedsymbolrenderer.cpp (working copy) @@ -83,9 +83,9 @@ mSymbols.clear(); } -void QgsGraduatedSymbolRenderer::renderFeature(QPainter * p, QgsFeature * f, QPixmap* pic, - double* scalefactor, bool selected, double widthScale) +std::list < QgsSymbol* >::iterator QgsGraduatedSymbolRenderer::firstSymbolForFeature(QgsFeature *f) { + //first find out the value for the classification attribute std::vector < QgsFeatureAttribute > vec = f->attributeMap(); double value = vec[0].fieldValue().toDouble(); @@ -99,9 +99,27 @@ break; } } + return it; +} +bool QgsGraduatedSymbolRenderer::willRenderFeature(QgsFeature *f) +{ + std::list < QgsSymbol* >::iterator it = firstSymbolForFeature(f); + if (it == mSymbols.end()) //only draw features which are covered by a render item { + return false; + } + return true; +} + +void QgsGraduatedSymbolRenderer::renderFeature(QPainter * p, QgsFeature * f, QPixmap* pic, + double* scalefactor, bool selected, double widthScale) +{ + std::list < QgsSymbol* >::iterator it = firstSymbolForFeature(f); + + if (it == mSymbols.end()) //only draw features which are covered by a render item + { p->setPen(QPen(Qt::NoPen)); p->setBrush(QBrush(Qt::NoBrush)); return; Index: src/core/qgsrenderer.h =================================================================== --- src/core/qgsrenderer.h (revision 6456) +++ src/core/qgsrenderer.h (working copy) @@ -48,6 +48,9 @@ QgsRenderer(); /** Virtual destructor because we have virtual methods... */ virtual ~QgsRenderer() {}; + /** Determines if a feature will be rendered or not + * @param f a pointer to the feature to determine if rendering will happen*/ + virtual bool willRenderFeature(QgsFeature *f); /**A vector layer passes features to a renderer object to change the brush and pen of the qpainter @param p the painter storing brush and pen @param f a pointer to the feature to be rendered Index: src/core/qgsrenderer.cpp =================================================================== --- src/core/qgsrenderer.cpp (revision 6456) +++ src/core/qgsrenderer.cpp (working copy) @@ -13,6 +13,12 @@ } +bool QgsRenderer::willRenderFeature(QgsFeature *f) +{ + // Normally render the feature, unless told otherwise + return true; +} + void QgsRenderer::refreshLegend(std::list< std::pair >* symbologyList) const { if(symbologyList)