Fixed indentation

This commit is contained in:
Martin Dobias 2014-06-10 11:10:42 +07:00
parent 3853fc232a
commit 25346fe98f
5 changed files with 255 additions and 231 deletions

View File

@ -5,76 +5,76 @@ class QgsInvertedPolygonRenderer : public QgsFeatureRendererV2
%End %End
public: public:
/** Constructor /** Constructor
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned * @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned
*/ */
QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer = 0 ); QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer = 0 );
virtual ~QgsInvertedPolygonRenderer(); virtual ~QgsInvertedPolygonRenderer();
/** Used to clone this feature renderer.*/ /** Used to clone this feature renderer.*/
virtual QgsFeatureRendererV2* clone(); virtual QgsFeatureRendererV2* clone();
virtual void startRender( QgsRenderContext& context, const QgsFields& fields ); virtual void startRender( QgsRenderContext& context, const QgsFields& fields );
/** Renders a given feature. /** Renders a given feature.
* This will here collect features. The actual rendering will be postponed to stopRender() * This will here collect features. The actual rendering will be postponed to stopRender()
* @param feature the feature to render * @param feature the feature to render
* @param context the rendering context * @param context the rendering context
* @param layer the symbol layer to render, if that makes sense * @param layer the symbol layer to render, if that makes sense
* @param selected whether this feature has been selected (this will add decorations) * @param selected whether this feature has been selected (this will add decorations)
* @param drawVertexMarker whether this feature has vertex markers (in edit mode usually) * @param drawVertexMarker whether this feature has vertex markers (in edit mode usually)
* @returns true if the rendering was ok * @returns true if the rendering was ok
*/ */
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false ); virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
/** /**
* The actual rendering will take place here. * The actual rendering will take place here.
* Features collected during renderFeature() are rendered using the embedded feature renderer * Features collected during renderFeature() are rendered using the embedded feature renderer
*/ */
virtual void stopRender( QgsRenderContext& context ); virtual void stopRender( QgsRenderContext& context );
/** @returns a textual reprensation of the renderer */ /** @returns a textual reprensation of the renderer */
virtual QString dump() const; virtual QString dump() const;
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QList<QString> usedAttributes(); virtual QList<QString> usedAttributes();
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual int capabilities(); virtual int capabilities();
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QgsSymbolV2List symbols(); virtual QgsSymbolV2List symbols();
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature ); virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature );
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat ); virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize ); virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual bool willRenderFeature( QgsFeature& feat ); virtual bool willRenderFeature( QgsFeature& feat );
/** Creates a renderer out of an XML, for loading*/ /** Creates a renderer out of an XML, for loading*/
static QgsFeatureRendererV2* create( QDomElement& element ); static QgsFeatureRendererV2* create( QDomElement& element );
/** Creates an XML representation of the renderer. Used for saving purpose /** Creates an XML representation of the renderer. Used for saving purpose
* @param doc the XML document where to create the XML subtree * @param doc the XML document where to create the XML subtree
* @returns the created XML subtree * @returns the created XML subtree
*/ */
virtual QDomElement save( QDomDocument& doc ); virtual QDomElement save( QDomDocument& doc );
/** sets the embedded renderer /** sets the embedded renderer
* @param subRenderer the embedded renderer (will be cloned) * @param subRenderer the embedded renderer (will be cloned)
*/ */
void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer ); void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer );
/** @returns the current embedded renderer /** @returns the current embedded renderer
*/ */
const QgsFeatureRendererV2* embeddedRenderer() const; const QgsFeatureRendererV2* embeddedRenderer() const;
/** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/ /** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/
bool preprocessingEnabled() const; bool preprocessingEnabled() const;
/** /**
@param enabled enables or disables the preprocessing. @param enabled enables or disables the preprocessing.
When enabled, geometries will be merged with an union before being rendered. When enabled, geometries will be merged with an union before being rendered.
It allows to fix some rendering artefacts (when rendering overlapping polygons for instance). It allows to fix some rendering artefacts (when rendering overlapping polygons for instance).
This will involve some CPU-demanding computations and is thus disabled by default. This will involve some CPU-demanding computations and is thus disabled by default.
*/ */
void setPreprocessingEnabled( bool enabled ); void setPreprocessingEnabled( bool enabled );
}; };

View File

