QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsinvertedpolygonrenderer.cpp
Go to the documentation of this file.
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
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"
29
30#include <QDomDocument>
31#include <QDomElement>
32
34 : QgsMergedFeatureRenderer( QStringLiteral( "invertedPolygonRenderer" ), subRenderer )
35{
36 if ( !subRenderer )
37 {
39 }
41}
42
44{
45 if ( !mSubRenderer )
46 {
47 return QStringLiteral( "INVERTED: NULL" );
48 }
49 return "INVERTED [" + mSubRenderer->dump() + ']';
50}
51
53{
54 QgsInvertedPolygonRenderer *newRenderer = nullptr;
55 if ( !mSubRenderer )
56 {
57 newRenderer = new QgsInvertedPolygonRenderer( nullptr );
58 }
59 else
60 {
61 newRenderer = new QgsInvertedPolygonRenderer( mSubRenderer->clone() );
62 }
64 copyRendererData( newRenderer );
65 return newRenderer;
66}
67
69{
71 //look for an embedded renderer <renderer-v2>
72 QDomElement embeddedRendererElem = element.firstChildElement( QStringLiteral( "renderer-v2" ) );
73 if ( !embeddedRendererElem.isNull() )
74 {
75 QgsFeatureRenderer *renderer = QgsFeatureRenderer::load( embeddedRendererElem, context );
76 r->setEmbeddedRenderer( renderer );
77 }
78 r->setPreprocessingEnabled( element.attribute( QStringLiteral( "preprocessing" ), QStringLiteral( "0" ) ).toInt() == 1 );
79 return r;
80}
81
82QDomElement QgsInvertedPolygonRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context )
83{
84 // clazy:skip
85
86 QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
87 rendererElem.setAttribute( QStringLiteral( "type" ), QStringLiteral( "invertedPolygonRenderer" ) );
88 rendererElem.setAttribute( QStringLiteral( "preprocessing" ), preprocessingEnabled() ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
89
90 if ( mSubRenderer )
91 {
92 const QDomElement embeddedRendererElem = mSubRenderer->save( doc, context );
93 rendererElem.appendChild( embeddedRendererElem );
94 }
95
96 saveRendererData( doc, rendererElem, context );
97
98 return rendererElem;
99}
100
102{
103 if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) )
104 {
105 return dynamic_cast<QgsInvertedPolygonRenderer *>( renderer->clone() );
106 }
107 else if ( renderer->type() == QLatin1String( "singleSymbol" ) ||
108 renderer->type() == QLatin1String( "categorizedSymbol" ) ||
109 renderer->type() == QLatin1String( "graduatedSymbol" ) ||
110 renderer->type() == QLatin1String( "RuleRenderer" ) )
111 {
112 std::unique_ptr< QgsInvertedPolygonRenderer > res = std::make_unique< QgsInvertedPolygonRenderer >( renderer->clone() );
113 renderer->copyRendererData( res.get() );
114 return res.release();
115 }
116 else if ( renderer->type() == QLatin1String( "mergedFeatureRenderer" ) )
117 {
118 std::unique_ptr< QgsInvertedPolygonRenderer > res = std::make_unique< QgsInvertedPolygonRenderer >( renderer->embeddedRenderer() ? renderer->embeddedRenderer()->clone() : nullptr );
119 renderer->copyRendererData( res.get() );
120 return res.release();
121 }
122 return nullptr;
123}
124
@ Polygon
Polygons.
static QgsFeatureRenderer * defaultRenderer(Qgis::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
Definition: qgsrenderer.cpp:73
QString type() const
Definition: qgsrenderer.h:142
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
Definition: qgsrenderer.cpp:46
static QgsFeatureRenderer * load(QDomElement &symbologyElem, const QgsReadWriteContext &context)
create a renderer from XML element
void saveRendererData(QDomDocument &doc, QDomElement &element, const QgsReadWriteContext &context)
Saves generic renderer data into the specified element.
virtual const QgsFeatureRenderer * embeddedRenderer() const
Returns the current embedded renderer (subrenderer) for this feature renderer.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
QgsInvertedPolygonRenderer is a polygon-only feature renderer used to display features inverted,...
static QgsInvertedPolygonRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
static QgsFeatureRenderer * create(QDomElement &element, const QgsReadWriteContext &context)
Creates a renderer out of an XML, for loading.
QString dump() const override
Returns debug information about this renderer.
QgsInvertedPolygonRenderer * clone() const override
Create a deep copy of this renderer.
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) override
Stores renderer properties to an XML element.
QgsInvertedPolygonRenderer(QgsFeatureRenderer *embeddedRenderer=nullptr)
Constructor.
QgsMergedFeatureRenderer is a polygon or line-only feature renderer used to renderer a set of feature...
@ InvertOnly
Invert features only (polygons only)
GeometryOperation mOperation
Operation to apply to collected geometries.
void setEmbeddedRenderer(QgsFeatureRenderer *subRenderer) override
Sets an embedded renderer (subrenderer) for this feature renderer.
std::unique_ptr< QgsFeatureRenderer > mSubRenderer
Embedded renderer.
The class is used as a container of context for various read/write operations on other objects.
#define RENDERER_TAG_NAME
Definition: qgsrenderer.h:50