QGIS API Documentation  3.20.0-Odense (decaadbb31)
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"
27 #include "qgspainteffectregistry.h"
28 #include "qgsstyleentityvisitor.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 
82 QDomElement 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  rendererElem.setAttribute( QStringLiteral( "forceraster" ), ( mForceRaster ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
90 
91  if ( mSubRenderer )
92  {
93  QDomElement embeddedRendererElem = mSubRenderer->save( doc, context );
94  rendererElem.appendChild( embeddedRendererElem );
95  }
96 
98  mPaintEffect->saveProperties( doc, rendererElem );
99 
100  if ( !mOrderBy.isEmpty() )
101  {
102  QDomElement orderBy = doc.createElement( QStringLiteral( "orderby" ) );
103  mOrderBy.save( orderBy );
104  rendererElem.appendChild( orderBy );
105  }
106  rendererElem.setAttribute( QStringLiteral( "enableorderby" ), ( mOrderByEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
107 
108  return rendererElem;
109 }
110 
112 {
113  if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) )
114  {
115  return dynamic_cast<QgsInvertedPolygonRenderer *>( renderer->clone() );
116  }
117  else if ( renderer->type() == QLatin1String( "singleSymbol" ) ||
118  renderer->type() == QLatin1String( "categorizedSymbol" ) ||
119  renderer->type() == QLatin1String( "graduatedSymbol" ) ||
120  renderer->type() == QLatin1String( "RuleRenderer" ) )
121  {
122  return new QgsInvertedPolygonRenderer( renderer->clone() );
123  }
124  else if ( renderer->type() == QLatin1String( "mergedFeatureRenderer" ) )
125  {
126  return new QgsInvertedPolygonRenderer( renderer->embeddedRenderer() ? renderer->embeddedRenderer()->clone() : nullptr );
127  }
128  return nullptr;
129 }
130 
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
static QgsFeatureRenderer * defaultRenderer(QgsWkbTypes::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
Definition: qgsrenderer.cpp:77
QgsPaintEffect * mPaintEffect
Definition: qgsrenderer.h:537
QString type() const
Definition: qgsrenderer.h:141
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
Definition: qgsrenderer.cpp:52
static QgsFeatureRenderer * load(QDomElement &symbologyElem, const QgsReadWriteContext &context)
create a renderer from XML element
QgsFeatureRequest::OrderBy mOrderBy
Definition: qgsrenderer.h:553
virtual const QgsFeatureRenderer * embeddedRenderer() const
Returns the current embedded renderer (subrenderer) for this feature renderer.
QgsFeatureRequest::OrderBy orderBy() const
Gets the order in which features shall be processed by this renderer.
void CORE_EXPORT save(QDomElement &elem) const
Serialize to XML.
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
store renderer info to 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.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
virtual bool saveProperties(QDomDocument &doc, QDomElement &element) const
Saves the current state of the effect to a DOM element.
The class is used as a container of context for various read/write operations on other objects.
#define RENDERER_TAG_NAME
Definition: qgsrenderer.h:49