@ -28,12 +28,14 @@
#include <QDomElement> #include <QDomElement>
QgsInvertedPolygonRenderer::QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* subRenderer ) QgsInvertedPolygonRenderer::QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* subRenderer )
: QgsFeatureRendererV2( "invertedPolygonRenderer" ), mPreprocessingEnabled( false ) : QgsFeatureRendererV2( "invertedPolygonRenderer" ), mPreprocessingEnabled( false )
{ {
if ( subRenderer ) { if ( subRenderer )
{
setEmbeddedRenderer( subRenderer ); setEmbeddedRenderer( subRenderer );
} }
else { else
{
mSubRenderer.reset( QgsFeatureRendererV2::defaultRenderer( QGis::Polygon ) ); mSubRenderer.reset( QgsFeatureRendererV2::defaultRenderer( QGis::Polygon ) );
} }
} }
@ -44,10 +46,12 @@ QgsInvertedPolygonRenderer::~QgsInvertedPolygonRenderer()
void QgsInvertedPolygonRenderer::setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer ) void QgsInvertedPolygonRenderer::setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer )
{ {
if ( subRenderer ) { if ( subRenderer )
mSubRenderer.reset( const_cast<QgsFeatureRendererV2*>(subRenderer)->clone() ); {
mSubRenderer.reset( const_cast<QgsFeatureRendererV2*>( subRenderer )->clone() );
} }
else { else
{
mSubRenderer.reset( 0 ); mSubRenderer.reset( 0 );
} }
} }
@ -59,7 +63,8 @@ const QgsFeatureRendererV2* QgsInvertedPolygonRenderer::embeddedRenderer() const
void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const QgsFields& fields )
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return; return;
} }
@ -99,7 +104,7 @@ void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const Q
if ( context.coordinateTransform() ) if ( context.coordinateTransform() )
{ {
// disable projection // disable projection
mContext.setCoordinateTransform(0); mContext.setCoordinateTransform( 0 );
// recompute extent so that polygon clipping is correct // recompute extent so that polygon clipping is correct
QRect v( context.painter()->viewport() ); QRect v( context.painter()->viewport() );
mContext.setExtent( QgsRectangle( mtp.toMapCoordinates( v.topLeft() ), mtp.toMapCoordinates( v.bottomRight() ) ) ); mContext.setExtent( QgsRectangle( mtp.toMapCoordinates( v.topLeft() ), mtp.toMapCoordinates( v.bottomRight() ) ) );
@ -107,7 +112,7 @@ void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const Q
} }
mExtentPolygon.clear(); mExtentPolygon.clear();
mExtentPolygon.append(exteriorRing); mExtentPolygon.append( exteriorRing );
mSubRenderer->startRender( mContext, fields ); mSubRenderer->startRender( mContext, fields );
} }
@ -122,7 +127,7 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
// store this feature as a feature to render with decoration if needed // store this feature as a feature to render with decoration if needed
if ( selected || drawVertexMarker ) if ( selected || drawVertexMarker )
{ {
mFeatureDecorations.append( FeatureDecoration( feature, selected, drawVertexMarker, layer) ); mFeatureDecorations.append( FeatureDecoration( feature, selected, drawVertexMarker, layer ) );
} }
// Features are grouped by category of symbols (returned by symbol(s)ForFeature) // Features are grouped by category of symbols (returned by symbol(s)ForFeature)
@ -131,7 +136,7 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
// that have transparency. // that have transparency.
// //
// In order to assign a unique category to a set of symbols // In order to assign a unique category to a set of symbols
// during each rendering session (between startRender() and stopRender()), // during each rendering session (between startRender() and stopRender()),
// we build an unique id as a QByteArray that is the concatenation // we build an unique id as a QByteArray that is the concatenation
// of each symbol's memory address. // of each symbol's memory address.
// The only assumption made here is that symbol(s)ForFeature will // The only assumption made here is that symbol(s)ForFeature will
@ -140,19 +145,21 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
// This QByteArray can then be used as a key for a QMap where the list of // This QByteArray can then be used as a key for a QMap where the list of
// features for this category is stored // features for this category is stored
QByteArray catId; QByteArray catId;
if ( capabilities() & MoreSymbolsPerFeature ) { if ( capabilities() & MoreSymbolsPerFeature )
{
QgsSymbolV2List syms( mSubRenderer->symbolsForFeature( feature ) ); QgsSymbolV2List syms( mSubRenderer->symbolsForFeature( feature ) );
foreach ( QgsSymbolV2* sym, syms ) foreach ( QgsSymbolV2* sym, syms )
{ {
// append the memory address // append the memory address
catId.append( reinterpret_cast<const char*>(&sym), sizeof(sym) ); catId.append( reinterpret_cast<const char*>( &sym ), sizeof( sym ) );
} }
} }
else else
{ {
QgsSymbolV2* sym = mSubRenderer->symbolForFeature( feature ); QgsSymbolV2* sym = mSubRenderer->symbolForFeature( feature );
if (sym) { if ( sym )
catId.append( reinterpret_cast<const char*>(&sym), sizeof(sym) ); {
catId.append( reinterpret_cast<const char*>( &sym ), sizeof( sym ) );
} }
} }
@ -161,7 +168,7 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
return false; return false;
} }
if ( ! mSymbolCategories.contains(catId) ) if ( ! mSymbolCategories.contains( catId ) )
{ {
// the exterior ring must be a square in the destination CRS // the exterior ring must be a square in the destination CRS
CombinedFeature cFeat; CombinedFeature cFeat;
@ -187,12 +194,14 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
geom->transform( *xform ); geom->transform( *xform );
} }
if ( (geom->wkbType() == QGis::WKBPolygon) || if (( geom->wkbType() == QGis::WKBPolygon ) ||
(geom->wkbType() == QGis::WKBPolygon25D) ) { ( geom->wkbType() == QGis::WKBPolygon25D ) )
multi.append(geom->asPolygon() ); {
multi.append( geom->asPolygon() );
} }
else if ( (geom->wkbType() == QGis::WKBMultiPolygon) || else if (( geom->wkbType() == QGis::WKBMultiPolygon ) ||
(geom->wkbType() == QGis::WKBMultiPolygon25D) ) { ( geom->wkbType() == QGis::WKBMultiPolygon25D ) )
{
multi = geom->asMultiPolygon(); multi = geom->asMultiPolygon();
} }
@ -202,7 +211,7 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
if ( ! cFeat.feature.geometry() ) if ( ! cFeat.feature.geometry() )
{ {
// first feature: add the current geometry // first feature: add the current geometry
cFeat.feature.setGeometry( new QgsGeometry(*geom) ); cFeat.feature.setGeometry( new QgsGeometry( *geom ) );
} }
else else
{ {
@ -227,12 +236,14 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
// No validity check is done, on purpose, it will be very slow and painting // No validity check is done, on purpose, it will be very slow and painting
// operations do not need geometries to be valid // operations do not need geometries to be valid
for ( int i = 0; i < multi.size(); i++ ) { for ( int i = 0; i < multi.size(); i++ )
{
// add the exterior ring as interior ring to the first polygon // add the exterior ring as interior ring to the first polygon
cFeat.multiPolygon[0].append( multi[i][0] ); cFeat.multiPolygon[0].append( multi[i][0] );
// add interior rings as new polygons // add interior rings as new polygons
for ( int j = 1; j < multi[i].size(); j++ ) { for ( int j = 1; j < multi[i].size(); j++ )
{
QgsPolygon new_poly; QgsPolygon new_poly;
new_poly.append( multi[i][j] ); new_poly.append( multi[i][j] );
cFeat.multiPolygon.append( new_poly ); cFeat.multiPolygon.append( new_poly );
@ -244,7 +255,8 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context ) void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return; return;
} }
if ( !context.painter() ) if ( !context.painter() )
@ -252,7 +264,7 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
return; return;
} }
for ( FeatureCategoryMap::iterator cit = mFeaturesCategoryMap.begin(); cit != mFeaturesCategoryMap.end(); ++cit) for ( FeatureCategoryMap::iterator cit = mFeaturesCategoryMap.begin(); cit != mFeaturesCategoryMap.end(); ++cit )
{ {
QgsFeature feat( cit->feature ); QgsFeature feat( cit->feature );
if ( !mPreprocessingEnabled ) if ( !mPreprocessingEnabled )
@ -289,7 +301,7 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
} }
// draw feature decorations // draw feature decorations
foreach (FeatureDecoration deco, mFeatureDecorations ) foreach ( FeatureDecoration deco, mFeatureDecorations )
{ {
mSubRenderer->renderFeature( deco.feature, mContext, deco.layer, deco.selected, deco.drawMarkers ); mSubRenderer->renderFeature( deco.feature, mContext, deco.layer, deco.selected, deco.drawMarkers );
} }
@ -299,7 +311,8 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
QString QgsInvertedPolygonRenderer::dump() const QString QgsInvertedPolygonRenderer::dump() const
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return "INVERTED: NULL"; return "INVERTED: NULL";
} }
return "INVERTED [" + mSubRenderer->dump() + "]"; return "INVERTED [" + mSubRenderer->dump() + "]";
@ -350,7 +363,8 @@ QDomElement QgsInvertedPolygonRenderer::save( QDomDocument& doc )
QgsSymbolV2* QgsInvertedPolygonRenderer::symbolForFeature( QgsFeature& feature ) QgsSymbolV2* QgsInvertedPolygonRenderer::symbolForFeature( QgsFeature& feature )
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return 0; return 0;
} }
return mSubRenderer->symbolForFeature( feature ); return mSubRenderer->symbolForFeature( feature );
@ -358,7 +372,8 @@ QgsSymbolV2* QgsInvertedPolygonRenderer::symbolForFeature( QgsFeature& feature )
QgsSymbolV2List QgsInvertedPolygonRenderer::symbolsForFeature( QgsFeature& feature ) QgsSymbolV2List QgsInvertedPolygonRenderer::symbolsForFeature( QgsFeature& feature )
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return QgsSymbolV2List(); return QgsSymbolV2List();
} }
return mSubRenderer->symbolsForFeature( feature ); return mSubRenderer->symbolsForFeature( feature );
@ -366,7 +381,8 @@ QgsSymbolV2List QgsInvertedPolygonRenderer::symbolsForFeature( QgsFeature& featu
QgsSymbolV2List QgsInvertedPolygonRenderer::symbols() QgsSymbolV2List QgsInvertedPolygonRenderer::symbols()
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return QgsSymbolV2List(); return QgsSymbolV2List();
} }
return mSubRenderer->symbols(); return mSubRenderer->symbols();
@ -374,7 +390,8 @@ QgsSymbolV2List QgsInvertedPolygonRenderer::symbols()
int QgsInvertedPolygonRenderer::capabilities() int QgsInvertedPolygonRenderer::capabilities()
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return 0; return 0;
} }
return mSubRenderer->capabilities(); return mSubRenderer->capabilities();
@ -382,7 +399,8 @@ int QgsInvertedPolygonRenderer::capabilities()
QList<QString> QgsInvertedPolygonRenderer::usedAttributes() QList<QString> QgsInvertedPolygonRenderer::usedAttributes()
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return QList<QString>(); return QList<QString>();
} }
return mSubRenderer->usedAttributes(); return mSubRenderer->usedAttributes();
@ -390,7 +408,8 @@ QList<QString> QgsInvertedPolygonRenderer::usedAttributes()
QgsLegendSymbologyList QgsInvertedPolygonRenderer::legendSymbologyItems( QSize iconSize ) QgsLegendSymbologyList QgsInvertedPolygonRenderer::legendSymbologyItems( QSize iconSize )
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return QgsLegendSymbologyList(); return QgsLegendSymbologyList();
} }
return mSubRenderer->legendSymbologyItems( iconSize ); return mSubRenderer->legendSymbologyItems( iconSize );
@ -398,7 +417,8 @@ QgsLegendSymbologyList QgsInvertedPolygonRenderer::legendSymbologyItems( QSize i
QgsLegendSymbolList QgsInvertedPolygonRenderer::legendSymbolItems( double scaleDenominator, QString rule ) QgsLegendSymbolList QgsInvertedPolygonRenderer::legendSymbolItems( double scaleDenominator, QString rule )
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return QgsLegendSymbolList(); return QgsLegendSymbolList();
} }
return mSubRenderer->legendSymbolItems( scaleDenominator, rule ); return mSubRenderer->legendSymbolItems( scaleDenominator, rule );
@ -406,8 +426,10 @@ QgsLegendSymbolList QgsInvertedPolygonRenderer::legendSymbolItems( double scaleD
bool QgsInvertedPolygonRenderer::willRenderFeature( QgsFeature& feat ) bool QgsInvertedPolygonRenderer::willRenderFeature( QgsFeature& feat )
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return false; return false;
} }
return mSubRenderer->willRenderFeature( feat ); return mSubRenderer->willRenderFeature( feat );
} }

