QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
qgsembeddedsymbolrenderer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsembeddedsymbolrenderer.cpp
3 ---------------------
4 begin : March 2021
5 copyright : (C) 2021 by Nyall Dawson
6 email : nyall dot dawson at gmail 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 "qgspainteffect.h"
21#include "qgssymbol.h"
22#include "qgssymbollayerutils.h"
23
25 : QgsFeatureRenderer( QStringLiteral( "embeddedSymbol" ) )
26 , mDefaultSymbol( defaultSymbol )
27{
28 Q_ASSERT( mDefaultSymbol );
29}
30
32
34{
35 if ( feature.embeddedSymbol() )
36 return const_cast< QgsSymbol * >( feature.embeddedSymbol() );
37 else
38 return mDefaultSymbol.get();
39}
40
42{
43 Q_UNUSED( context )
44 if ( feature.embeddedSymbol() )
45 return const_cast< QgsSymbol * >( feature.embeddedSymbol() );
46 else
47 return mDefaultSymbol.get();
48}
49
51{
52 QgsFeatureRenderer::startRender( context, fields );
53
54 mDefaultSymbol->startRender( context, fields );
55}
56
57bool QgsEmbeddedSymbolRenderer::renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
58{
59 if ( const QgsSymbol *symbol = feature.embeddedSymbol() )
60 {
61 std::unique_ptr< QgsSymbol > clone( symbol->clone() );
62
63 clone->startRender( context );
64 renderFeatureWithSymbol( feature, clone.get(), context, layer, selected, drawVertexMarker );
65 clone->stopRender( context );
66 }
67 else
68 {
69 renderFeatureWithSymbol( feature, mDefaultSymbol.get(), context, layer, selected, drawVertexMarker );
70 }
71 return true;
72}
73
75{
77 mDefaultSymbol->stopRender( context );
78}
79
81{
82 QSet<QString> attributes;
83 if ( mDefaultSymbol )
84 attributes.unite( mDefaultSymbol->usedAttributes( context ) );
85 return attributes;
86}
87
89{
90 return true;
91}
92
94{
95 QgsEmbeddedSymbolRenderer *r = new QgsEmbeddedSymbolRenderer( mDefaultSymbol->clone() );
97 return r;
98}
99
104
106{
107 QDomElement symbolsElem = element.firstChildElement( QStringLiteral( "symbols" ) );
108 if ( symbolsElem.isNull() )
109 return nullptr;
110
111 QgsSymbolMap symbolMap = QgsSymbolLayerUtils::loadSymbols( symbolsElem, context );
112
113 if ( !symbolMap.contains( QStringLiteral( "0" ) ) )
114 return nullptr;
115
116 QgsEmbeddedSymbolRenderer *r = new QgsEmbeddedSymbolRenderer( symbolMap.take( QStringLiteral( "0" ) ) );
117 return r;
118}
119
121{
122 if ( renderer->type() == QLatin1String( "embeddedSymbol" ) )
123 {
124 return dynamic_cast<QgsEmbeddedSymbolRenderer *>( renderer->clone() );
125 }
126 else if ( renderer->type() == QLatin1String( "singleSymbol" ) )
127 {
128 auto symbolRenderer = std::make_unique< QgsEmbeddedSymbolRenderer >( static_cast< const QgsSingleSymbolRenderer * >( renderer )->symbol()->clone() );
129 renderer->copyRendererData( symbolRenderer.get() );
130 return symbolRenderer.release();
131 }
132 else
133 {
134 return nullptr;
135 }
136}
137
138QDomElement QgsEmbeddedSymbolRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context )
139{
140 QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
141 rendererElem.setAttribute( QStringLiteral( "type" ), QStringLiteral( "embeddedSymbol" ) );
142
144 symbols[QStringLiteral( "0" )] = mDefaultSymbol.get();
145 const QDomElement symbolsElem = QgsSymbolLayerUtils::saveSymbols( symbols, QStringLiteral( "symbols" ), doc, context );
146 rendererElem.appendChild( symbolsElem );
147
148 saveRendererData( doc, rendererElem, context );
149
150 return rendererElem;
151}
152
154{
155 Q_UNUSED( context )
156 QgsSymbolList lst;
157 lst.append( mDefaultSymbol.get() );
158 return lst;
159}
160
162{
163 return mDefaultSymbol.get();
164}
165
167{
168 Q_ASSERT( symbol );
169 mDefaultSymbol.reset( symbol );
170}
bool usesEmbeddedSymbols() const override
Returns true if the renderer uses embedded symbols for features.
QgsSymbol * defaultSymbol() const
Returns the default symbol which will be rendered for any feature which does not have embedded symbol...
QgsEmbeddedSymbolRenderer * clone() const override
Create a deep copy of this renderer.
QgsSymbolList symbols(QgsRenderContext &context) const override
Returns list of symbols used by the renderer.
QgsEmbeddedSymbolRenderer(QgsSymbol *defaultSymbol)
Constructor for QgsEmbeddedSymbolRenderer.
static QgsEmbeddedSymbolRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsEmbeddedSymbolRenderer from an existing renderer.
QgsSymbol * symbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
To be overridden.
QgsSymbol * originalSymbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Returns symbol for feature.
void setDefaultSymbol(QgsSymbol *symbol)
Sets the default symbol which will be rendered for any feature which does not have embedded symbology...
void stopRender(QgsRenderContext &context) override
Must be called when a render cycle has finished, to allow the renderer to clean up.
QgsFeatureRenderer::Capabilities capabilities() override
Returns details about internals of this renderer.
static QgsFeatureRenderer * create(QDomElement &element, const QgsReadWriteContext &context)
Creates a new embedded symbol renderer from an XML element, using the supplied read/write context.
void startRender(QgsRenderContext &context, const QgsFields &fields) override
Must be called when a new render cycle is started.
bool renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false) override
Render a feature using this renderer in the given context.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns a list of attributes required by this renderer.
~QgsEmbeddedSymbolRenderer() override
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) override
Stores renderer properties to an XML element.
QgsFeatureRenderer(const QString &type)
virtual void stopRender(QgsRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
QFlags< Capability > Capabilities
QString type() const
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
@ SymbolLevels
Rendering with symbol levels (i.e. implements symbols(), symbolForFeature()).
void saveRendererData(QDomDocument &doc, QDomElement &element, const QgsReadWriteContext &context)
Saves generic renderer data into the specified element.
void renderFeatureWithSymbol(const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker)
Render the feature with the symbol using context.
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)
Must be called when a new render cycle is started.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
const QgsSymbol * embeddedSymbol() const
Returns the feature's embedded symbology, or nullptr if the feature has no embedded symbol.
Container of fields for a vector layer.
Definition qgsfields.h:46
A container for the context for various read/write operations on objects.
Contains information about the context of a rendering operation.
A feature renderer which renders all features with the same symbol.
static QgsSymbolMap loadSymbols(QDomElement &element, const QgsReadWriteContext &context)
Reads a collection of symbols from XML and returns them in a map. Caller is responsible for deleting ...
static QDomElement saveSymbols(QgsSymbolMap &symbols, const QString &tagName, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a collection of symbols to XML with specified tagName for the top-level element.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:231
#define RENDERER_TAG_NAME
Definition qgsrenderer.h:55
QMap< QString, QgsSymbol * > QgsSymbolMap
Definition qgsrenderer.h:50
QList< QgsSymbol * > QgsSymbolList
Definition qgsrenderer.h:49