QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
qgsmaplayerlegend.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmaplayerlegend.cpp
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 #include "qgsmaplayerlegend.h"
17 
18 #include "qgssettings.h"
19 #include "qgslayertree.h"
21 #include "qgsmeshlayer.h"
22 #include "qgspluginlayer.h"
23 #include "qgsrasterlayer.h"
24 #include "qgsrenderer.h"
25 #include "qgsvectorlayer.h"
26 #include "qgspointcloudlayer.h"
27 #include "qgsdiagramrenderer.h"
28 #include "qgssymbollayerutils.h"
29 #include "qgspointcloudrenderer.h"
30 #include "qgsrasterrenderer.h"
31 #include "qgscolorramplegendnode.h"
32 
34  : QObject( parent )
35 {
36 }
37 
38 void QgsMapLayerLegend::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
39 {
40  Q_UNUSED( elem )
41  Q_UNUSED( context )
42 }
43 
44 QDomElement QgsMapLayerLegend::writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const
45 {
46  Q_UNUSED( doc )
47  Q_UNUSED( context )
48  return QDomElement();
49 }
50 
52 {
53  return new QgsDefaultVectorLayerLegend( vl );
54 }
55 
57 {
58  return new QgsDefaultRasterLayerLegend( rl );
59 }
60 
62 {
63  return new QgsDefaultMeshLayerLegend( ml );
64 }
65 
67 {
68  return new QgsDefaultPointCloudLayerLegend( layer );
69 }
70 
71 // -------------------------------------------------------------------------
72 
73 
74 void QgsMapLayerLegendUtils::setLegendNodeOrder( QgsLayerTreeLayer *nodeLayer, const QList<int> &order )
75 {
76  QStringList orderStr;
77  const auto constOrder = order;
78  for ( int id : constOrder )
79  orderStr << QString::number( id );
80  QString str = orderStr.isEmpty() ? QStringLiteral( "empty" ) : orderStr.join( QLatin1Char( ',' ) );
81 
82  nodeLayer->setCustomProperty( QStringLiteral( "legend/node-order" ), str );
83 }
84 
85 static int _originalLegendNodeCount( QgsLayerTreeLayer *nodeLayer )
86 {
87  // this is not particularly efficient way of finding out number of legend nodes
88  QList<QgsLayerTreeModelLegendNode *> lst = nodeLayer->layer()->legend()->createLayerTreeModelLegendNodes( nodeLayer );
89  int numNodes = lst.count();
90  qDeleteAll( lst );
91  return numNodes;
92 }
93 
94 static QList<int> _makeNodeOrder( QgsLayerTreeLayer *nodeLayer )
95 {
96  if ( !nodeLayer->layer() || !nodeLayer->layer()->legend() )
97  {
98  QgsDebugMsg( QStringLiteral( "Legend node order manipulation is invalid without existing legend" ) );
99  return QList<int>();
100  }
101 
102  int numNodes = _originalLegendNodeCount( nodeLayer );
103 
104  QList<int> order;
105  order.reserve( numNodes );
106  for ( int i = 0; i < numNodes; ++i )
107  order << i;
108  return order;
109 }
110 
112 {
113  QString orderStr = nodeLayer->customProperty( QStringLiteral( "legend/node-order" ) ).toString();
114 
115  if ( orderStr.isEmpty() )
116  return _makeNodeOrder( nodeLayer );
117 
118  if ( orderStr == QLatin1String( "empty" ) )
119  return QList<int>();
120 
121  int numNodes = _originalLegendNodeCount( nodeLayer );
122 
123  QList<int> lst;
124  const auto constSplit = orderStr.split( ',' );
125  for ( const QString &item : constSplit )
126  {
127  bool ok;
128  int id = item.toInt( &ok );
129  if ( !ok || id < 0 || id >= numNodes )
130  return _makeNodeOrder( nodeLayer );
131 
132  lst << id;
133  }
134 
135  return lst;
136 }
137 
139 {
140  return nodeLayer->customProperties().contains( QStringLiteral( "legend/node-order" ) );
141 }
142 
143 void QgsMapLayerLegendUtils::setLegendNodeUserLabel( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QString &newLabel )
144 {
145  nodeLayer->setCustomProperty( "legend/label-" + QString::number( originalIndex ), newLabel );
146 }
147 
148 QString QgsMapLayerLegendUtils::legendNodeUserLabel( QgsLayerTreeLayer *nodeLayer, int originalIndex )
149 {
150  return nodeLayer->customProperty( "legend/label-" + QString::number( originalIndex ) ).toString();
151 }
152 
154 {
155  return nodeLayer->customProperties().contains( "legend/label-" + QString::number( originalIndex ) );
156 }
157 
159 {
160  QDomDocument patchDoc;
161  QDomElement patchElem = patchDoc.createElement( QStringLiteral( "patch" ) );
162  shape.writeXml( patchElem, patchDoc, QgsReadWriteContext() );
163  patchDoc.appendChild( patchElem );
164  nodeLayer->setCustomProperty( "legend/patch-shape-" + QString::number( originalIndex ), patchDoc.toString() );
165 }
166 
168 {
169  QString patchDef = nodeLayer->customProperty( "legend/patch-shape-" + QString::number( originalIndex ) ).toString();
170  if ( patchDef.isEmpty() )
171  return QgsLegendPatchShape();
172 
173  QDomDocument doc( QStringLiteral( "patch" ) );
174  doc.setContent( patchDef );
175  QgsLegendPatchShape shape;
176  shape.readXml( doc.documentElement(), QgsReadWriteContext() );
177  return shape;
178 }
179 
180 void QgsMapLayerLegendUtils::setLegendNodeSymbolSize( QgsLayerTreeLayer *nodeLayer, int originalIndex, QSizeF size )
181 {
182  if ( size.isValid() )
183  nodeLayer->setCustomProperty( "legend/symbol-size-" + QString::number( originalIndex ), QgsSymbolLayerUtils::encodeSize( size ) );
184  else
185  nodeLayer->removeCustomProperty( "legend/symbol-size-" + QString::number( originalIndex ) );
186 }
187 
189 {
190  const QString size = nodeLayer->customProperty( "legend/symbol-size-" + QString::number( originalIndex ) ).toString();
191  if ( size.isEmpty() )
192  return QSizeF();
193  else
194  return QgsSymbolLayerUtils::decodeSize( size );
195 }
196 
197 void QgsMapLayerLegendUtils::setLegendNodeCustomSymbol( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QgsSymbol *symbol )
198 {
199  if ( symbol )
200  {
201  QDomDocument doc;
202  QgsReadWriteContext rwContext;
203  rwContext.setPathResolver( QgsProject::instance()->pathResolver() );
204  QDomElement elem = QgsSymbolLayerUtils::saveSymbol( QStringLiteral( "custom symbol" ), symbol, doc, rwContext );
205  doc.appendChild( elem );
206  nodeLayer->setCustomProperty( "legend/custom-symbol-" + QString::number( originalIndex ), doc.toString() );
207  }
208  else
209  nodeLayer->removeCustomProperty( "legend/custom-symbol-" + QString::number( originalIndex ) );
210 }
211 
213 {
214  const QString symbolDef = nodeLayer->customProperty( "legend/custom-symbol-" + QString::number( originalIndex ) ).toString();
215  if ( symbolDef.isEmpty() )
216  return nullptr;
217 
218  QDomDocument doc;
219  doc.setContent( symbolDef );
220  const QDomElement elem = doc.documentElement();
221 
222  QgsReadWriteContext rwContext;
223  rwContext.setPathResolver( QgsProject::instance()->pathResolver() );
224 
225  return QgsSymbolLayerUtils::loadSymbol( elem, rwContext );
226 }
227 
229 {
230  if ( settings )
231  {
232  QDomDocument doc;
233  QgsReadWriteContext rwContext;
234  rwContext.setPathResolver( QgsProject::instance()->pathResolver() );
235  QDomElement elem = doc.createElement( QStringLiteral( "rampSettings" ) );
236  settings->writeXml( doc, elem, rwContext );
237  doc.appendChild( elem );
238  nodeLayer->setCustomProperty( "legend/custom-ramp-settings-" + QString::number( originalIndex ), doc.toString() );
239  }
240  else
241  nodeLayer->removeCustomProperty( "legend/custom-ramp-settings-" + QString::number( originalIndex ) );
242 }
243 
245 {
246  const QString settingsDef = nodeLayer->customProperty( "legend/custom-ramp-settings-" + QString::number( originalIndex ) ).toString();
247  if ( settingsDef.isEmpty() )
248  return nullptr;
249 
250  QDomDocument doc;
251  doc.setContent( settingsDef );
252  const QDomElement elem = doc.documentElement();
253 
254  QgsReadWriteContext rwContext;
255  rwContext.setPathResolver( QgsProject::instance()->pathResolver() );
256 
258  settings.readXml( elem, rwContext );
259  return new QgsColorRampLegendNodeSettings( settings );
260 }
261 
262 void QgsMapLayerLegendUtils::setLegendNodeColumnBreak( QgsLayerTreeLayer *nodeLayer, int originalIndex, bool columnBreakBeforeNode )
263 {
264  if ( columnBreakBeforeNode )
265  nodeLayer->setCustomProperty( "legend/column-break-" + QString::number( originalIndex ), QStringLiteral( "1" ) );
266  else
267  nodeLayer->removeCustomProperty( "legend/column-break-" + QString::number( originalIndex ) );
268 }
269 
271 {
272  return nodeLayer->customProperty( "legend/column-break-" + QString::number( originalIndex ) ).toInt();
273 }
274 
275 void QgsMapLayerLegendUtils::applyLayerNodeProperties( QgsLayerTreeLayer *nodeLayer, QList<QgsLayerTreeModelLegendNode *> &nodes )
276 {
277  // handle user labels
278  int i = 0;
279  const auto constNodes = nodes;
280  for ( QgsLayerTreeModelLegendNode *legendNode : constNodes )
281  {
282  QString userLabel = QgsMapLayerLegendUtils::legendNodeUserLabel( nodeLayer, i );
283  if ( !userLabel.isNull() )
284  legendNode->setUserLabel( userLabel );
285 
286  if ( QgsSymbolLegendNode *symbolNode = dynamic_cast< QgsSymbolLegendNode * >( legendNode ) )
287  {
289  symbolNode->setPatchShape( shape );
290 
291  symbolNode->setCustomSymbol( QgsMapLayerLegendUtils::legendNodeCustomSymbol( nodeLayer, i ) );
292  }
293  else if ( QgsColorRampLegendNode *colorRampNode = dynamic_cast< QgsColorRampLegendNode * >( legendNode ) )
294  {
295  std::unique_ptr< QgsColorRampLegendNodeSettings > settings( QgsMapLayerLegendUtils::legendNodeColorRampSettings( nodeLayer, i ) );
296  if ( settings )
297  {
298  colorRampNode->setSettings( *settings );
299  }
300  }
301 
302  const QSizeF userSize = QgsMapLayerLegendUtils::legendNodeSymbolSize( nodeLayer, i );
303  if ( userSize.isValid() )
304  {
305  legendNode->setUserPatchSize( userSize );
306  }
307 
308  if ( legendNodeColumnBreak( nodeLayer, i ) )
309  legendNode->setColumnBreak( true );
310 
311  i++;
312  }
313 
314  // handle user order of nodes
316  {
317  QList<int> order = QgsMapLayerLegendUtils::legendNodeOrder( nodeLayer );
318 
319  QList<QgsLayerTreeModelLegendNode *> newOrder;
320  QSet<int> usedIndices;
321  const auto constOrder = order;
322  for ( int idx : constOrder )
323  {
324  if ( usedIndices.contains( idx ) )
325  {
326  QgsDebugMsg( QStringLiteral( "invalid node order. ignoring." ) );
327  return;
328  }
329 
330  newOrder << nodes[idx];
331  usedIndices << idx;
332  }
333 
334  // delete unused nodes
335  for ( int i = 0; i < nodes.count(); ++i )
336  {
337  if ( !usedIndices.contains( i ) )
338  delete nodes[i];
339  }
340 
341  nodes = newOrder;
342  }
343 
344 }
345 
346 // -------------------------------------------------------------------------
347 
348 
350  : mLayer( vl )
351 {
353  connect( mLayer, &QgsMapLayer::nameChanged, this, &QgsMapLayerLegend::itemsChanged );
354 }
355 
356 QList<QgsLayerTreeModelLegendNode *> QgsDefaultVectorLayerLegend::createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer )
357 {
358  QList<QgsLayerTreeModelLegendNode *> nodes;
359 
360  QgsFeatureRenderer *r = mLayer->renderer();
361  if ( !r )
362  return nodes;
363 
364  if ( nodeLayer->customProperty( QStringLiteral( "showFeatureCount" ), 0 ).toBool() )
365  mLayer->countSymbolFeatures();
366 
367  QgsSettings settings;
368  if ( settings.value( QStringLiteral( "qgis/showLegendClassifiers" ), false ).toBool() && !r->legendClassificationAttribute().isEmpty() )
369  {
370  nodes.append( new QgsSimpleLegendNode( nodeLayer, r->legendClassificationAttribute() ) );
371  }
372 
373  const auto constLegendSymbolItems = r->legendSymbolItems();
374  for ( const QgsLegendSymbolItem &i : constLegendSymbolItems )
375  {
376  if ( auto *lDataDefinedSizeLegendSettings = i.dataDefinedSizeLegendSettings() )
377  nodes << new QgsDataDefinedSizeLegendNode( nodeLayer, *lDataDefinedSizeLegendSettings );
378  else
379  {
380  QgsSymbolLegendNode *legendNode = new QgsSymbolLegendNode( nodeLayer, i );
381  if ( mTextOnSymbolEnabled && mTextOnSymbolContent.contains( i.ruleKey() ) )
382  {
383  legendNode->setTextOnSymbolLabel( mTextOnSymbolContent.value( i.ruleKey() ) );
384  legendNode->setTextOnSymbolTextFormat( mTextOnSymbolTextFormat );
385  }
386  nodes << legendNode;
387  }
388  }
389 
390  if ( nodes.count() == 1 && nodes[0]->data( Qt::EditRole ).toString().isEmpty() )
391  nodes[0]->setEmbeddedInParent( true );
392 
393 
394  if ( mLayer->diagramsEnabled() )
395  {
396  const auto constLegendItems = mLayer->diagramRenderer()->legendItems( nodeLayer );
397  for ( QgsLayerTreeModelLegendNode *i : constLegendItems )
398  {
399  nodes.append( i );
400  }
401  }
402 
403 
404  return nodes;
405 }
406 
407 void QgsDefaultVectorLayerLegend::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
408 {
409  mTextOnSymbolEnabled = false;
410  mTextOnSymbolTextFormat = QgsTextFormat();
411  mTextOnSymbolContent.clear();
412 
413  QDomElement tosElem = elem.firstChildElement( QStringLiteral( "text-on-symbol" ) );
414  if ( !tosElem.isNull() )
415  {
416  mTextOnSymbolEnabled = true;
417  QDomElement tosFormatElem = tosElem.firstChildElement( QStringLiteral( "text-style" ) );
418  mTextOnSymbolTextFormat.readXml( tosFormatElem, context );
419  QDomElement tosContentElem = tosElem.firstChildElement( QStringLiteral( "content" ) );
420  QDomElement tosContentItemElem = tosContentElem.firstChildElement( QStringLiteral( "item" ) );
421  while ( !tosContentItemElem.isNull() )
422  {
423  mTextOnSymbolContent.insert( tosContentItemElem.attribute( QStringLiteral( "key" ) ), tosContentItemElem.attribute( QStringLiteral( "value" ) ) );
424  tosContentItemElem = tosContentItemElem.nextSiblingElement( QStringLiteral( "item" ) );
425  }
426  }
427 }
428 
429 QDomElement QgsDefaultVectorLayerLegend::writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const
430 {
431  QDomElement elem = doc.createElement( QStringLiteral( "legend" ) );
432  elem.setAttribute( QStringLiteral( "type" ), QStringLiteral( "default-vector" ) );
433 
434  if ( mTextOnSymbolEnabled )
435  {
436  QDomElement tosElem = doc.createElement( QStringLiteral( "text-on-symbol" ) );
437  QDomElement tosFormatElem = mTextOnSymbolTextFormat.writeXml( doc, context );
438  tosElem.appendChild( tosFormatElem );
439  QDomElement tosContentElem = doc.createElement( QStringLiteral( "content" ) );
440  for ( auto it = mTextOnSymbolContent.constBegin(); it != mTextOnSymbolContent.constEnd(); ++it )
441  {
442  QDomElement tosContentItemElem = doc.createElement( QStringLiteral( "item" ) );
443  tosContentItemElem.setAttribute( QStringLiteral( "key" ), it.key() );
444  tosContentItemElem.setAttribute( QStringLiteral( "value" ), it.value() );
445  tosContentElem.appendChild( tosContentItemElem );
446  }
447  tosElem.appendChild( tosContentElem );
448  elem.appendChild( tosElem );
449  }
450 
451  return elem;
452 }
453 
454 
455 // -------------------------------------------------------------------------
456 
457 
459  : mLayer( rl )
460 {
462 }
463 
464 QList<QgsLayerTreeModelLegendNode *> QgsDefaultRasterLayerLegend::createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer )
465 {
466  QList<QgsLayerTreeModelLegendNode *> nodes;
467 
468  // temporary solution for WMS. Ideally should be done with a delegate.
469  if ( mLayer->dataProvider() && mLayer->dataProvider()->supportsLegendGraphic() )
470  {
471  nodes << new QgsWmsLegendNode( nodeLayer );
472  }
473 
474  if ( mLayer->renderer() )
475  nodes.append( mLayer->renderer()->createLegendNodes( nodeLayer ) );
476  return nodes;
477 }
478 
479 // -------------------------------------------------------------------------
480 
482  : mLayer( ml )
483 {
485 }
486 
487 QList<QgsLayerTreeModelLegendNode *> QgsDefaultMeshLayerLegend::createLayerTreeModelLegendNodes( QgsLayerTreeLayer *nodeLayer )
488 {
489  QList<QgsLayerTreeModelLegendNode *> nodes;
490 
491  QgsMeshDataProvider *provider = mLayer->dataProvider();
492  if ( !provider )
493  return nodes;
494 
495  QgsMeshRendererSettings rendererSettings = mLayer->rendererSettings();
496 
497  int indexScalar = rendererSettings.activeScalarDatasetGroup();
498  int indexVector = rendererSettings.activeVectorDatasetGroup();
499 
500  QString name;
501  if ( indexScalar > -1 && indexVector > -1 && indexScalar != indexVector )
502  name = QString( "%1 / %2" ).arg( provider->datasetGroupMetadata( indexScalar ).name(), provider->datasetGroupMetadata( indexVector ).name() );
503  else if ( indexScalar > -1 )
504  name = provider->datasetGroupMetadata( indexScalar ).name();
505  else if ( indexVector > -1 )
506  name = provider->datasetGroupMetadata( indexVector ).name();
507  else
508  {
509  // neither contours nor vectors get rendered - no legend needed
510  return nodes;
511  }
512 
513  nodes << new QgsSimpleLegendNode( nodeLayer, name );
514 
515  if ( indexScalar > -1 )
516  {
517  QgsMeshRendererScalarSettings settings = rendererSettings.scalarSettings( indexScalar );
518  const QgsColorRampShader shader = settings.colorRampShader();
519  switch ( shader.colorRampType() )
520  {
522  // for interpolated shaders we use a ramp legend node
523  nodes << new QgsColorRampLegendNode( nodeLayer, shader.sourceColorRamp()->clone(),
525  shader.minimumValue(),
526  shader.maximumValue() );
527  break;
528 
531  {
532  // for all others we use itemised lists
533  QgsLegendColorList items;
534  settings.colorRampShader().legendSymbologyItems( items );
535  for ( const QPair< QString, QColor > &item : items )
536  {
537  nodes << new QgsRasterSymbolLegendNode( nodeLayer, item.second, item.first );
538  }
539  break;
540  }
541  }
542  }
543 
544  return nodes;
545 }
546 
547 //
548 // QgsDefaultPointCloudLayerLegend
549 //
550 
552  : mLayer( layer )
553 {
555 }
556 
558 {
559  QgsPointCloudRenderer *renderer = mLayer->renderer();
560  if ( !renderer )
561  return QList<QgsLayerTreeModelLegendNode *>();
562 
563  return renderer->createLegendNodes( nodeLayer );
564 }
Settings for a color ramp legend node.
void readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads settings from an XML element.
void writeXml(QDomDocument &doc, QDomElement &element, const QgsReadWriteContext &context) const
Writes settings to an XML element.
A legend node which renders a color ramp.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
void legendSymbologyItems(QList< QPair< QString, QColor > > &symbolItems) const override
Returns legend symbology items if provided by renderer.
const QgsColorRampLegendNodeSettings * legendSettings() const
Returns the color ramp shader legend settings.
Type colorRampType() const
Returns the color ramp type.
QgsColorRamp * sourceColorRamp() const
Returns the source color ramp.
@ Interpolated
Interpolates the color between two class breaks linearly.
@ Discrete
Assigns the color of the higher class for every pixel between two class breaks.
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
virtual QgsColorRamp * clone() const =0
Creates a clone of the color ramp.
Produces legend node with a marker symbol.
Default legend implementation for mesh layers.
QgsDefaultMeshLayerLegend(QgsMeshLayer *ml)
Creates an instance for the given mesh layer.
QList< QgsLayerTreeModelLegendNode * > createLayerTreeModelLegendNodes(QgsLayerTreeLayer *nodeLayer) override
Returns list of legend nodes to be used for a particular layer tree layer node.
Default legend implementation for point cloud layers.
QList< QgsLayerTreeModelLegendNode * > createLayerTreeModelLegendNodes(QgsLayerTreeLayer *nodeLayer) override
Returns list of legend nodes to be used for a particular layer tree layer node.
QgsDefaultPointCloudLayerLegend(QgsPointCloudLayer *layer)
Creates an instance for the given point cloud layer.
Default legend implementation for raster layers.
QgsDefaultRasterLayerLegend(QgsRasterLayer *rl)
QList< QgsLayerTreeModelLegendNode * > createLayerTreeModelLegendNodes(QgsLayerTreeLayer *nodeLayer) override
Returns list of legend nodes to be used for a particular layer tree layer node.
Default legend implementation for vector layers.
QList< QgsLayerTreeModelLegendNode * > createLayerTreeModelLegendNodes(QgsLayerTreeLayer *nodeLayer) override
Returns list of legend nodes to be used for a particular layer tree layer node.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const override
Writes configuration to a DOM element, to be used later with readXml()
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads configuration from a DOM element previously written by writeXml()
QgsDefaultVectorLayerLegend(QgsVectorLayer *vl)
virtual QList< QgsLayerTreeModelLegendNode * > legendItems(QgsLayerTreeLayer *nodeLayer) const
Returns list of legend nodes for the diagram.
virtual QgsLegendSymbolList legendSymbolItems() const
Returns a list of symbology items for the legend.
virtual QString legendClassificationAttribute() const
If supported by the renderer, return classification attribute for the use in legend.
Definition: qgsrenderer.h:354
Layer tree node points to a map layer.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
The QgsLegendRendererItem class is abstract interface for legend items returned from QgsMapLayerLegen...
virtual void setColumnBreak(bool breakBeforeNode)
Sets whether a forced column break should occur before the node.
virtual void setUserPatchSize(QSizeF size)
Sets the user (overridden) size for the legend node.
virtual void setEmbeddedInParent(bool embedded)
virtual void setUserLabel(const QString &userLabel)
void setCustomProperty(const QString &key, const QVariant &value)
Sets a custom property for the node. Properties are stored in a map and saved in project file.
void removeCustomProperty(const QString &key)
Remove a custom property from layer. Properties are stored in a map and saved in project file.
QVariant customProperty(const QString &key, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer. Properties are stored in a map and saved in project file.
QStringList customProperties() const
Returns list of keys stored in custom properties.
Represents a patch shape for use in map legends.
void readXml(const QDomElement &element, const QgsReadWriteContext &context)
Read settings from a DOM element.
void writeXml(QDomElement &element, QDomDocument &doc, const QgsReadWriteContext &context) const
Write settings into a DOM element.
The class stores information about one class/rule of a vector layer renderer in a unified way that ca...
static void setLegendNodeOrder(QgsLayerTreeLayer *nodeLayer, const QList< int > &order)
static void setLegendNodeColorRampSettings(QgsLayerTreeLayer *nodeLayer, int originalIndex, const QgsColorRampLegendNodeSettings *settings)
Sets a custom legend color ramp settings for the legend node belonging to nodeLayer at the specified ...
static void setLegendNodeCustomSymbol(QgsLayerTreeLayer *nodeLayer, int originalIndex, const QgsSymbol *symbol)
Sets a custom legend symbol for the legend node belonging to nodeLayer at the specified originalIndex...
static QString legendNodeUserLabel(QgsLayerTreeLayer *nodeLayer, int originalIndex)
static QSizeF legendNodeSymbolSize(QgsLayerTreeLayer *nodeLayer, int originalIndex)
Returns the legend node symbol size for the legend node belonging to nodeLayer at the specified origi...
static bool hasLegendNodeUserLabel(QgsLayerTreeLayer *nodeLayer, int originalIndex)
static bool legendNodeColumnBreak(QgsLayerTreeLayer *nodeLayer, int originalIndex)
Returns whether a forced column break should occur before the node.
static bool hasLegendNodeOrder(QgsLayerTreeLayer *nodeLayer)
static void setLegendNodeUserLabel(QgsLayerTreeLayer *nodeLayer, int originalIndex, const QString &newLabel)
static void setLegendNodeSymbolSize(QgsLayerTreeLayer *nodeLayer, int originalIndex, QSizeF size)
Sets the legend symbol size for the legend node belonging to nodeLayer at the specified originalIndex...
static QgsColorRampLegendNodeSettings * legendNodeColorRampSettings(QgsLayerTreeLayer *nodeLayer, int originalIndex)
Returns the custom legend color ramp settings for the legend node belonging to nodeLayer at the speci...
static void setLegendNodeColumnBreak(QgsLayerTreeLayer *nodeLayer, int originalIndex, bool columnBreakBeforeNode)
Sets whether a forced column break should occur before the node.
static void setLegendNodePatchShape(QgsLayerTreeLayer *nodeLayer, int originalIndex, const QgsLegendPatchShape &shape)
Sets the legend patch shape for the legend node belonging to nodeLayer at the specified originalIndex...
static QgsSymbol * legendNodeCustomSymbol(QgsLayerTreeLayer *nodeLayer, int originalIndex)
Returns the custom legend symbol for the legend node belonging to nodeLayer at the specified original...
static QList< int > legendNodeOrder(QgsLayerTreeLayer *nodeLayer)
static void applyLayerNodeProperties(QgsLayerTreeLayer *nodeLayer, QList< QgsLayerTreeModelLegendNode * > &nodes)
update according to layer node's custom properties (order of items, user labels for items)
static QgsLegendPatchShape legendNodePatchShape(QgsLayerTreeLayer *nodeLayer, int originalIndex)
Returns the legend patch shape for the legend node belonging to nodeLayer at the specified originalIn...
The QgsMapLayerLegend class is abstract interface for implementations of legends for one map layer.
virtual void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads configuration from a DOM element previously written by writeXml()
static QgsMapLayerLegend * defaultMeshLegend(QgsMeshLayer *ml)
Create new legend implementation for mesh layer.
virtual QList< QgsLayerTreeModelLegendNode * > createLayerTreeModelLegendNodes(QgsLayerTreeLayer *nodeLayer)=0
Returns list of legend nodes to be used for a particular layer tree layer node.
static QgsMapLayerLegend * defaultPointCloudLegend(QgsPointCloudLayer *layer)
Create new legend implementation for a point cloud layer.
QgsMapLayerLegend(QObject *parent=nullptr)
Constructor for QgsMapLayerLegend.
virtual QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Writes configuration to a DOM element, to be used later with readXml()
static QgsMapLayerLegend * defaultRasterLegend(QgsRasterLayer *rl)
Create new legend implementation for raster layer.
static QgsMapLayerLegend * defaultVectorLegend(QgsVectorLayer *vl)
Create new legend implementation for vector layer.
void itemsChanged()
Emitted when existing items/nodes got invalid and should be replaced by new ones.
QgsMapLayerLegend * legend() const
Can be nullptr.
void rendererChanged()
Signal emitted when renderer is changed.
void nameChanged()
Emitted when the name has been changed.
Base class for providing data for QgsMeshLayer.
QString name() const
Returns name of the dataset group.
virtual QgsMeshDatasetGroupMetadata datasetGroupMetadata(int groupIndex) const =0
Returns dataset group metadata.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Definition: qgsmeshlayer.h:95
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
QgsMeshDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
Represents a mesh renderer settings for scalar datasets.
QgsColorRampShader colorRampShader() const
Returns color ramp shader function.
Represents all mesh renderer settings.
QgsMeshRendererScalarSettings scalarSettings(int groupIndex) const
Returns renderer settings.
int activeVectorDatasetGroup() const
Returns the active vector dataset group.
int activeScalarDatasetGroup() const
Returns the active scalar dataset group.
Represents a map layer supporting display of point clouds.
QgsPointCloudRenderer * renderer()
Returns the 2D renderer for the point cloud.
Abstract base class for 2d point cloud renderers.
virtual QList< QgsLayerTreeModelLegendNode * > createLegendNodes(QgsLayerTreeLayer *nodeLayer)
Creates a set of legend nodes representing the renderer.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:501
virtual bool supportsLegendGraphic() const
Returns whether the provider supplies a legend graphic.
Represents a raster layer.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
virtual QList< QgsLayerTreeModelLegendNode * > createLegendNodes(QgsLayerTreeLayer *nodeLayer)
Creates a set of legend nodes representing the renderer.
double maximumValue() const
Returns the minimum value for the raster shader.
double minimumValue() const
Returns the maximum value for the raster shader.
Implementation of legend node interface for displaying raster legend entries.
The class is used as a container of context for various read/write operations on other objects.
void setPathResolver(const QgsPathResolver &resolver)
Sets up path resolver for conversion between relative and absolute paths.
This class is a composition of two QSettings instances:
Definition: qgssettings.h:62
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Implementation of legend node interface for displaying arbitrary label with icon.
static QString encodeSize(QSizeF size)
Encodes a QSizeF to a string.
static QgsSymbol * loadSymbol(const QDomElement &element, const QgsReadWriteContext &context)
Attempts to load a symbol from a DOM element.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
static QSizeF decodeSize(const QString &string)
Decodes a QSizeF from a string.
Implementation of legend node interface for displaying preview of vector symbols and their labels and...
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:65
Container for all settings relating to text rendering.
Definition: qgstextformat.h:41
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Write settings into a DOM element.
Represents a vector layer which manages a vector based data sets.
QgsVectorLayerFeatureCounter * countSymbolFeatures(bool storeSymbolFids=false)
Count features for symbols.
bool diagramsEnabled() const
Returns whether the layer contains diagrams which are enabled and should be drawn.
const QgsDiagramRenderer * diagramRenderer() const
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
Implementation of legend node interface for displaying WMS legend entries.
QgsLayerTreeModelLegendNode * legendNode(const QString &rule, QgsLayerTreeModel &model)
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
QList< QPair< QString, QColor > > QgsLegendColorList