Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsgeometrygeneratorsymbollayer.h 3 : : --------------------- 4 : : begin : November 2015 5 : : copyright : (C) 2015 by Matthias Kuhn 6 : : email : matthias at opengis dot ch 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 : : #ifndef QGSGEOMETRYGENERATORSYMBOLLAYER_H 17 : : #define QGSGEOMETRYGENERATORSYMBOLLAYER_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgssymbollayer.h" 21 : : 22 : : /** 23 : : * \ingroup core 24 : : * \class QgsGeometryGeneratorSymbolLayer 25 : : */ 26 : : class CORE_EXPORT QgsGeometryGeneratorSymbolLayer : public QgsSymbolLayer 27 : : { 28 : : public: 29 : : ~QgsGeometryGeneratorSymbolLayer() override; 30 : : 31 : : //! Creates the symbol layer 32 : : static QgsSymbolLayer *create( const QVariantMap &properties ) SIP_FACTORY; 33 : : 34 : : QString layerType() const override; 35 : : 36 : : /** 37 : : * Set the type of symbol which should be created. 38 : : * Should match with the return type of the expression. 39 : : * 40 : : * \param symbolType The symbol type which shall be used below this symbol. 41 : : */ 42 : : void setSymbolType( QgsSymbol::SymbolType symbolType ); 43 : : 44 : : /** 45 : : * Access the symbol type. This defines the type of geometry 46 : : * that is created by this generator. 47 : : * 48 : : * \returns Symbol type 49 : : */ 50 : : QgsSymbol::SymbolType symbolType() const { return mSymbolType; } 51 : : 52 : : void startRender( QgsSymbolRenderContext &context ) override; 53 : : void stopRender( QgsSymbolRenderContext &context ) override; 54 : : void startFeatureRender( const QgsFeature &feature, QgsRenderContext &context ) override; 55 : : void stopFeatureRender( const QgsFeature &feature, QgsRenderContext &context ) override; 56 : : bool usesMapUnits() const override; 57 : : 58 : : QgsSymbolLayer *clone() const override SIP_FACTORY; 59 : : 60 : : QVariantMap properties() const override; 61 : : 62 : : void drawPreviewIcon( QgsSymbolRenderContext &context, QSize size ) override; 63 : : 64 : : /** 65 : : * Set the expression to generate this geometry. 66 : : */ 67 : : void setGeometryExpression( const QString &exp ); 68 : : 69 : : /** 70 : : * Gets the expression to generate this geometry. 71 : : */ 72 : 0 : QString geometryExpression() const { return mExpression->expression(); } 73 : : 74 : 0 : QgsSymbol *subSymbol() override { return mSymbol; } 75 : : 76 : : bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override; 77 : : 78 : : QSet<QString> usedAttributes( const QgsRenderContext &context ) const override; 79 : : bool hasDataDefinedProperties() const override; 80 : : 81 : : /** 82 : : * Will always return TRUE. 83 : : * This is a hybrid layer, it constructs its own geometry so it does not 84 : : * care about the geometry of its parents. 85 : : */ 86 : : bool isCompatibleWithSymbol( QgsSymbol *symbol ) const override; 87 : : 88 : : /** 89 : : * Will render this symbol layer using the context. 90 : : * In comparison to other symbols there is no geometry passed in, since 91 : : * the geometry will be created based on information from the context 92 : : * which contains a QgsRenderContext which in turn contains an expression 93 : : * context which is available to the evaluated expression. 94 : : * 95 : : * \param context The rendering context which will be used to render and to 96 : : * construct a geometry. 97 : : */ 98 : : virtual void render( QgsSymbolRenderContext &context ); 99 : : 100 : : void setColor( const QColor &color ) override; 101 : : 102 : : private: 103 : : QgsGeometryGeneratorSymbolLayer( const QString &expression ); 104 : : 105 : : #ifdef SIP_RUN 106 : : QgsGeometryGeneratorSymbolLayer( const QgsGeometryGeneratorSymbolLayer © ); 107 : : #endif 108 : : 109 : : std::unique_ptr<QgsExpression> mExpression; 110 : : std::unique_ptr<QgsFillSymbol> mFillSymbol; 111 : : std::unique_ptr<QgsLineSymbol> mLineSymbol; 112 : : std::unique_ptr<QgsMarkerSymbol> mMarkerSymbol; 113 : : QgsSymbol *mSymbol = nullptr; 114 : : 115 : : /** 116 : : * The type of the sub symbol. 117 : : */ 118 : : QgsSymbol::SymbolType mSymbolType; 119 : : 120 : : bool mRenderingFeature = false; 121 : : bool mHasRenderedFeature = false; 122 : : }; 123 : : 124 : : #endif // QGSGEOMETRYGENERATORSYMBOLLAYER_H