Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmaplayerlegend.h 3 : : -------------------------------------- 4 : : Date : July 2014 5 : : Copyright : (C) 2014 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 : : 16 : : #ifndef QGSMAPLAYERLEGEND_H 17 : : #define QGSMAPLAYERLEGEND_H 18 : : 19 : : #include <QObject> 20 : : #include "qgis_sip.h" 21 : : 22 : : class QDomDocument; 23 : : class QDomElement; 24 : : 25 : : class QgsLayerTreeLayer; 26 : : class QgsLayerTreeModelLegendNode; 27 : : class QgsMeshLayer; 28 : : class QgsPluginLayer; 29 : : class QgsRasterLayer; 30 : : class QgsPointCloudLayer; 31 : : class QgsReadWriteContext; 32 : : class QgsVectorLayer; 33 : : class QgsLegendPatchShape; 34 : : class QgsColorRampLegendNodeSettings; 35 : : class QgsSymbol; 36 : : 37 : : #include "qgis_core.h" 38 : : 39 : : 40 : : /** 41 : : * \ingroup core 42 : : * \brief The QgsMapLayerLegend class is abstract interface for implementations 43 : : * of legends for one map layer. 44 : : * 45 : : * \since QGIS 2.6 46 : : */ 47 : 0 : class CORE_EXPORT QgsMapLayerLegend : public QObject 48 : : { 49 : : Q_OBJECT 50 : : public: 51 : : 52 : : //! Constructor for QgsMapLayerLegend 53 : : explicit QgsMapLayerLegend( QObject *parent SIP_TRANSFERTHIS = nullptr ); 54 : : 55 : : // TODO: type 56 : : 57 : : /** 58 : : * Reads configuration from a DOM element previously written by writeXml() 59 : : * \since QGIS 3.2 60 : : */ 61 : : virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context ); 62 : : 63 : : /** 64 : : * Writes configuration to a DOM element, to be used later with readXml() 65 : : * \since QGIS 3.2 66 : : */ 67 : : virtual QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const; 68 : : 69 : : /** 70 : : * Returns list of legend nodes to be used for a particular layer tree layer node. 71 : : * Ownership is transferred to the caller. 72 : : */ 73 : : virtual QList<QgsLayerTreeModelLegendNode *> createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer ) = 0 SIP_FACTORY; 74 : : 75 : : // TODO: support for layer tree view delegates 76 : : 77 : : //! Create new legend implementation for vector layer 78 : : static QgsMapLayerLegend *defaultVectorLegend( QgsVectorLayer *vl ) SIP_FACTORY; 79 : : 80 : : //! Create new legend implementation for raster layer 81 : : static QgsMapLayerLegend *defaultRasterLegend( QgsRasterLayer *rl ) SIP_FACTORY; 82 : : 83 : : //! Create new legend implementation for mesh layer 84 : : static QgsMapLayerLegend *defaultMeshLegend( QgsMeshLayer *ml ) SIP_FACTORY; 85 : : 86 : : /** 87 : : * Create new legend implementation for a point cloud \a layer. 88 : : * \since QGIS 3.18 89 : : */ 90 : : static QgsMapLayerLegend *defaultPointCloudLegend( QgsPointCloudLayer *layer ) SIP_FACTORY; 91 : : 92 : : signals: 93 : : //! Emitted when existing items/nodes got invalid and should be replaced by new ones 94 : : void itemsChanged(); 95 : : }; 96 : : 97 : : 98 : : /** 99 : : * \ingroup core 100 : : * \brief Miscellaneous utility functions for handling of map layer legend 101 : : * 102 : : * \since QGIS 2.6 103 : : */ 104 : : class CORE_EXPORT QgsMapLayerLegendUtils 105 : : { 106 : : public: 107 : : static void setLegendNodeOrder( QgsLayerTreeLayer *nodeLayer, const QList<int> &order ); 108 : : static QList<int> legendNodeOrder( QgsLayerTreeLayer *nodeLayer ); 109 : : static bool hasLegendNodeOrder( QgsLayerTreeLayer *nodeLayer ); 110 : : 111 : : static void setLegendNodeUserLabel( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QString &newLabel ); 112 : : static QString legendNodeUserLabel( QgsLayerTreeLayer *nodeLayer, int originalIndex ); 113 : : static bool hasLegendNodeUserLabel( QgsLayerTreeLayer *nodeLayer, int originalIndex ); 114 : : 115 : : /** 116 : : * Sets the legend patch \a shape for the legend node belonging to \a nodeLayer at the specified \a originalIndex. 117 : : * 118 : : * \see legendNodePatchShape() 119 : : * \since QGIS 3.14 120 : : */ 121 : : static void setLegendNodePatchShape( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QgsLegendPatchShape &shape ); 122 : : 123 : : /** 124 : : * Returns the legend patch shape for the legend node belonging to \a nodeLayer at the specified \a originalIndex. 125 : : * 126 : : * \see setLegendNodePatchShape() 127 : : * \since QGIS 3.14 128 : : */ 129 : : static QgsLegendPatchShape legendNodePatchShape( QgsLayerTreeLayer *nodeLayer, int originalIndex ); 130 : : 131 : : /** 132 : : * Sets the legend symbol \a size for the legend node belonging to \a nodeLayer at the specified \a originalIndex. 133 : : * 134 : : * If either the width or height are non-zero, they will be used when rendering the legend node instead of the default 135 : : * symbol width or height from QgsLegendSettings. 136 : : * 137 : : * \see legendNodeSymbolSize() 138 : : * \since QGIS 3.14 139 : : */ 140 : : static void setLegendNodeSymbolSize( QgsLayerTreeLayer *nodeLayer, int originalIndex, QSizeF size ); 141 : : 142 : : /** 143 : : * Returns the legend node symbol size for the legend node belonging to \a nodeLayer at the specified \a originalIndex. 144 : : * 145 : : * If either the width or height are non-zero, they will be used when rendering the legend node instead of the default 146 : : * symbol width or height from QgsLegendSettings. 147 : : * 148 : : * \see setLegendNodeSymbolSize() 149 : : * \since QGIS 3.14 150 : : */ 151 : : static QSizeF legendNodeSymbolSize( QgsLayerTreeLayer *nodeLayer, int originalIndex ); 152 : : 153 : : /** 154 : : * Sets a custom legend \a symbol for the legend node belonging to \a nodeLayer at the specified \a originalIndex. 155 : : * 156 : : * If \a symbol is non-NULLPTR, it will be used in place of the default symbol when rendering 157 : : * the legend node. 158 : : * 159 : : * \see legendNodeCustomSymbol() 160 : : * \since QGIS 3.14 161 : : */ 162 : : static void setLegendNodeCustomSymbol( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QgsSymbol *symbol ); 163 : : 164 : : /** 165 : : * Returns the custom legend symbol for the legend node belonging to \a nodeLayer at the specified \a originalIndex. 166 : : * 167 : : * If the symbol is non-NULLPTR, it will be used in place of the default symbol when rendering 168 : : * the legend node. 169 : : * 170 : : * Caller takes ownership of the returned symbol. 171 : : * 172 : : * \see setLegendNodeCustomSymbol() 173 : : * \since QGIS 3.14 174 : : */ 175 : : static QgsSymbol *legendNodeCustomSymbol( QgsLayerTreeLayer *nodeLayer, int originalIndex ) SIP_FACTORY; 176 : : 177 : : /** 178 : : * Sets a custom legend color ramp \a settings for the legend node belonging to \a nodeLayer at the specified \a originalIndex. 179 : : * 180 : : * If the corresponding legend node is not a QgsColorRampLegendNode then calling this method will have no effect. 181 : : * 182 : : * If \a settings is non-NULLPTR, they will be used in place of the default settigns when rendering 183 : : * the legend node. 184 : : * 185 : : * \see legendNodeColorRampSettings() 186 : : * \since QGIS 3.18 187 : : */ 188 : : static void setLegendNodeColorRampSettings( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QgsColorRampLegendNodeSettings *settings ); 189 : : 190 : : /** 191 : : * Returns the custom legend color ramp settings for the legend node belonging to \a nodeLayer at the specified \a originalIndex. 192 : : * 193 : : * If the corresponding legend node is not a QgsColorRampLegendNode then calling this method will return NULLPTR. 194 : : * 195 : : * If the returned value is non-NULLPTR, they will be used in place of the default settings when rendering 196 : : * the legend node. 197 : : * 198 : : * Caller takes ownership of the returned settings. 199 : : * 200 : : * \see setLegendNodeColorRampSettings() 201 : : * \since QGIS 3.18 202 : : */ 203 : : static QgsColorRampLegendNodeSettings *legendNodeColorRampSettings( QgsLayerTreeLayer *nodeLayer, int originalIndex ) SIP_FACTORY; 204 : : 205 : : 206 : : /** 207 : : * Sets whether a forced column break should occur before the node. 208 : : * 209 : : * \see legendNodeColumnBreak() 210 : : * \since QGIS 3.14 211 : : */ 212 : : static void setLegendNodeColumnBreak( QgsLayerTreeLayer *nodeLayer, int originalIndex, bool columnBreakBeforeNode ); 213 : : 214 : : /** 215 : : * Returns whether a forced column break should occur before the node. 216 : : * 217 : : * \see setLegendNodeColumnBreak() 218 : : * \since QGIS 3.14 219 : : */ 220 : : static bool legendNodeColumnBreak( QgsLayerTreeLayer *nodeLayer, int originalIndex ); 221 : : 222 : : //! update according to layer node's custom properties (order of items, user labels for items) 223 : : static void applyLayerNodeProperties( QgsLayerTreeLayer *nodeLayer, QList<QgsLayerTreeModelLegendNode *> &nodes ); 224 : : }; 225 : : 226 : : 227 : : #include <QHash> 228 : : 229 : : #include "qgstextformat.h" 230 : : 231 : : /** 232 : : * \ingroup core 233 : : * \brief Default legend implementation for vector layers 234 : : * \since QGIS 2.6 235 : : */ 236 : : class CORE_EXPORT QgsDefaultVectorLayerLegend : public QgsMapLayerLegend 237 : : { 238 : : Q_OBJECT 239 : : 240 : : public: 241 : : explicit QgsDefaultVectorLayerLegend( QgsVectorLayer *vl ); 242 : : 243 : : /** 244 : : * Returns whether the "text on symbol" functionality is enabled. When enabled, legend symbols 245 : : * may have extra text rendered on top. The content of labels and their style is controlled 246 : : * by textOnSymbolContent() and textOnSymbolTextFormat(). 247 : : * \since QGIS 3.2 248 : : */ 249 : : bool textOnSymbolEnabled() const { return mTextOnSymbolEnabled; } 250 : : 251 : : /** 252 : : * Sets whether the "text on symbol" functionality is enabled. When enabled, legend symbols 253 : : * may have extra text rendered on top. The content of labels and their style is controlled 254 : : * by textOnSymbolContent() and textOnSymbolTextFormat(). 255 : : * \since QGIS 3.2 256 : : */ 257 : : void setTextOnSymbolEnabled( bool enabled ) { mTextOnSymbolEnabled = enabled; } 258 : : 259 : : /** 260 : : * Returns text format of symbol labels for "text on symbol" functionality. 261 : : * \since QGIS 3.2 262 : : */ 263 : : QgsTextFormat textOnSymbolTextFormat() const { return mTextOnSymbolTextFormat; } 264 : : 265 : : /** 266 : : * Sets text format of symbol labels for "text on symbol" functionality. 267 : : * \since QGIS 3.2 268 : : */ 269 : : void setTextOnSymbolTextFormat( const QgsTextFormat &format ) { mTextOnSymbolTextFormat = format; } 270 : : 271 : : /** 272 : : * Returns per-symbol content of labels for "text on symbol" functionality. In the passed dictionary 273 : : * the keys are rule keys of legend items, the values are labels to be shown. 274 : : * \since QGIS 3.2 275 : : */ 276 : : QHash<QString, QString> textOnSymbolContent() const { return mTextOnSymbolContent; } 277 : : 278 : : /** 279 : : * Sets per-symbol content of labels for "text on symbol" functionality. In the passed dictionary 280 : : * the keys are rule keys of legend items, the values are labels to be shown. 281 : : * \since QGIS 3.2 282 : : */ 283 : : void setTextOnSymbolContent( const QHash<QString, QString> &content ) { mTextOnSymbolContent = content; } 284 : : 285 : : QList<QgsLayerTreeModelLegendNode *> createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer ) SIP_FACTORY override; 286 : : void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override; 287 : : QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const override; 288 : : 289 : : private: 290 : : QgsVectorLayer *mLayer = nullptr; 291 : : 292 : : // text on symbol 293 : : bool mTextOnSymbolEnabled = false; 294 : : QgsTextFormat mTextOnSymbolTextFormat; 295 : : QHash<QString, QString> mTextOnSymbolContent; 296 : : }; 297 : : 298 : : 299 : : /** 300 : : * \ingroup core 301 : : * \brief Default legend implementation for raster layers 302 : : * \since QGIS 2.6 303 : : */ 304 : : class CORE_EXPORT QgsDefaultRasterLayerLegend : public QgsMapLayerLegend 305 : : { 306 : : Q_OBJECT 307 : : 308 : : public: 309 : : explicit QgsDefaultRasterLayerLegend( QgsRasterLayer *rl ); 310 : : 311 : : QList<QgsLayerTreeModelLegendNode *> createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer ) SIP_FACTORY override; 312 : : 313 : : private: 314 : : QgsRasterLayer *mLayer = nullptr; 315 : : }; 316 : : 317 : : 318 : : /** 319 : : * \ingroup core 320 : : * \brief Default legend implementation for mesh layers 321 : : * \since QGIS 3.4 322 : : */ 323 : : class CORE_EXPORT QgsDefaultMeshLayerLegend : public QgsMapLayerLegend 324 : : { 325 : : Q_OBJECT 326 : : 327 : : public: 328 : : //! Creates an instance for the given mesh layer 329 : : explicit QgsDefaultMeshLayerLegend( QgsMeshLayer *ml ); 330 : : 331 : : QList<QgsLayerTreeModelLegendNode *> createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer ) SIP_FACTORY override; 332 : : 333 : : private: 334 : : QgsMeshLayer *mLayer = nullptr; 335 : : }; 336 : : 337 : : /** 338 : : * \ingroup core 339 : : * \brief Default legend implementation for point cloud layers 340 : : * \since QGIS 3.18 341 : : */ 342 : : class CORE_EXPORT QgsDefaultPointCloudLayerLegend : public QgsMapLayerLegend 343 : : { 344 : : Q_OBJECT 345 : : 346 : : public: 347 : : //! Creates an instance for the given point cloud layer 348 : : explicit QgsDefaultPointCloudLayerLegend( QgsPointCloudLayer *layer ); 349 : : 350 : : QList<QgsLayerTreeModelLegendNode *> createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer ) SIP_FACTORY override; 351 : : 352 : : private: 353 : : QgsPointCloudLayer *mLayer = nullptr; 354 : : }; 355 : : 356 : : 357 : : #endif // QGSMAPLAYERLEGEND_H