Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvectorlayerlabeling.h 3 : : --------------------- 4 : : begin : September 2015 5 : : copyright : (C) 2015 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 QGSVECTORLAYERLABELING_H 16 : : #define QGSVECTORLAYERLABELING_H 17 : : 18 : : #include <memory> 19 : : 20 : : #include <QString> 21 : : #include <QStringList> 22 : : #include <QDomNode> 23 : : 24 : : #include "qgis.h" 25 : : 26 : : class QDomDocument; 27 : : class QDomElement; 28 : : 29 : : class QgsPalLayerSettings; 30 : : class QgsReadWriteContext; 31 : : class QgsVectorLayer; 32 : : class QgsVectorLayerLabelProvider; 33 : : class QgsStyleEntityVisitorInterface; 34 : : 35 : : /** 36 : : * \ingroup core 37 : : * \brief Abstract base class - its implementations define different approaches to the labeling of a vector layer. 38 : : * 39 : : * \since QGIS 3.0 40 : : */ 41 : : class CORE_EXPORT QgsAbstractVectorLayerLabeling 42 : : { 43 : : 44 : : #ifdef SIP_RUN 45 : : SIP_CONVERT_TO_SUBCLASS_CODE 46 : : if ( sipCpp->type() == "simple" ) 47 : : sipType = sipType_QgsVectorLayerSimpleLabeling; 48 : : else if ( sipCpp->type() == "rule-based" ) 49 : : sipType = sipType_QgsRuleBasedLabeling; 50 : : else 51 : : sipType = 0; 52 : : SIP_END 53 : : #endif 54 : : 55 : : public: 56 : : //! Default constructor 57 : 0 : QgsAbstractVectorLayerLabeling() = default; 58 : 0 : virtual ~QgsAbstractVectorLayerLabeling() = default; 59 : : 60 : : //! Unique type string of the labeling configuration implementation 61 : : virtual QString type() const = 0; 62 : : 63 : : //! Returns a new copy of the object 64 : : virtual QgsAbstractVectorLayerLabeling *clone() const = 0 SIP_FACTORY; 65 : : 66 : : /** 67 : : * Factory for label provider implementation 68 : : * \note not available in Python bindings 69 : : */ 70 : 0 : virtual QgsVectorLayerLabelProvider *provider( QgsVectorLayer *layer ) const SIP_SKIP { Q_UNUSED( layer ) return nullptr; } 71 : : 72 : : //! Returns labeling configuration as XML element 73 : : virtual QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const = 0; 74 : : 75 : : //! Gets list of sub-providers within the layer's labeling. 76 : 0 : virtual QStringList subProviders() const { return QStringList( QString() ); } 77 : : 78 : : /** 79 : : * Gets associated label settings. In case of multiple sub-providers with different settings, 80 : : * they are identified by their ID (e.g. in case of rule-based labeling, provider ID == rule key) 81 : : */ 82 : : virtual QgsPalLayerSettings settings( const QString &providerId = QString() ) const = 0; 83 : : 84 : : /** 85 : : * Set pal settings for a specific provider (takes ownership). 86 : : * 87 : : * \param settings Pal layer settings 88 : : * \param providerId The id of the provider 89 : : * 90 : : * \since QGIS 3.0 91 : : */ 92 : : virtual void setSettings( QgsPalLayerSettings *settings SIP_TRANSFER, const QString &providerId = QString() ) = 0; 93 : : 94 : : /** 95 : : * Returns TRUE if drawing labels requires advanced effects like composition 96 : : * modes, which could prevent it being used as an isolated cached image 97 : : * or exported to a vector format. 98 : : * \since QGIS 3.0 99 : : */ 100 : : virtual bool requiresAdvancedEffects() const = 0; 101 : : 102 : : // static stuff 103 : : 104 : : //! Try to create instance of an implementation based on the XML data 105 : : static QgsAbstractVectorLayerLabeling *create( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY; 106 : : 107 : : /** 108 : : * Writes the SE 1.1 TextSymbolizer element based on the current layer labeling settings 109 : : */ 110 : 0 : virtual void toSld( QDomNode &parent, const QVariantMap &props ) const 111 : : { 112 : 0 : Q_UNUSED( parent ) 113 : 0 : Q_UNUSED( props ) 114 : 0 : QDomDocument doc = parent.ownerDocument(); 115 : 0 : parent.appendChild( doc.createComment( QStringLiteral( "SE Export for %1 not implemented yet" ).arg( type() ) ) ); 116 : 0 : } 117 : : 118 : : /** 119 : : * Accepts the specified symbology \a visitor, causing it to visit all symbols associated 120 : : * with the labeling. 121 : : * 122 : : * Returns TRUE if the visitor should continue visiting other objects, or FALSE if visiting 123 : : * should be canceled. 124 : : * 125 : : * \since QGIS 3.10 126 : : */ 127 : : virtual bool accept( QgsStyleEntityVisitorInterface *visitor ) const; 128 : : 129 : : protected: 130 : : 131 : : /** 132 : : * Writes a TextSymbolizer element contents based on the provided labeling settings 133 : : * \param parent the node that will have the text symbolizer element added to it 134 : : * \param settings the settings getting translated to a TextSymbolizer 135 : : * \param props a open ended set of properties that can drive/inform the SLD encoding 136 : : */ 137 : : virtual void writeTextSymbolizer( QDomNode &parent, QgsPalLayerSettings &settings, const QVariantMap &props ) const; 138 : : 139 : : private: 140 : : Q_DISABLE_COPY( QgsAbstractVectorLayerLabeling ) 141 : : 142 : : #ifdef SIP_RUN 143 : : QgsAbstractVectorLayerLabeling( const QgsAbstractVectorLayerLabeling &rhs ); 144 : : #endif 145 : : 146 : : }; 147 : : 148 : : /** 149 : : * \ingroup core 150 : : * \brief Basic implementation of the labeling interface. 151 : : * 152 : : * The configuration is kept in layer's custom properties for backward compatibility. 153 : : * 154 : : * \since QGIS 3.0 155 : : */ 156 : 0 : class CORE_EXPORT QgsVectorLayerSimpleLabeling : public QgsAbstractVectorLayerLabeling 157 : : { 158 : : public: 159 : : //! Constructs simple labeling configuration with given initial settings 160 : : explicit QgsVectorLayerSimpleLabeling( const QgsPalLayerSettings &settings ); 161 : : 162 : : QString type() const override; 163 : : QgsAbstractVectorLayerLabeling *clone() const override SIP_FACTORY; 164 : : //! \note not available in Python bindings 165 : : QgsVectorLayerLabelProvider *provider( QgsVectorLayer *layer ) const override SIP_SKIP; 166 : : QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const override; 167 : : QgsPalLayerSettings settings( const QString &providerId = QString() ) const override; 168 : : bool accept( QgsStyleEntityVisitorInterface *visitor ) const override; 169 : : 170 : : /** 171 : : * Set pal settings (takes ownership). 172 : : * 173 : : * \param settings Pal layer settings 174 : : * \param providerId Unused parameter 175 : : * 176 : : * \since QGIS 3.0 177 : : */ 178 : : void setSettings( QgsPalLayerSettings *settings SIP_TRANSFER, const QString &providerId = QString() ) override; 179 : : 180 : : bool requiresAdvancedEffects() const override; 181 : : void toSld( QDomNode &parent, const QVariantMap &props ) const override; 182 : : 183 : : //! Create the instance from a DOM element with saved configuration 184 : : static QgsVectorLayerSimpleLabeling *create( const QDomElement &element, const QgsReadWriteContext &context ); 185 : : 186 : : private: 187 : : std::unique_ptr<QgsPalLayerSettings> mSettings; 188 : : }; 189 : : 190 : : #endif // QGSVECTORLAYERLABELING_H