View File

@ -31,7 +31,7 @@
* *
* It is designed on top of another feature renderer, which is called "embedded" * It is designed on top of another feature renderer, which is called "embedded"
* Most of the methods are then only proxies to the embedded renderer. * Most of the methods are then only proxies to the embedded renderer.
* *
* Features are collected to form one "inverted" polygon * Features are collected to form one "inverted" polygon
* during renderFeature() and rendered on stopRender(). * during renderFeature() and rendered on stopRender().
*/ */
@ -39,128 +39,128 @@ class CORE_EXPORT QgsInvertedPolygonRenderer : public QgsFeatureRendererV2
{ {
public: public:
/** Constructor /** Constructor
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned * @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned
*/ */
QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer = 0 ); QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer = 0 );
virtual ~QgsInvertedPolygonRenderer(); virtual ~QgsInvertedPolygonRenderer();
/** Used to clone this feature renderer.*/ /** Used to clone this feature renderer.*/
virtual QgsFeatureRendererV2* clone(); virtual QgsFeatureRendererV2* clone();
virtual void startRender( QgsRenderContext& context, const QgsFields& fields ); virtual void startRender( QgsRenderContext& context, const QgsFields& fields );
/** Renders a given feature. /** Renders a given feature.
* This will here collect features. The actual rendering will be postponed to stopRender() * This will here collect features. The actual rendering will be postponed to stopRender()
* @param feature the feature to render * @param feature the feature to render
* @param context the rendering context * @param context the rendering context
* @param layer the symbol layer to render, if that makes sense * @param layer the symbol layer to render, if that makes sense
* @param selected whether this feature has been selected (this will add decorations) * @param selected whether this feature has been selected (this will add decorations)
* @param drawVertexMarker whether this feature has vertex markers (in edit mode usually) * @param drawVertexMarker whether this feature has vertex markers (in edit mode usually)
* @returns true if the rendering was ok * @returns true if the rendering was ok
*/ */
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false ); virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
/** /**
* The actual rendering will take place here. * The actual rendering will take place here.
* Features collected during renderFeature() are rendered using the embedded feature renderer * Features collected during renderFeature() are rendered using the embedded feature renderer
*/ */
virtual void stopRender( QgsRenderContext& context ); virtual void stopRender( QgsRenderContext& context );
/** @returns a textual reprensation of the renderer */ /** @returns a textual reprensation of the renderer */
virtual QString dump() const; virtual QString dump() const;
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QList<QString> usedAttributes(); virtual QList<QString> usedAttributes();
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual int capabilities(); virtual int capabilities();
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QgsSymbolV2List symbols(); virtual QgsSymbolV2List symbols();
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature ); virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature );
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat ); virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize ); virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual QgsLegendSymbolList legendSymbolItems( double scaleDenominator = -1, QString rule = "" ); virtual QgsLegendSymbolList legendSymbolItems( double scaleDenominator = -1, QString rule = "" );
/** Proxy that will call this method on the embedded renderer. */ /** Proxy that will call this method on the embedded renderer. */
virtual bool willRenderFeature( QgsFeature& feat ); virtual bool willRenderFeature( QgsFeature& feat );
/** Creates a renderer out of an XML, for loading*/ /** Creates a renderer out of an XML, for loading*/
static QgsFeatureRendererV2* create( QDomElement& element ); static QgsFeatureRendererV2* create( QDomElement& element );
/** Creates an XML representation of the renderer. Used for saving purpose /** Creates an XML representation of the renderer. Used for saving purpose
* @param doc the XML document where to create the XML subtree * @param doc the XML document where to create the XML subtree
* @returns the created XML subtree * @returns the created XML subtree
*/ */
virtual QDomElement save( QDomDocument& doc ); virtual QDomElement save( QDomDocument& doc );
/** sets the embedded renderer /** sets the embedded renderer
* @param subRenderer the embedded renderer (will be cloned) * @param subRenderer the embedded renderer (will be cloned)
*/ */
void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer ); void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer );
/** @returns the current embedded renderer /** @returns the current embedded renderer
*/ */
const QgsFeatureRendererV2* embeddedRenderer() const; const QgsFeatureRendererV2* embeddedRenderer() const;
/** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/ /** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/
bool preprocessingEnabled() const { return mPreprocessingEnabled; } bool preprocessingEnabled() const { return mPreprocessingEnabled; }
/** /**
@param enabled enables or disables the preprocessing. @param enabled enables or disables the preprocessing.
When enabled, geometries will be merged with an union before being rendered. When enabled, geometries will be merged with an union before being rendered.
It allows to fix some rendering artefacts (when rendering overlapping polygons for instance). It allows to fix some rendering artefacts (when rendering overlapping polygons for instance).
This will involve some CPU-demanding computations and is thus disabled by default. This will involve some CPU-demanding computations and is thus disabled by default.
*/ */
void setPreprocessingEnabled( bool enabled ) { mPreprocessingEnabled = enabled; } void setPreprocessingEnabled( bool enabled ) { mPreprocessingEnabled = enabled; }
private: private:
/** Private copy constructor. @see clone() */ /** Private copy constructor. @see clone() */
QgsInvertedPolygonRenderer( const QgsInvertedPolygonRenderer& ); QgsInvertedPolygonRenderer( const QgsInvertedPolygonRenderer& );
/** Private assignment operator. @see clone() */ /** Private assignment operator. @see clone() */
QgsInvertedPolygonRenderer& operator=( const QgsInvertedPolygonRenderer& ); QgsInvertedPolygonRenderer& operator=( const QgsInvertedPolygonRenderer& );
/** Embedded renderer */ /** Embedded renderer */
QScopedPointer<QgsFeatureRendererV2> mSubRenderer; QScopedPointer<QgsFeatureRendererV2> mSubRenderer;
/** Structure where the reversed geometry is built during renderFeature */ /** Structure where the reversed geometry is built during renderFeature */
struct CombinedFeature struct CombinedFeature
{ {
QgsMultiPolygon multiPolygon; //< the final combined geometry QgsMultiPolygon multiPolygon; //< the final combined geometry
QgsFeature feature; //< one feature (for attriute-based rendering) QgsFeature feature; //< one feature (for attriute-based rendering)
}; };
typedef QVector<CombinedFeature> FeatureCategoryMap; typedef QVector<CombinedFeature> FeatureCategoryMap;
/** where features are stored, based on the index of their symbol category @see mSymbolCategories */ /** where features are stored, based on the index of their symbol category @see mSymbolCategories */
FeatureCategoryMap mFeaturesCategoryMap; FeatureCategoryMap mFeaturesCategoryMap;
/** maps a category to an index */ /** maps a category to an index */
QMap<QByteArray, int> mSymbolCategories; QMap<QByteArray, int> mSymbolCategories;
/** the polygon used as exterior ring that covers the current extent */ /** the polygon used as exterior ring that covers the current extent */
QgsPolygon mExtentPolygon; QgsPolygon mExtentPolygon;
/** the context used for rendering */ /** the context used for rendering */
QgsRenderContext mContext; QgsRenderContext mContext;
/** fields of each feature*/ /** fields of each feature*/
QgsFields mFields; QgsFields mFields;
/** Class used to represent features that must be rendered /** Class used to represent features that must be rendered
with decorations (selection, vertex markers) with decorations (selection, vertex markers)
*/ */
struct FeatureDecoration struct FeatureDecoration
{ {
QgsFeature feature; QgsFeature feature;
bool selected; bool selected;
bool drawMarkers; bool drawMarkers;
int layer; int layer;
FeatureDecoration( QgsFeature& a_feature, bool a_selected, bool a_drawMarkers, int a_layer ) : FeatureDecoration( QgsFeature& a_feature, bool a_selected, bool a_drawMarkers, int a_layer ) :
feature(a_feature),selected(a_selected), drawMarkers(a_drawMarkers), layer(a_layer) {} feature( a_feature ), selected( a_selected ), drawMarkers( a_drawMarkers ), layer( a_layer ) {}
}; };
QList<FeatureDecoration> mFeatureDecorations; QList<FeatureDecoration> mFeatureDecorations;
/** whether to preprocess (merge) geometries before rendering*/ /** whether to preprocess (merge) geometries before rendering*/
bool mPreprocessingEnabled; bool mPreprocessingEnabled;
}; };

