QGIS API Documentation 4.1.0-Master (60fea48833c)
Loading...
Searching...
No Matches
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
19#include "qgsdiagramrenderer.h"
20#include "qgsiconutils.h"
21#include "qgsimagecache.h"
22#include "qgslayertree.h"
24#include "qgsmeshlayer.h"
25#include "qgspluginlayer.h"
26#include "qgspointcloudlayer.h"
28#include "qgsrasterlayer.h"
29#include "qgsrasterrenderer.h"
30#include "qgsrenderer.h"
32#include "qgssettings.h"
33#include "qgssymbollayerutils.h"
34#include "qgsvectorlayer.h"
36
37#include <QString>
38
39#include "moc_qgsmaplayerlegend.cpp"
40
41using namespace Qt::StringLiterals;
42
44 : QObject( parent )
45{}
46
47void QgsMapLayerLegend::readXml( const QDomElement &elem, const QgsReadWriteContext & )
48{
50 mFlags.setFlag( Qgis::MapLayerLegendFlag::ExcludeByDefault, elem.attribute( u"excludeByDefault"_s, u"0"_s ).toInt() == 1 );
51}
52
53QDomElement QgsMapLayerLegend::writeXml( QDomDocument &doc, const QgsReadWriteContext & ) const
54{
55 QDomElement elem = doc.createElement( u"legend"_s );
56 if ( mFlags.testFlag( Qgis::MapLayerLegendFlag::ExcludeByDefault ) )
57 {
58 elem.setAttribute( u"excludeByDefault"_s, u"1"_s );
59 }
60 return elem;
61}
62
67
72
77
82
83// -------------------------------------------------------------------------
84
85
86void QgsMapLayerLegendUtils::setLegendNodeOrder( QgsLayerTreeLayer *nodeLayer, const QList<int> &order )
87{
88 QStringList orderStr;
89 const auto constOrder = order;
90 for ( const int id : constOrder )
91 orderStr << QString::number( id );
92 const QString str = orderStr.isEmpty() ? u"empty"_s : orderStr.join( ','_L1 );
93
94 nodeLayer->setCustomProperty( u"legend/node-order"_s, str );
95}
96
97static int _originalLegendNodeCount( QgsLayerTreeLayer *nodeLayer )
98{
99 // this is not particularly efficient way of finding out number of legend nodes
100 const QList<QgsLayerTreeModelLegendNode *> lst = nodeLayer->layer()->legend()->createLayerTreeModelLegendNodes( nodeLayer );
101 const int numNodes = lst.count();
102 qDeleteAll( lst );
103 return numNodes;
104}
105
106static QList<int> _makeNodeOrder( QgsLayerTreeLayer *nodeLayer )
107{
108 if ( !nodeLayer->layer() || !nodeLayer->layer()->legend() )
109 {
110 QgsDebugError( u"Legend node order manipulation is invalid without existing legend"_s );
111 return QList<int>();
112 }
113
114 const int numNodes = _originalLegendNodeCount( nodeLayer );
115
116 QList<int> order;
117 order.reserve( numNodes );
118 for ( int i = 0; i < numNodes; ++i )
119 order << i;
120 return order;
121}
122
124{
125 const QString orderStr = nodeLayer->customProperty( u"legend/node-order"_s ).toString();
126
127 if ( orderStr.isEmpty() )
128 return _makeNodeOrder( nodeLayer );
129
130 if ( orderStr == "empty"_L1 )
131 return QList<int>();
132
133 const int numNodes = _originalLegendNodeCount( nodeLayer );
134
135 QList<int> lst;
136 const auto constSplit = orderStr.split( ',' );
137 for ( const QString &item : constSplit )
138 {
139 bool ok;
140 const int id = item.toInt( &ok );
141 if ( !ok || id < 0 || id >= numNodes )
142 return _makeNodeOrder( nodeLayer );
143
144 lst << id;
145 }
146
147 return lst;
148}
149
151{
152 return nodeLayer->customProperties().contains( u"legend/node-order"_s );
153}
154
155void QgsMapLayerLegendUtils::setLegendNodeUserLabel( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QString &newLabel )
156{
157 nodeLayer->setCustomProperty( "legend/label-" + QString::number( originalIndex ), newLabel );
158}
159
161{
162 return nodeLayer->customProperty( "legend/label-" + QString::number( originalIndex ) ).toString();
163}
164
166{
167 return nodeLayer->customProperties().contains( "legend/label-" + QString::number( originalIndex ) );
168}
169
171{
172 QDomDocument patchDoc;
173 QDomElement patchElem = patchDoc.createElement( u"patch"_s );
174 shape.writeXml( patchElem, patchDoc, QgsReadWriteContext() );
175 patchDoc.appendChild( patchElem );
176 nodeLayer->setCustomProperty( "legend/patch-shape-" + QString::number( originalIndex ), patchDoc.toString() );
177}
178
180{
181 const QString patchDef = nodeLayer->customProperty( "legend/patch-shape-" + QString::number( originalIndex ) ).toString();
182 if ( patchDef.isEmpty() )
183 return QgsLegendPatchShape();
184
185 QDomDocument doc( u"patch"_s );
186 doc.setContent( patchDef );
188 shape.readXml( doc.documentElement(), QgsReadWriteContext() );
189 return shape;
190}
191
192void QgsMapLayerLegendUtils::setLegendNodeSymbolSize( QgsLayerTreeLayer *nodeLayer, int originalIndex, QSizeF size )
193{
194 if ( size.isValid() )
195 nodeLayer->setCustomProperty( "legend/symbol-size-" + QString::number( originalIndex ), QgsSymbolLayerUtils::encodeSize( size ) );
196 else
197 nodeLayer->removeCustomProperty( "legend/symbol-size-" + QString::number( originalIndex ) );
198}
199
201{
202 const QString size = nodeLayer->customProperty( "legend/symbol-size-" + QString::number( originalIndex ) ).toString();
203 if ( size.isEmpty() )
204 return QSizeF();
205 else
206 return QgsSymbolLayerUtils::decodeSize( size );
207}
208
209void QgsMapLayerLegendUtils::setLegendNodeCustomSymbol( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QgsSymbol *symbol )
210{
211 if ( symbol )
212 {
213 QDomDocument doc;
214 QgsReadWriteContext rwContext;
215 rwContext.setPathResolver( QgsProject::instance()->pathResolver() ); // skip-keyword-check
216 const QDomElement elem = QgsSymbolLayerUtils::saveSymbol( u"custom symbol"_s, symbol, doc, rwContext );
217 doc.appendChild( elem );
218 nodeLayer->setCustomProperty( "legend/custom-symbol-" + QString::number( originalIndex ), doc.toString() );
219 }
220 else
221 nodeLayer->removeCustomProperty( "legend/custom-symbol-" + QString::number( originalIndex ) );
222}
223
224std::unique_ptr< QgsSymbol > QgsMapLayerLegendUtils::legendNodeCustomSymbol( QgsLayerTreeLayer *nodeLayer, int originalIndex )
225{
226 const QString symbolDef = nodeLayer->customProperty( "legend/custom-symbol-" + QString::number( originalIndex ) ).toString();
227 if ( symbolDef.isEmpty() )
228 return nullptr;
229
230 QDomDocument doc;
231 doc.setContent( symbolDef );
232 const QDomElement elem = doc.documentElement();
233
234 QgsReadWriteContext rwContext;
235 rwContext.setPathResolver( QgsProject::instance()->pathResolver() ); // skip-keyword-check
236
237 return QgsSymbolLayerUtils::loadSymbol( elem, rwContext );
238}
239
241{
242 if ( settings )
243 {
244 QDomDocument doc;
245 QgsReadWriteContext rwContext;
246 rwContext.setPathResolver( QgsProject::instance()->pathResolver() ); // skip-keyword-check
247 QDomElement elem = doc.createElement( u"rampSettings"_s );
248 settings->writeXml( doc, elem, rwContext );
249 doc.appendChild( elem );
250 nodeLayer->setCustomProperty( "legend/custom-ramp-settings-" + QString::number( originalIndex ), doc.toString() );
251 }
252 else
253 nodeLayer->removeCustomProperty( "legend/custom-ramp-settings-" + QString::number( originalIndex ) );
254}
255
257{
258 const QString settingsDef = nodeLayer->customProperty( "legend/custom-ramp-settings-" + QString::number( originalIndex ) ).toString();
259 if ( settingsDef.isEmpty() )
260 return nullptr;
261
262 QDomDocument doc;
263 doc.setContent( settingsDef );
264 const QDomElement elem = doc.documentElement();
265
266 QgsReadWriteContext rwContext;
267 rwContext.setPathResolver( QgsProject::instance()->pathResolver() ); // skip-keyword-check
268
270 settings.readXml( elem, rwContext );
271 return new QgsColorRampLegendNodeSettings( std::move( settings ) );
272}
273
274void QgsMapLayerLegendUtils::setLegendNodeColumnBreak( QgsLayerTreeLayer *nodeLayer, int originalIndex, bool columnBreakBeforeNode )
275{
276 if ( columnBreakBeforeNode )
277 nodeLayer->setCustomProperty( "legend/column-break-" + QString::number( originalIndex ), u"1"_s );
278 else
279 nodeLayer->removeCustomProperty( "legend/column-break-" + QString::number( originalIndex ) );
280}
281
283{
284 return nodeLayer->customProperty( "legend/column-break-" + QString::number( originalIndex ) ).toInt();
285}
286
287void QgsMapLayerLegendUtils::applyLayerNodeProperties( QgsLayerTreeLayer *nodeLayer, QList<QgsLayerTreeModelLegendNode *> &nodes )
288{
289 // handle user labels
290 int i = 0;
291 const auto constNodes = nodes;
292 for ( QgsLayerTreeModelLegendNode *legendNode : constNodes )
293 {
294 const QString userLabel = QgsMapLayerLegendUtils::legendNodeUserLabel( nodeLayer, i );
295 if ( !userLabel.isNull() )
296 legendNode->setUserLabel( userLabel );
297
298 if ( QgsSymbolLegendNode *symbolNode = dynamic_cast< QgsSymbolLegendNode * >( legendNode ) )
299 {
301 symbolNode->setPatchShape( shape );
302
303 symbolNode->setCustomSymbol( QgsMapLayerLegendUtils::legendNodeCustomSymbol( nodeLayer, i ).release() );
304 }
305 else if ( QgsColorRampLegendNode *colorRampNode = dynamic_cast< QgsColorRampLegendNode * >( legendNode ) )
306 {
307 const std::unique_ptr< QgsColorRampLegendNodeSettings > settings( QgsMapLayerLegendUtils::legendNodeColorRampSettings( nodeLayer, i ) );
308 if ( settings )
309 {
310 colorRampNode->setSettings( *settings );
311 }
312 }
313
314 const QSizeF userSize = QgsMapLayerLegendUtils::legendNodeSymbolSize( nodeLayer, i );
315 if ( userSize.isValid() )
316 {
317 legendNode->setUserPatchSize( userSize );
318 }
319
320 if ( legendNodeColumnBreak( nodeLayer, i ) )
321 legendNode->setColumnBreak( true );
322
323 i++;
324 }
325
326 // handle user order of nodes
328 {
329 const QList<int> order = QgsMapLayerLegendUtils::legendNodeOrder( nodeLayer );
330
331 QList<QgsLayerTreeModelLegendNode *> newOrder;
332 QSet<int> usedIndices;
333 const auto constOrder = order;
334 for ( const int idx : constOrder )
335 {
336 if ( usedIndices.contains( idx ) )
337 {
338 QgsDebugError( u"invalid node order. ignoring."_s );
339 return;
340 }
341
342 newOrder << nodes[idx];
343 usedIndices << idx;
344 }
345
346 // delete unused nodes
347 for ( int i = 0; i < nodes.count(); ++i )
348 {
349 if ( !usedIndices.contains( i ) )
350 delete nodes[i];
351 }
352
353 nodes = newOrder;
354 }
355}
356
357// -------------------------------------------------------------------------
358
359
366
368{
369 QList<QgsLayerTreeModelLegendNode *> nodes;
370 if ( !mLayer )
371 return nodes;
372
373 const QString placeholderImage = mLayer->legendPlaceholderImage();
374 if ( !placeholderImage.isEmpty() )
375 {
376 bool fitsInCache;
377 const QImage img = QgsApplication::imageCache()->pathAsImage( placeholderImage, QSize(), false, 1.0, fitsInCache );
378 nodes << new QgsImageLegendNode( nodeLayer, img );
379 return nodes;
380 }
381
382 QgsFeatureRenderer *r = mLayer->renderer();
383 if ( !r )
384 return nodes;
385
386 if ( nodeLayer->customProperty( u"showFeatureCount"_s, 0 ).toBool() )
387 mLayer->countSymbolFeatures();
388
389 const QgsSettings settings;
390 if ( settings.value( u"qgis/showLegendClassifiers"_s, false ).toBool() && !r->legendClassificationAttribute().isEmpty() )
391 {
392 nodes.append( new QgsSimpleLegendNode( nodeLayer, r->legendClassificationAttribute() ) );
393 }
394
395 const QList<QgsLayerTreeModelLegendNode *> rendererNodes = r->createLegendNodes( nodeLayer );
396 for ( QgsLayerTreeModelLegendNode *node : rendererNodes )
397 {
398 if ( QgsSymbolLegendNode *legendNode = qobject_cast< QgsSymbolLegendNode *>( node ) )
399 {
400 const QString ruleKey = legendNode->data( static_cast< int >( QgsLayerTreeModelLegendNode::CustomRole::RuleKey ) ).toString();
401 if ( mTextOnSymbolEnabled && mTextOnSymbolContent.contains( ruleKey ) )
402 {
403 legendNode->setTextOnSymbolLabel( mTextOnSymbolContent.value( ruleKey ) );
404 legendNode->setTextOnSymbolTextFormat( mTextOnSymbolTextFormat );
405 }
406 }
407 nodes << node;
408 }
409
410 if ( nodes.count() == 1 && nodes[0]->data( Qt::EditRole ).toString().isEmpty() && qobject_cast< QgsSymbolLegendNode * >( nodes[0] ) )
411 nodes[0]->setEmbeddedInParent( true );
412
413 if ( mLayer->diagramsEnabled() )
414 {
415 const auto constLegendItems = mLayer->diagramRenderer()->legendItems( nodeLayer );
416 for ( QgsLayerTreeModelLegendNode *i : constLegendItems )
417 {
418 nodes.append( i );
419 }
420 }
421
422 if ( mLayer->labelsEnabled() && mShowLabelLegend )
423 {
424 const QgsAbstractVectorLayerLabeling *labeling = mLayer->labeling();
425 if ( labeling )
426 {
427 const QStringList pList = labeling->subProviders();
428 for ( int i = 0; i < pList.size(); ++i )
429 {
430 const QgsPalLayerSettings s = labeling->settings( pList.at( i ) );
431 QString description;
432 const QgsRuleBasedLabeling *ruleBasedLabeling = dynamic_cast<const QgsRuleBasedLabeling *>( labeling );
433 if ( ruleBasedLabeling && ruleBasedLabeling->rootRule() )
434 {
435 const QgsRuleBasedLabeling::Rule *rule = ruleBasedLabeling->rootRule()->findRuleByKey( pList.at( i ) );
436 if ( rule )
437 {
438 description = rule->description();
439 }
440 }
441 QgsVectorLabelLegendNode *node = new QgsVectorLabelLegendNode( nodeLayer, s );
442 node->setUserLabel( description );
443 nodes.append( node );
444 }
445 }
446 }
447
448 return nodes;
449}
450
451void QgsDefaultVectorLayerLegend::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
452{
453 QgsMapLayerLegend::readXml( elem, context );
454
455 mTextOnSymbolEnabled = false;
456 mTextOnSymbolTextFormat = QgsTextFormat();
457 mTextOnSymbolContent.clear();
458
459 mShowLabelLegend = elem.attribute( u"showLabelLegend"_s, u"0"_s ).compare( u"1"_s, Qt::CaseInsensitive ) == 0;
460
461 const QDomElement tosElem = elem.firstChildElement( u"text-on-symbol"_s );
462 if ( !tosElem.isNull() )
463 {
464 mTextOnSymbolEnabled = true;
465 const QDomElement tosFormatElem = tosElem.firstChildElement( u"text-style"_s );
466 mTextOnSymbolTextFormat.readXml( tosFormatElem, context );
467 const QDomElement tosContentElem = tosElem.firstChildElement( u"content"_s );
468 QDomElement tosContentItemElem = tosContentElem.firstChildElement( u"item"_s );
469 while ( !tosContentItemElem.isNull() )
470 {
471 mTextOnSymbolContent.insert( tosContentItemElem.attribute( u"key"_s ), tosContentItemElem.attribute( u"value"_s ) );
472 tosContentItemElem = tosContentItemElem.nextSiblingElement( u"item"_s );
473 }
474 }
475}
476
477QDomElement QgsDefaultVectorLayerLegend::writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const
478{
479 QDomElement elem = QgsMapLayerLegend::writeXml( doc, context );
480 elem.setAttribute( u"type"_s, u"default-vector"_s );
481 elem.setAttribute( u"showLabelLegend"_s, mShowLabelLegend );
482
483 if ( mTextOnSymbolEnabled )
484 {
485 QDomElement tosElem = doc.createElement( u"text-on-symbol"_s );
486 const QDomElement tosFormatElem = mTextOnSymbolTextFormat.writeXml( doc, context );
487 tosElem.appendChild( tosFormatElem );
488 QDomElement tosContentElem = doc.createElement( u"content"_s );
489 for ( auto it = mTextOnSymbolContent.constBegin(); it != mTextOnSymbolContent.constEnd(); ++it )
490 {
491 QDomElement tosContentItemElem = doc.createElement( u"item"_s );
492 tosContentItemElem.setAttribute( u"key"_s, it.key() );
493 tosContentItemElem.setAttribute( u"value"_s, it.value() );
494 tosContentElem.appendChild( tosContentItemElem );
495 }
496 tosElem.appendChild( tosContentElem );
497 elem.appendChild( tosElem );
498 }
499
500 return elem;
501}
502
503
504// -------------------------------------------------------------------------
505
506
512
514{
515 QList<QgsLayerTreeModelLegendNode *> nodes;
516
517 // temporary solution for WMS. Ideally should be done with a delegate.
518 if ( mLayer->dataProvider() && mLayer->dataProvider()->supportsLegendGraphic() )
519 {
520 nodes << new QgsWmsLegendNode( nodeLayer );
521 }
522
523 const QString placeholderImage = mLayer->legendPlaceholderImage();
524 if ( !placeholderImage.isEmpty() )
525 {
526 bool fitsInCache;
527 const QImage img = QgsApplication::imageCache()->pathAsImage( placeholderImage, QSize(), false, 1.0, fitsInCache );
528 nodes << new QgsImageLegendNode( nodeLayer, img );
529 }
530 else if ( mLayer->renderer() )
531 nodes.append( mLayer->renderer()->createLegendNodes( nodeLayer ) );
532 return nodes;
533}
534
535// -------------------------------------------------------------------------
536
542
544{
545 QList<QgsLayerTreeModelLegendNode *> nodes;
546
547 const QgsMeshRendererSettings rendererSettings = mLayer->rendererSettings();
548
549 const int indexScalar = rendererSettings.activeScalarDatasetGroup();
550 const int indexVector = rendererSettings.activeVectorDatasetGroup();
551
552 QString name;
553 if ( indexScalar > -1 && indexVector > -1 && indexScalar != indexVector )
554 name = QString( "%1 / %2" ).arg( mLayer->datasetGroupMetadata( indexScalar ).name(), mLayer->datasetGroupMetadata( indexVector ).name() );
555 else if ( indexScalar > -1 )
556 name = mLayer->datasetGroupMetadata( indexScalar ).name();
557 else if ( indexVector > -1 )
558 name = mLayer->datasetGroupMetadata( indexVector ).name();
559 else
560 {
561 // neither contours nor vectors get rendered - no legend needed
562 return nodes;
563 }
564
565 if ( indexScalar > -1 )
566 {
567 const QString scalarNameKey = u"scalarName"_s;
568 nodes << new QgsSimpleLegendNode( nodeLayer, mLayer->datasetGroupMetadata( indexScalar ).name(), QIcon(), nullptr, scalarNameKey );
569 const QgsMeshRendererScalarSettings settings = rendererSettings.scalarSettings( indexScalar );
570 const QgsColorRampShader shader = settings.colorRampShader();
571 switch ( shader.colorRampType() )
572 {
574 if ( !shader.legendSettings() || shader.legendSettings()->useContinuousLegend() )
575 {
576 // for interpolated shaders we use a ramp legend node
577 if ( !shader.colorRampItemList().isEmpty() )
578 {
579 nodes
580 << new QgsColorRampLegendNode( nodeLayer, shader.createColorRamp(), shader.legendSettings() ? *shader.legendSettings() : QgsColorRampLegendNodeSettings(), shader.minimumValue(), shader.maximumValue(), nullptr, u"scalarLegend"_s, scalarNameKey );
581 }
582 break;
583 }
584 [[fallthrough]];
587 {
588 // for all others we use itemised lists
589 QgsLegendColorList items;
590 settings.colorRampShader().legendSymbologyItems( items );
591 for ( const QPair< QString, QColor > &item : items )
592 {
593 nodes << new QgsRasterSymbolLegendNode( nodeLayer, item.second, item.first, nullptr, false, u"scalarLegend"_s + QUuid::createUuid().toString(), scalarNameKey );
594 }
595 break;
596 }
597 }
598 }
599
600 if ( indexVector > -1 )
601 {
602 const QgsMeshRendererVectorSettings settings = rendererSettings.vectorSettings( indexVector );
603 const QString vectorNameKey = u"vectorName"_s;
604 switch ( settings.coloringMethod() )
605 {
607 {
608 const QColor arrowColor = settings.color();
609 const QIcon vectorIcon = QgsApplication::getThemeIcon( u"/propertyicons/meshvectors.svg"_s, arrowColor, arrowColor );
610 nodes << new QgsSimpleLegendNode( nodeLayer, mLayer->datasetGroupMetadata( indexVector ).name(), vectorIcon, nullptr, vectorNameKey );
611 break;
612 }
614 {
615 const QIcon vectorIcon = QgsApplication::getThemeIcon( u"/propertyicons/meshvectors.svg"_s );
616 nodes << new QgsSimpleLegendNode( nodeLayer, mLayer->datasetGroupMetadata( indexVector ).name(), vectorIcon, nullptr, vectorNameKey );
617 const QgsColorRampShader shader = settings.colorRampShader();
618 switch ( shader.colorRampType() )
619 {
621 if ( !shader.legendSettings() || shader.legendSettings()->useContinuousLegend() )
622 {
623 // for interpolated shaders we use a ramp legend node
624 if ( !shader.colorRampItemList().isEmpty() )
625 {
626 nodes << new QgsColorRampLegendNode(
627 nodeLayer,
628 shader.createColorRamp(),
630 shader.minimumValue(),
631 shader.maximumValue(),
632 nullptr,
633 u"vectorLegend"_s,
634 vectorNameKey
635 );
636 }
637 break;
638 }
639 [[fallthrough]];
642 {
643 // for all others we use itemised lists
644 QgsLegendColorList items;
645 settings.colorRampShader().legendSymbologyItems( items );
646 for ( const QPair< QString, QColor > &item : items )
647 {
648 nodes << new QgsRasterSymbolLegendNode( nodeLayer, item.second, item.first, nullptr, false, u"vectorLegend"_s + QUuid::createUuid().toString(), vectorNameKey );
649 }
650 break;
651 }
652 break;
653 }
654 }
655 }
656 }
657
658 return nodes;
659}
660
661//
662// QgsDefaultPointCloudLayerLegend
663//
664
670
672{
673 QgsPointCloudRenderer *renderer = mLayer->renderer();
674 if ( !renderer )
675 return QList<QgsLayerTreeModelLegendNode *>();
676
677 return renderer->createLegendNodes( nodeLayer );
678}
QFlags< MapLayerLegendFlag > MapLayerLegendFlags
Map layer legend flags.
Definition qgis.h:4708
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
Definition qgis.h:1506
@ Linear
Interpolates the color between two class breaks linearly.
Definition qgis.h:1504
@ Discrete
Assigns the color of the higher class for every pixel between two class breaks.
Definition qgis.h:1505
@ ExcludeByDefault
If set, the layer should not be included in legends by default, and must be manually added by a user.
Definition qgis.h:4699
Abstract base class - its implementations define different approaches to the labeling of a vector lay...
virtual QStringList subProviders() const
Gets list of sub-providers within the layer's labeling.
virtual QgsPalLayerSettings settings(const QString &providerId=QString()) const =0
Gets associated label settings.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsImageCache * imageCache()
Returns the application's image cache, used for caching resampled versions of raster images.
Settings for a color ramp legend node.
bool useContinuousLegend() const
Returns true if a continuous gradient legend will be used.
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.
Qgis::ShaderInterpolationMethod colorRampType() const
Returns the color ramp interpolation method.
const QgsColorRampLegendNodeSettings * legendSettings() const
Returns the color ramp shader legend settings.
QList< QgsColorRampShader::ColorRampItem > colorRampItemList() const
Returns the custom color map.
QgsColorRamp * createColorRamp() const
Creates a gradient color ramp from shader settings.
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)
Abstract base class for all 2D vector feature renderers.
virtual QList< QgsLayerTreeModelLegendNode * > createLegendNodes(QgsLayerTreeLayer *nodeLayer) const
Returns a list of legend nodes to be used for the legend for the renderer.
virtual QString legendClassificationAttribute() const
If supported by the renderer, return classification attribute for the use in legend.
QImage pathAsImage(const QString &path, const QSize size, const bool keepAspectRatio, const double opacity, bool &fitsInCache, bool blocking=false, double targetDpi=96, int frameNumber=-1, bool *isMissing=nullptr)
Returns the specified path rendered as an image.
Implementation of legend node interface for displaying arbitrary raster images.
@ ColorRamp
Render with a color ramp.
@ SingleColor
Render with a single color.
Layer tree node points to a map layer.
QString name() const override
Returns the layer's name.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
An abstract interface for legend items returned from QgsMapLayerLegend implementation.
virtual QVariant data(int role) const =0
Returns data associated with the item. Must be implemented in derived class.
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 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.
static void setLegendNodeOrder(QgsLayerTreeLayer *nodeLayer, const QList< int > &order)
static std::unique_ptr< QgsSymbol > legendNodeCustomSymbol(QgsLayerTreeLayer *nodeLayer, int originalIndex)
Returns the custom legend symbol for the legend node belonging to nodeLayer at the specified original...
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 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...
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.
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.
virtual QList< QgsLayerTreeModelLegendNode * > createLayerTreeModelLegendNodes(QgsLayerTreeLayer *nodeLayer)=0
Returns list of legend nodes to be used for a particular layer tree layer node.
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.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
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.
QgsMeshRendererVectorSettings vectorSettings(int groupIndex) const
Returns renderer settings.
Represents a renderer settings for vector datasets.
QColor color() const
Returns color used for drawing arrows.
QgsColorRampShader colorRampShader() const
Sets the color ramp shader used to render vector datasets.
QgsInterpolatedLineColor::ColoringMethod coloringMethod() const
Returns the coloring method used to render vector datasets.
Contains settings for how a map layer will be labeled.
Represents a map layer supporting display of point clouds.
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.
Represents a raster layer.
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.
A container for the context for various read/write operations on objects.
void setPathResolver(const QgsPathResolver &resolver)
Sets up path resolver for conversion between relative and absolute paths.
A child rule for QgsRuleBasedLabeling.
const QgsRuleBasedLabeling::Rule * findRuleByKey(const QString &key) const
Try to find a rule given its unique key.
QString description() const
A human readable description for this rule.
Rule based labeling for a vector layer.
QgsRuleBasedLabeling::Rule * rootRule()
Stores settings for use within QGIS.
Definition qgssettings.h:68
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 labels with icons.
static std::unique_ptr< QgsSymbol > loadSymbol(const QDomElement &element, const QgsReadWriteContext &context)
Attempts to load a symbol from a DOM element.
static QString encodeSize(QSizeF size)
Encodes a QSizeF to a string.
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:227
Container for all settings relating to text rendering.
A legend node for a labeling text symbol.
Represents a vector layer which manages a vector based dataset.
Implementation of legend node interface for displaying WMS legend entries.
#define QgsDebugError(str)
Definition qgslogger.h:59
QList< QPair< QString, QColor > > QgsLegendColorList