sip sync and indentation update

This commit is contained in:
Juergen E. Fischer 2014-05-24 12:07:23 +02:00
parent 7e5b6f735d
commit a168b9031b
8 changed files with 287 additions and 254 deletions

View File

@ -5,66 +5,70 @@ class QgsInvertedPolygonRenderer : 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 /Transfer/ = 0 ); QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer /Transfer/ = 0 );
virtual ~QgsInvertedPolygonRenderer(); virtual ~QgsInvertedPolygonRenderer();
/** Used to clone this feature renderer.*/ /** Used to clone this feature renderer.*/
virtual QgsFeatureRendererV2* clone() /Factory/; virtual QgsFeatureRendererV2* clone() /Factory/;
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 representation 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 ); @note not available in python bindings
*/
// virtual QgsLegendSymbolList legendSymbolItems( double scaleDenominator = -1, QString rule = "" );
/** Proxy that will call this method on the embedded renderer. */
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 ) /Factory/; static QgsFeatureRendererV2* create( QDomElement& element ) /Factory/;
/** 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;
}; };

View File

@ -3,21 +3,21 @@ class QgsInvertedPolygonRendererWidget : QgsRendererV2Widget
%TypeHeaderCode %TypeHeaderCode
#include <qgsinvertedpolygonrendererwidget.h> #include <qgsinvertedpolygonrendererwidget.h>
%End %End
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 ) /Factory/; static QgsRendererV2Widget* create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) /Factory/;
/** 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();
}; };

View File

@ -22,30 +22,6 @@ set -e
export elcr="$(tput el)$(tput cr)" export elcr="$(tput el)$(tput cr)"
find python src tests -type f -print | while read f; do find python src tests -type f -print | while read f; do
case "$f" in
src/app/gps/qwtpolar-*|src/core/spatialite/*|src/core/spatialindex/src/*|src/core/gps/qextserialport/*|src/plugins/grass/qtermwidget/*|src/astyle/*|python/ext-libs/*|src/providers/sqlanywhere/sqlanyconnection/*|src/providers/spatialite/qspatialite/*|src/plugins/dxf2shp_converter/dxflib/src/*|src/plugins/globe/osgEarthQt/*|src/plugins/globe/osgEarthUtil/*)
echo $f skipped
continue
;;
*.cpp|*.h|*.c|*.h|*.cxx|*.hxx|*.c++|*.h++|*.cc|*.hh|*.C|*.H|*.hpp)
cmd=astyle.sh
;;
*.ui|*.qgm|*.txt|*.t2t|*.sip|resources/context_help/*)
cmd="flip -ub"
;;
*.py)
cmd="perl -i.prepare -pe 's/[\r\t ]+$//;'"
;;
*)
echo -ne "$f skipped $elcr"
continue
;;
esac
if [ -f "$f.astyle" ]; then if [ -f "$f.astyle" ]; then
# reformat backup # reformat backup
cp "$f.astyle" "$f" cp "$f.astyle" "$f"
@ -56,8 +32,8 @@ find python src tests -type f -print | while read f; do
touch -r "$f" "$f.astyle" touch -r "$f" "$f.astyle"
fi fi
echo -ne "Reformating $f $elcr" echo -ne "Reformatting $f $elcr"
eval "$cmd '$f'" astyle.sh "$f"
done done
echo echo

View File

@ -59,6 +59,30 @@ $ARTISTIC_STYLE_OPTIONS \
--unpad=paren" --unpad=paren"
for f in "$@"; do for f in "$@"; do
case "$f" in
src/app/gps/qwtpolar-*|src/core/spatialite/*|src/core/spatialindex/src/*|src/core/gps/qextserialport/*|src/plugins/grass/qtermwidget/*|src/astyle/*|python/ext-libs/*|src/providers/sqlanywhere/sqlanyconnection/*|src/providers/spatialite/qspatialite/*|src/plugins/dxf2shp_converter/dxflib/src/*|src/plugins/globe/osgEarthQt/*|src/plugins/globe/osgEarthUtil/*)
echo $f skipped
continue
;;
*.cpp|*.h|*.c|*.h|*.cxx|*.hxx|*.c++|*.h++|*.cc|*.hh|*.C|*.H|*.hpp)
cmd="$ASTYLE $ARTISTIC_STYLE_OPTIONS"
;;
*.ui|*.qgm|*.txt|*.t2t|*.sip|resources/context_help/*)
cmd=:
;;
*.py)
cmd="perl -i.prepare -pe 's/[\r\t ]+$//;'"
;;
*)
echo -ne "$f skipped $elcr"
continue
;;
esac
if ! [ -f "$f" ]; then if ! [ -f "$f" ]; then
echo "$f not found" >&2 echo "$f not found" >&2
continue continue
@ -66,5 +90,5 @@ for f in "$@"; do
flip -ub "$f" flip -ub "$f"
#qgsloggermig.pl "$f" #qgsloggermig.pl "$f"
$ASTYLE $ARTISTIC_STYLE_OPTIONS "$f" eval "$cmd '$f'"
done done

View File

@ -28,12 +28,14 @@
#include <QDomElement> #include <QDomElement>
QgsInvertedPolygonRenderer::QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* subRenderer ) QgsInvertedPolygonRenderer::QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* subRenderer )
: QgsFeatureRendererV2( "invertedPolygonRenderer" ) : QgsFeatureRendererV2( "invertedPolygonRenderer" )
{ {
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;
} }
@ -90,14 +95,14 @@ void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const Q
// If we don't do that, there is no need to have a simple rectangular extent // If we don't do that, there is no need to have a simple rectangular extent
// that covers the whole screen // that covers the whole screen
// (a rectangle in the destCRS cannot be expressed as valid coordinates in the sourceCRS in general) // (a rectangle in the destCRS cannot be expressed as valid coordinates in the sourceCRS in general)
if (mTransform) if ( mTransform )
{ {
// disable projection // disable projection
context.setCoordinateTransform(0); context.setCoordinateTransform( 0 );
} }
mExtentPolygon.clear(); mExtentPolygon.clear();
mExtentPolygon.append(exteriorRing); mExtentPolygon.append( exteriorRing );
} }
bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer, bool selected, bool drawVertexMarker ) bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer, bool selected, bool drawVertexMarker )
@ -107,7 +112,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)
@ -116,7 +121,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
@ -125,19 +130,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 ) );
} }
} }
@ -155,7 +162,7 @@ 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
if ( ! mFeaturesCategoryMap.contains(catId) ) if ( ! mFeaturesCategoryMap.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;
@ -173,21 +180,26 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
{ {
return false; return false;
} }
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();
} }
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
if ( mTransform ) { if ( mTransform )
{
QgsPolyline new_ls; QgsPolyline new_ls;
QgsPolyline& old_ls = multi[i][0]; QgsPolyline& old_ls = multi[i][0];
for ( int k = 0; k < old_ls.size(); k++ ) { for ( int k = 0; k < old_ls.size(); k++ )
{
new_ls.append( mTransform->transform( old_ls[k] ) ); new_ls.append( mTransform->transform( old_ls[k] ) );
} }
cFeat.multiPolygon[0].append( new_ls ); cFeat.multiPolygon[0].append( new_ls );
@ -197,12 +209,15 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
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;
if ( mTransform ) { if ( mTransform )
{
QgsPolyline new_ls; QgsPolyline new_ls;
QgsPolyline& old_ls = multi[i][j]; QgsPolyline& old_ls = multi[i][j];
for ( int k = 0; k < old_ls.size(); k++ ) { for ( int k = 0; k < old_ls.size(); k++ )
{
new_ls.append( mTransform->transform( old_ls[k] ) ); new_ls.append( mTransform->transform( old_ls[k] ) );
} }
new_poly.append( new_ls ); new_poly.append( new_ls );
@ -220,11 +235,12 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context ) void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
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.value().feature ); QgsFeature feat( cit.value().feature );
feat.setGeometry( QgsGeometry::fromMultiPolygon( cit.value().multiPolygon ) ); feat.setGeometry( QgsGeometry::fromMultiPolygon( cit.value().multiPolygon ) );
@ -244,7 +260,7 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
} }
// draw feature decorations // draw feature decorations
foreach (FeatureDecoration deco, mFeatureDecorations ) foreach ( FeatureDecoration deco, mFeatureDecorations )
{ {
mSubRenderer->renderFeature( deco.feature, context, deco.layer, deco.selected, deco.drawMarkers ); mSubRenderer->renderFeature( deco.feature, context, deco.layer, deco.selected, deco.drawMarkers );
} }
@ -260,7 +276,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() + "]";
@ -304,7 +321,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 );
@ -312,7 +330,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 );
@ -320,7 +339,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();
@ -328,7 +348,8 @@ QgsSymbolV2List QgsInvertedPolygonRenderer::symbols()
int QgsInvertedPolygonRenderer::capabilities() int QgsInvertedPolygonRenderer::capabilities()
{ {
if ( !mSubRenderer ) { if ( !mSubRenderer )
{
return 0; return 0;
} }
return mSubRenderer->capabilities(); return mSubRenderer->capabilities();
@ -336,7 +357,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();
@ -344,7 +366,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 );
@ -352,7 +375,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 );
@ -360,7 +384,8 @@ 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().
* *
@ -41,112 +41,114 @@ 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 representation 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 = "" ); @note not available in python bindings
/** Proxy that will call this method on the embedded renderer. */ */
virtual bool willRenderFeature( QgsFeature& feat ); virtual QgsLegendSymbolList legendSymbolItems( double scaleDenominator = -1, QString rule = "" );
/** Proxy that will call this method on the embedded renderer. */
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;
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 QMap< QByteArray, CombinedFeature > FeatureCategoryMap; typedef QMap< QByteArray, CombinedFeature > FeatureCategoryMap;
/** where features are stored, based on their symbol category */ /** where features are stored, based on their symbol category */
FeatureCategoryMap mFeaturesCategoryMap; FeatureCategoryMap mFeaturesCategoryMap;
/** 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 current coordinate transform (or null) */ /** the current coordinate transform (or null) */
const QgsCoordinateTransform* mTransform; const QgsCoordinateTransform* mTransform;
/** 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;
}; };

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 ) );
} }
int currentEmbeddedIdx = 0; int currentEmbeddedIdx = 0;
@ -78,7 +79,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 );
@ -120,9 +121,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() > 1 ) { if ( mLayout->count() > 1 )
{
// remove the current renderer widget // remove the current renderer widget
mLayout->takeAt( 1 ); mLayout->takeAt( 1 );
} }

View File

@ -28,34 +28,34 @@ 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 );
}; };