QGIS API Documentation  3.27.0-Master (bef583a8ef)
qgscategorizedsymbolrenderer.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgscategorizedsymbolrenderer.h
3  ---------------------
4  begin : November 2009
5  copyright : (C) 2009 by Martin Dobias
6  email : wonder dot sk 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 #ifndef QGSCATEGORIZEDSYMBOLRENDERER_H
16 #define QGSCATEGORIZEDSYMBOLRENDERER_H
17 
18 #include "qgis_core.h"
19 #include "qgis.h"
20 #include "qgsrenderer.h"
21 
22 #include <QHash>
23 
24 class QgsVectorLayer;
25 class QgsStyle;
27 class QgsSymbol;
28 class QgsExpression;
29 class QgsColorRamp;
30 
35 class CORE_EXPORT QgsRendererCategory
36 {
37  public:
38 
42  QgsRendererCategory() = default;
43 
55  QgsRendererCategory( const QVariant &value, QgsSymbol *symbol SIP_TRANSFER, const QString &label, bool render = true );
56 
61  QgsRendererCategory &operator=( QgsRendererCategory cat );
63 
71  QVariant value() const;
72 
77  QgsSymbol *symbol() const;
78 
84  QString label() const;
85 
93  void setValue( const QVariant &value );
94 
102  void setSymbol( QgsSymbol *s SIP_TRANSFER );
103 
109  void setLabel( const QString &label );
110 
116  bool renderState() const;
117 
123  void setRenderState( bool render );
124 
125  // debugging
126 
130  QString dump() const;
131 
135  void toSld( QDomDocument &doc, QDomElement &element, QVariantMap props ) const;
136 
137 #ifdef SIP_RUN
138  SIP_PYOBJECT __repr__();
139  % MethodCode
140  const QString str = !sipCpp->value().isValid()
141  ? QStringLiteral( "<QgsRendererCategory>" )
142  : sipCpp->label().isEmpty()
143  ? QStringLiteral( "<QgsRendererCategory: %1>" ).arg( sipCpp->value().toString() )
144  : QStringLiteral( "<QgsRendererCategory: %1 (%2)>" ).arg( sipCpp->value().toString(), sipCpp->label() );
145  sipRes = PyUnicode_FromString( str.toUtf8().constData() );
146  % End
147 #endif
148 
149  protected:
150  QVariant mValue;
151  std::unique_ptr<QgsSymbol> mSymbol;
152  QString mLabel;
153  bool mRender = true;
154 
155  void swap( QgsRendererCategory &other );
156 };
157 
158 typedef QList<QgsRendererCategory> QgsCategoryList;
159 
165 {
166  public:
167 
176  QgsCategorizedSymbolRenderer( const QString &attrName = QString(), const QgsCategoryList &categories = QgsCategoryList() );
178 
179  QgsSymbol *symbolForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
180  QgsSymbol *originalSymbolForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
181  void startRender( QgsRenderContext &context, const QgsFields &fields ) override;
182  void stopRender( QgsRenderContext &context ) override;
183  QSet<QString> usedAttributes( const QgsRenderContext &context ) const override;
184  bool filterNeedsGeometry() const override;
185  QString dump() const override;
186  QgsCategorizedSymbolRenderer *clone() const override SIP_FACTORY;
187  void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props = QVariantMap() ) const override;
188  QgsFeatureRenderer::Capabilities capabilities() override { return SymbolLevels | Filter; }
189  QString filter( const QgsFields &fields = QgsFields() ) override;
190  QgsSymbolList symbols( QgsRenderContext &context ) const override;
191  bool accept( QgsStyleEntityVisitorInterface *visitor ) const override;
192 
199  void updateSymbols( QgsSymbol *sym );
200 
204  const QgsCategoryList &categories() const { return mCategories; }
205 
209  int categoryIndexForValue( const QVariant &val );
210 
215  int categoryIndexForLabel( const QString &val );
216 
226  bool updateCategoryValue( int catIndex, const QVariant &value );
227 
237  bool updateCategorySymbol( int catIndex, QgsSymbol *symbol SIP_TRANSFER );
238 
249  bool updateCategoryLabel( int catIndex, const QString &label );
250 
263  bool updateCategoryRenderState( int catIndex, bool render );
264 
270  void addCategory( const QgsRendererCategory &category );
271 
277  bool deleteCategory( int catIndex );
278 
284  void deleteAllCategories();
285 
289  void moveCategory( int from, int to );
290 
296  void sortByValue( Qt::SortOrder order = Qt::AscendingOrder );
297 
303  void sortByLabel( Qt::SortOrder order = Qt::AscendingOrder );
304 
312  QString classAttribute() const { return mAttrName; }
313 
321  void setClassAttribute( const QString &attr ) { mAttrName = attr; }
322 
326  static QgsFeatureRenderer *create( QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
327 
328  QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) override;
329  QgsLegendSymbolList legendSymbolItems() const override;
330  QSet< QString > legendKeysForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override;
331  QString legendKeyToExpression( const QString &key, QgsVectorLayer *layer, bool &ok ) const override;
332 
339  QgsSymbol *sourceSymbol();
340 
348  const QgsSymbol *sourceSymbol() const SIP_SKIP;
349 
357  void setSourceSymbol( QgsSymbol *sym SIP_TRANSFER );
358 
364  QgsColorRamp *sourceColorRamp();
365 
372  const QgsColorRamp *sourceColorRamp() const SIP_SKIP;
373 
380  void setSourceColorRamp( QgsColorRamp *ramp SIP_TRANSFER );
381 
387  void updateColorRamp( QgsColorRamp *ramp SIP_TRANSFER );
388 
389  bool legendSymbolItemsCheckable() const override;
390  bool legendSymbolItemChecked( const QString &key ) override;
391  void setLegendSymbolItem( const QString &key, QgsSymbol *symbol SIP_TRANSFER ) override;
392  void checkLegendSymbolItem( const QString &key, bool state = true ) override;
393  QString legendClassificationAttribute() const override { return classAttribute(); }
394 
403  static QgsCategorizedSymbolRenderer *convertFromRenderer( const QgsFeatureRenderer *renderer, QgsVectorLayer *layer = nullptr ) SIP_FACTORY;
404 
415  void setDataDefinedSizeLegend( QgsDataDefinedSizeLegend *settings SIP_TRANSFER );
416 
422  QgsDataDefinedSizeLegend *dataDefinedSizeLegend() const;
423 
441  int matchToSymbols( QgsStyle *style, Qgis::SymbolType type,
442  QVariantList &unmatchedCategories SIP_OUT, QStringList &unmatchedSymbols SIP_OUT, bool caseSensitive = true, bool useTolerantMatch = false );
443 
444 
455  static QgsCategoryList createCategories( const QVariantList &values, const QgsSymbol *symbol, QgsVectorLayer *layer = nullptr, const QString &fieldName = QString() );
456 
466  static QString displayString( const QVariant &value, int precision = -1 );
467 
468 
469  protected:
470  QString mAttrName;
471  QgsCategoryList mCategories;
472  std::unique_ptr<QgsSymbol> mSourceSymbol;
473  std::unique_ptr<QgsColorRamp> mSourceColorRamp;
474  std::unique_ptr<QgsExpression> mExpression;
475 
476  std::unique_ptr<QgsDataDefinedSizeLegend> mDataDefinedSizeLegend;
477 
479  int mAttrNum = -1;
480 
482  QHash<QString, QgsSymbol *> mSymbolHash;
483  bool mCounting = false;
484 
485  void rebuildHash();
486 
490  Q_DECL_DEPRECATED QgsSymbol *skipRender() SIP_DEPRECATED;
491 
496  Q_DECL_DEPRECATED QgsSymbol *symbolForValue( const QVariant &value ) const SIP_DEPRECATED;
497 
498  // TODO QGIS 4.0 - rename Python method to symbolForValue
499 
513  QgsSymbol *symbolForValue( const QVariant &value, bool &foundMatchingSymbol SIP_OUT ) const SIP_PYNAME( symbolForValue2 );
514 
515  private:
516 #ifdef SIP_RUN
519 #endif
520 
522  QVariant valueForFeature( const QgsFeature &feature, QgsRenderContext &context ) const;
523 
525  QgsLegendSymbolList baseLegendSymbolItems() const;
526 
527 };
528 
529 #endif // QGSCATEGORIZEDSYMBOLRENDERER_H
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:72
const QgsCategoryList & categories() const
Returns a list of all categories recognized by the renderer.
QString classAttribute() const
Returns the class attribute for the renderer, which is the field name or expression string from the l...
void setClassAttribute(const QString &attr)
Sets the class attribute for the renderer, which is the field name or expression string from the laye...
~QgsCategorizedSymbolRenderer() override
Abstract base class for color ramps.
Definition: qgscolorramp.h:30
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
Class for parsing and evaluation of expressions (formerly called "search strings").
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Container of fields for a vector layer.
Definition: qgsfields.h:45
The class is used as a container of context for various read/write operations on other objects.
Contains information about the context of a rendering operation.
Represents an individual category (class) from a QgsCategorizedSymbolRenderer.
std::unique_ptr< QgsSymbol > mSymbol
QgsRendererCategory()=default
Constructor for QgsRendererCategory.
An interface for classes which can visit style entity (e.g.
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:93
Represents a vector layer which manages a vector based data sets.
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
Definition: qgsgeos.h:79
#define str(x)
Definition: qgis.cpp:37
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_PYNAME(name)
Definition: qgis_sip.h:81
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_OUT
Definition: qgis_sip.h:58
#define SIP_FACTORY
Definition: qgis_sip.h:76
QList< QgsRendererCategory > QgsCategoryList
QList< QgsLegendSymbolItem > QgsLegendSymbolList
QList< QgsSymbol * > QgsSymbolList
Definition: qgsrenderer.h:44
int precision