View File

@ -29,7 +29,8 @@ QgsRendererV2Widget* QgsInvertedPolygonRendererWidget::create( QgsVectorLayer* l
QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
: QgsRendererV2Widget( layer, style ) : QgsRendererV2Widget( layer, style )
{ {
if ( !layer ) { if ( !layer )
{
return; return;
} }
@ -66,7 +67,7 @@ QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLay
else else
{ {
// an existing inverted renderer // an existing inverted renderer
mRenderer.reset( static_cast<QgsInvertedPolygonRenderer*>(renderer) ); mRenderer.reset( static_cast<QgsInvertedPolygonRenderer*>( renderer ) );
mMergePolygonsCheckBox->blockSignals( true ); mMergePolygonsCheckBox->blockSignals( true );
mMergePolygonsCheckBox->setCheckState( mRenderer->preprocessingEnabled() ? Qt::Checked : Qt::Unchecked ); mMergePolygonsCheckBox->setCheckState( mRenderer->preprocessingEnabled() ? Qt::Checked : Qt::Unchecked );
mMergePolygonsCheckBox->blockSignals( false ); mMergePolygonsCheckBox->blockSignals( false );
@ -81,7 +82,7 @@ QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLay
for ( ; it != rendererList.constEnd(); ++it, ++idx ) for ( ; it != rendererList.constEnd(); ++it, ++idx )
{ {
if (( *it != "invertedPolygonRenderer" ) && //< an inverted renderer cannot contain another inverted renderer if (( *it != "invertedPolygonRenderer" ) && //< an inverted renderer cannot contain another inverted renderer
( *it != "pointDisplacement" )) //< an inverted renderer can only contain a polygon renderer ( *it != "pointDisplacement" ) ) //< an inverted renderer can only contain a polygon renderer
{ {
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( *it ); QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( *it );
mRendererComboBox->addItem( m->icon(), m->visibleName(), /* data */ *it ); mRendererComboBox->addItem( m->icon(), m->visibleName(), /* data */ *it );
@ -123,9 +124,10 @@ void QgsInvertedPolygonRendererWidget::on_mRendererComboBox_currentIndexChanged(
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( rendererId ); QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( rendererId );
if ( m ) if ( m )
{ {
mEmbeddedRendererWidget.reset( m->createRendererWidget( mLayer, mStyle, const_cast<QgsFeatureRendererV2*>(mRenderer->embeddedRenderer())->clone() ) ); mEmbeddedRendererWidget.reset( m->createRendererWidget( mLayer, mStyle, const_cast<QgsFeatureRendererV2*>( mRenderer->embeddedRenderer() )->clone() ) );
if ( mLayout->count() > 2 ) { if ( mLayout->count() > 2 )
{
// remove the current renderer widget // remove the current renderer widget
mLayout->takeAt( 2 ); mLayout->takeAt( 2 );
} }

View File

@ -26,35 +26,35 @@ class QMenu;
*/ */
class GUI_EXPORT QgsInvertedPolygonRendererWidget : public QgsRendererV2Widget, private Ui::QgsInvertedPolygonRendererWidgetBase class GUI_EXPORT QgsInvertedPolygonRendererWidget : public QgsRendererV2Widget, private Ui::QgsInvertedPolygonRendererWidgetBase
{ {
Q_OBJECT Q_OBJECT
public: public:
/** static creation method /** static creation method
* @param layer the layer where this renderer is applied * @param layer the layer where this renderer is applied
* @param style * @param style
* @param renderer the mask renderer (will take ownership) * @param renderer the mask renderer (will take ownership)
*/ */
static QgsRendererV2Widget* create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ); static QgsRendererV2Widget* create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
/** Constructor /** Constructor
* @param layer the layer where this renderer is applied * @param layer the layer where this renderer is applied
* @param style * @param style
* @param renderer the mask renderer (will take ownership) * @param renderer the mask renderer (will take ownership)
*/ */
QgsInvertedPolygonRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ); QgsInvertedPolygonRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
/** @returns the current feature renderer */ /** @returns the current feature renderer */
virtual QgsFeatureRendererV2* renderer(); virtual QgsFeatureRendererV2* renderer();
protected: protected:
/** the mask renderer */ /** the mask renderer */
QScopedPointer<QgsInvertedPolygonRenderer> mRenderer; QScopedPointer<QgsInvertedPolygonRenderer> mRenderer;
/** the widget used to represent the mask's embedded renderer */ /** the widget used to represent the mask's embedded renderer */
QScopedPointer<QgsRendererV2Widget> mEmbeddedRendererWidget; QScopedPointer<QgsRendererV2Widget> mEmbeddedRendererWidget;
private slots: private slots:
void on_mRendererComboBox_currentIndexChanged( int index ); void on_mRendererComboBox_currentIndexChanged( int index );
void on_mMergePolygonsCheckBox_stateChanged( int state ); void on_mMergePolygonsCheckBox_stateChanged( int state );
}; };