Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsinvertedpolygonrenderer.cpp 3 : : --------------------- 4 : : begin : April 2014 5 : : copyright : (C) 2014 Hugo Mercier / Oslandia 6 : : email : hugo dot mercier at oslandia dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #include "qgsinvertedpolygonrenderer.h" 17 : : 18 : : #include "qgssymbol.h" 19 : : #include "qgssymbollayerutils.h" 20 : : 21 : : #include "qgslogger.h" 22 : : #include "qgsfeature.h" 23 : : #include "qgsvectorlayer.h" 24 : : #include "qgssymbollayer.h" 25 : : #include "qgsogcutils.h" 26 : : #include "qgspainteffect.h" 27 : : #include "qgspainteffectregistry.h" 28 : : #include "qgsstyleentityvisitor.h" 29 : : 30 : : #include <QDomDocument> 31 : : #include <QDomElement> 32 : : 33 : 0 : QgsInvertedPolygonRenderer::QgsInvertedPolygonRenderer( QgsFeatureRenderer *subRenderer ) 34 : 0 : : QgsMergedFeatureRenderer( QStringLiteral( "invertedPolygonRenderer" ), subRenderer ) 35 : 0 : { 36 : 0 : if ( !subRenderer ) 37 : : { 38 : 0 : mSubRenderer.reset( QgsFeatureRenderer::defaultRenderer( QgsWkbTypes::PolygonGeometry ) ); 39 : 0 : } 40 : 0 : mOperation = InvertOnly; 41 : 0 : } 42 : : 43 : 0 : QString QgsInvertedPolygonRenderer::dump() const 44 : : { 45 : 0 : if ( !mSubRenderer ) 46 : : { 47 : 0 : return QStringLiteral( "INVERTED: NULL" ); 48 : : } 49 : 0 : return "INVERTED [" + mSubRenderer->dump() + ']'; 50 : 0 : } 51 : : 52 : 0 : QgsInvertedPolygonRenderer *QgsInvertedPolygonRenderer::clone() const 53 : : { 54 : 0 : QgsInvertedPolygonRenderer *newRenderer = nullptr; 55 : 0 : if ( !mSubRenderer ) 56 : : { 57 : 0 : newRenderer = new QgsInvertedPolygonRenderer( nullptr ); 58 : 0 : } 59 : : else 60 : : { 61 : 0 : newRenderer = new QgsInvertedPolygonRenderer( mSubRenderer->clone() ); 62 : : } 63 : 0 : newRenderer->setPreprocessingEnabled( preprocessingEnabled() ); 64 : 0 : copyRendererData( newRenderer ); 65 : 0 : return newRenderer; 66 : 0 : } 67 : : 68 : 0 : QgsFeatureRenderer *QgsInvertedPolygonRenderer::create( QDomElement &element, const QgsReadWriteContext &context ) 69 : : { 70 : 0 : QgsInvertedPolygonRenderer *r = new QgsInvertedPolygonRenderer(); 71 : : //look for an embedded renderer <renderer-v2> 72 : 0 : QDomElement embeddedRendererElem = element.firstChildElement( QStringLiteral( "renderer-v2" ) ); 73 : 0 : if ( !embeddedRendererElem.isNull() ) 74 : : { 75 : 0 : QgsFeatureRenderer *renderer = QgsFeatureRenderer::load( embeddedRendererElem, context ); 76 : 0 : r->setEmbeddedRenderer( renderer ); 77 : 0 : } 78 : 0 : r->setPreprocessingEnabled( element.attribute( QStringLiteral( "preprocessing" ), QStringLiteral( "0" ) ).toInt() == 1 ); 79 : 0 : return r; 80 : 0 : } 81 : : 82 : 0 : QDomElement QgsInvertedPolygonRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context ) 83 : : { 84 : : // clazy:skip 85 : : 86 : 0 : QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME ); 87 : 0 : rendererElem.setAttribute( QStringLiteral( "type" ), QStringLiteral( "invertedPolygonRenderer" ) ); 88 : 0 : rendererElem.setAttribute( QStringLiteral( "preprocessing" ), preprocessingEnabled() ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); 89 : 0 : rendererElem.setAttribute( QStringLiteral( "forceraster" ), ( mForceRaster ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) ); 90 : : 91 : 0 : if ( mSubRenderer ) 92 : : { 93 : 0 : QDomElement embeddedRendererElem = mSubRenderer->save( doc, context ); 94 : 0 : rendererElem.appendChild( embeddedRendererElem ); 95 : 0 : } 96 : : 97 : 0 : if ( mPaintEffect && !QgsPaintEffectRegistry::isDefaultStack( mPaintEffect ) ) 98 : 0 : mPaintEffect->saveProperties( doc, rendererElem ); 99 : : 100 : 0 : if ( !mOrderBy.isEmpty() ) 101 : : { 102 : 0 : QDomElement orderBy = doc.createElement( QStringLiteral( "orderby" ) ); 103 : 0 : mOrderBy.save( orderBy ); 104 : 0 : rendererElem.appendChild( orderBy ); 105 : 0 : } 106 : 0 : rendererElem.setAttribute( QStringLiteral( "enableorderby" ), ( mOrderByEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) ); 107 : : 108 : 0 : return rendererElem; 109 : 0 : } 110 : : 111 : 0 : QgsInvertedPolygonRenderer *QgsInvertedPolygonRenderer::convertFromRenderer( const QgsFeatureRenderer *renderer ) 112 : : { 113 : 0 : if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) ) 114 : : { 115 : 0 : return dynamic_cast<QgsInvertedPolygonRenderer *>( renderer->clone() ); 116 : : } 117 : 0 : else if ( renderer->type() == QLatin1String( "singleSymbol" ) || 118 : 0 : renderer->type() == QLatin1String( "categorizedSymbol" ) || 119 : 0 : renderer->type() == QLatin1String( "graduatedSymbol" ) || 120 : 0 : renderer->type() == QLatin1String( "RuleRenderer" ) ) 121 : : { 122 : 0 : return new QgsInvertedPolygonRenderer( renderer->clone() ); 123 : : } 124 : 0 : else if ( renderer->type() == QLatin1String( "mergedFeatureRenderer" ) ) 125 : : { 126 : 0 : return new QgsInvertedPolygonRenderer( renderer->embeddedRenderer() ? renderer->embeddedRenderer()->clone() : nullptr ); 127 : : } 128 : 0 : return nullptr; 129 : 0 : } 130 : :