QGIS API Documentation 4.3.0-Master (6402a64e93b)
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"
34#include "qgssymbollayerutils.h"
35#include "qgsvectorlayer.h"
37
38#include <QString>
39
40#include "moc_qgsmaplayerlegend.cpp"
41
42using namespace Qt::StringLiterals;
43
45 : QObject( parent )
46{}
47
48void QgsMapLayerLegend::readXml( const QDomElement &elem, const QgsReadWriteContext & )
49{
51 mFlags.setFlag( Qgis::MapLayerLegendFlag::ExcludeByDefault, elem.attribute( u"excludeByDefault"_s, u"0"_s ).toInt() == 1 );
52}
53
54QDomElement QgsMapLayerLegend::writeXml( QDomDocument &doc, const QgsReadWriteContext & ) const
55{
56 QDomElement elem = doc.createElement( u"legend"_s );
57 if ( mFlags.testFlag( Qgis::MapLayerLegendFlag::ExcludeByDefault ) )
58 {
59 elem.setAttribute( u"excludeByDefault"_s, u"1"_s );
60 }
61 return elem;
62}
63
68
73
78
83
84// -------------------------------------------------------------------------
85
86
87void QgsMapLayerLegendUtils::setLegendNodeOrder( QgsLayerTreeLayer *nodeLayer, const QList<int> &order )
88{
89 QStringList orderStr;
90 const auto constOrder = order;
91 for ( const int id : constOrder )
92 orderStr << QString::number( id );
93 const QString str = orderStr.isEmpty() ? u"empty"_s : orderStr.join( ','_L1 );
94
95 nodeLayer->setCustomProperty( u"legend/node-order"_s, str );
96}
97
98static int _originalLegendNodeCount( QgsLayerTreeLayer *nodeLayer )
99{
100 // this is not particularly efficient way of finding out number of legend nodes
101 const QList<QgsLayerTreeModelLegendNode *> lst = nodeLayer->layer()->legend()->createLayerTreeModelLegendNodes( nodeLayer );
102 const int numNodes = lst.count();
103 qDeleteAll( lst );
104 return numNodes;
105}
106
107static QList<int> _makeNodeOrder( QgsLayerTreeLayer *nodeLayer )
108{
109 if ( !nodeLayer->layer() || !nodeLayer->layer()->legend() )
110 {
111 QgsDebugError( u"Legend node order manipulation is invalid without existing legend"_s );
112 return QList<int>();
113 }
114
115 const int numNodes = _originalLegendNodeCount( nodeLayer );
116
117 QList<int> order;
118 order.reserve( numNodes );
119 for ( int i = 0; i < numNodes; ++i )
120 order << i;
121 return order;
122}
123
125{
126 const QString orderStr = nodeLayer->customProperty( u"legend/node-order"_s ).toString();
127
128 if ( orderStr.isEmpty() )
129 return _makeNodeOrder( nodeLayer );
130
131 if ( orderStr == "empty"_L1 )
132 return QList<int>();
133
134 const int numNodes = _originalLegendNodeCount( nodeLayer );
135
136 QList<int> lst;
137 const auto constSplit = orderStr.split( ',' );
138 for ( const QString &item : constSplit )
139 {
140 bool ok;
141 const int id = item.toInt( &ok );
142 if ( !ok || id < 0 || id >= numNodes )
143 return _makeNodeOrder( nodeLayer );
144
145 lst << id;
146 }
147
148 return lst;
149}
150
152{
153 return nodeLayer->customProperties().contains( u"legend/node-order"_s );
154}
155
156void QgsMapLayerLegendUtils::setLegendNodeUserLabel( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QString &newLabel )
157{
158 nodeLayer->setCustomProperty( "legend/label-" + QString::number( originalIndex ), newLabel );
159}
160
162{
163 return nodeLayer->customProperty( "legend/label-" + QString::number( originalIndex ) ).toString();
164}
165
167{
168 return nodeLayer->customProperties().contains( "legend/label-" + QString::number( originalIndex ) );
169}
170
172{
173 QDomDocument patchDoc;
174 QDomElement patchElem = patchDoc.createElement( u"patch"_s );
175 shape.writeXml( patchElem, patchDoc, QgsReadWriteContext() );
176 patchDoc.appendChild( patchElem );
177 nodeLayer->setCustomProperty( "legend/patch-shape-" + QString::number( originalIndex ), patchDoc.toString() );
178}
179
181{
182 const QString patchDef = nodeLayer->customProperty( "legend/patch-shape-" + QString::number( originalIndex ) ).toString();
183 if ( patchDef.isEmpty() )
184 return QgsLegendPatchShape();
185
186 QDomDocument doc( u"patch"_s );
187 doc.setContent( patchDef );
189 shape.readXml( doc.documentElement(), QgsReadWriteContext() );
190 return shape;
191}
192
193void QgsMapLayerLegendUtils::setLegendNodeSymbolSize( QgsLayerTreeLayer *nodeLayer, int originalIndex, QSizeF size )
194{
195 if ( size.isValid() )
196 nodeLayer->setCustomProperty( "legend/symbol-size-" + QString::number( originalIndex ), QgsSymbolLayerUtils::encodeSize( size ) );
197 else
198 nodeLayer->removeCustomProperty( "legend/symbol-size-" + QString::number( originalIndex ) );
199}
200
202{
203 const QString size = nodeLayer->customProperty( "legend/symbol-size-" + QString::number( originalIndex ) ).toString();
204 if ( size.isEmpty() )
205 return QSizeF();
206 else
207 return QgsSymbolLayerUtils::decodeSize( size );
208}
209
210void QgsMapLayerLegendUtils::setLegendNodeCustomSymbol( QgsLayerTreeLayer *nodeLayer, int originalIndex, const QgsSymbol *symbol )
211{
212 if ( symbol )
213 {
214 QDomDocument doc;
215 QgsReadWriteContext rwContext;
216 if ( nodeLayer->layer() && nodeLayer->layer()->project() )
217 {
218 rwContext.setPathResolver( nodeLayer->layer()->project()->pathResolver() );
219 }
220 const QDomElement elem = QgsSymbolLayerUtils::saveSymbol( u"custom symbol"_s, symbol, doc, rwContext );
221 doc.appendChild( elem );
222 nodeLayer->setCustomProperty( "legend/custom-symbol-" + QString::number( originalIndex ), doc.toString() );
223 }
224 else
225 nodeLayer->removeCustomProperty( "legend/custom-symbol-" + QString::number( originalIndex ) );
226}
227
228std::unique_ptr< QgsSymbol > QgsMapLayerLegendUtils::legendNodeCustomSymbol( QgsLayerTreeLayer *nodeLayer, int originalIndex )
229{
230 const QString symbolDef = nodeLayer->customProperty( "legend/custom-symbol-" + QString::number( originalIndex ) ).toString();
231 if ( symbolDef.isEmpty() )
232 return nullptr;
233
234 QDomDocument doc;
235 doc.setContent( symbolDef );
236 const QDomElement elem = doc.documentElement();
237
238 QgsReadWriteContext rwContext;
239 if ( nodeLayer->layer() && nodeLayer->layer()->project() )
240 {
241 rwContext.setPathResolver( nodeLayer->layer()->project()->pathResolver() );
242 }
243
244 return QgsSymbolLayerUtils::loadSymbol( elem, rwContext );
245}
246
248{
249 if ( settings )
250 {
251 QDomDocument doc;
252 QgsReadWriteContext rwContext;
253 if ( nodeLayer->layer() && nodeLayer->layer()->project() )
254 {
255 rwContext.setPathResolver( nodeLayer->layer()->project()->pathResolver() );
256 }
257 QDomElement elem = doc.createElement( u"rampSettings"_s );
258 settings->writeXml( doc, elem, rwContext );
259 doc.appendChild( elem );
260 nodeLayer->setCustomProperty( "legend/custom-ramp-settings-" + QString::number( originalIndex ), doc.toString() );
261 }
262 else
263 nodeLayer->removeCustomProperty( "legend/custom-ramp-settings-" + QString::number( originalIndex ) );
264}
265
267{
268 const QString settingsDef = nodeLayer->customProperty( "legend/custom-ramp-settings-" + QString::number( originalIndex ) ).toString();
269 if ( settingsDef.isEmpty() )
270 return nullptr;
271
272 QDomDocument doc;
273 doc.setContent( settingsDef );
274 const QDomElement elem = doc.documentElement();
275
276 QgsReadWriteContext rwContext;
277 if ( nodeLayer->layer() && nodeLayer->layer()->project() )
278 {
279 rwContext.setPathResolver( nodeLayer->layer()->project()->pathResolver() );
280 }
281
283 settings.readXml( elem, rwContext );
284 return new QgsColorRampLegendNodeSettings( std::move( settings ) );
285}
286
287void QgsMapLayerLegendUtils::setLegendNodeColumnBreak( QgsLayerTreeLayer *nodeLayer, int originalIndex, bool columnBreakBeforeNode )
288{
289 if ( columnBreakBeforeNode )
290 nodeLayer->setCustomProperty( "legend/column-break-" + QString::number( originalIndex ), u"1"_s );
291 else
292 nodeLayer->removeCustomProperty( "legend/column-break-" + QString::number( originalIndex ) );
293}
294
296{
297 return nodeLayer->customProperty( "legend/column-break-" + QString::number( originalIndex ) ).toInt();
298}
299
300void QgsMapLayerLegendUtils::applyLayerNodeProperties( QgsLayerTreeLayer *nodeLayer, QList<QgsLayerTreeModelLegendNode *> &nodes )
301{
302 // handle user labels
303 int i = 0;
304 const auto constNodes = nodes;
305 for ( QgsLayerTreeModelLegendNode *legendNode : constNodes )
306 {
307 const QString userLabel = QgsMapLayerLegendUtils::legendNodeUserLabel( nodeLayer, i );
308 if ( !userLabel.isNull() )
309 legendNode->setUserLabel( userLabel );
310
311 if ( QgsSymbolLegendNode *symbolNode = dynamic_cast< QgsSymbolLegendNode * >( legendNode ) )
312 {
314 symbolNode->setPatchShape( shape );
315
316 symbolNode->setCustomSymbol( QgsMapLayerLegendUtils::legendNodeCustomSymbol( nodeLayer, i ).release() );
317 }
318 else if ( QgsColorRampLegendNode *colorRampNode = dynamic_cast< QgsColorRampLegendNode * >( legendNode ) )
319 {
320 const std::unique_ptr< QgsColorRampLegendNodeSettings > settings( QgsMapLayerLegendUtils::legendNodeColorRampSettings( nodeLayer, i ) );
321 if ( settings )
322 {
323 colorRampNode->setSettings( *settings );
324 }
325 }
326
327 const QSizeF userSize = QgsMapLayerLegendUtils::legendNodeSymbolSize( nodeLayer, i );
328 if ( userSize.isValid() )
329 {
330 legendNode->setUserPatchSize( userSize );
331 }
332
333 if ( legendNodeColumnBreak( nodeLayer, i ) )
334 legendNode->setColumnBreak( true );
335
336 i++;
337 }
338
339 // handle user order of nodes
341 {
342 const QList<int> order = QgsMapLayerLegendUtils::legendNodeOrder( nodeLayer );
343
344 QList<QgsLayerTreeModelLegendNode *> newOrder;
345 QSet<int> usedIndices;
346 const auto constOrder = order;
347 for ( const int idx : constOrder )
348 {
349 if ( usedIndices.contains( idx ) )
350 {
351 QgsDebugError( u"invalid node order. ignoring."_s );
352 return;
353 }
354
355 newOrder << nodes[idx];
356 usedIndices << idx;
357 }
358
359 // delete unused nodes
360 for ( int i = 0; i < nodes.count(); ++i )
361 {
362 if ( !usedIndices.contains( i ) )
363 delete nodes[i];
364 }
365
366 nodes = newOrder;
367 }
368}
369
370// -------------------------------------------------------------------------
371
372
380
382{
383 QList<QgsLayerTreeModelLegendNode *> nodes;
384 if ( !mLayer )
385 return nodes;
386
387 const QString placeholderImage = mLayer->legendPlaceholderImage();
388 if ( !placeholderImage.isEmpty() )
389 {
390 bool fitsInCache;
391 const QImage img = QgsApplication::imageCache()->pathAsImage( placeholderImage, QSize(), false, 1.0, fitsInCache );
392 nodes << new QgsImageLegendNode( nodeLayer, img );
393 return nodes;
394 }
395
396 QgsFeatureRenderer *r = mLayer->renderer();
397 if ( !r )
398 return nodes;
399
400 if ( nodeLayer->customProperty( u"showFeatureCount"_s, 0 ).toBool() )
401 mLayer->countSymbolFeatures();
402
404 {
405 nodes.append( new QgsSimpleLegendNode( nodeLayer, r->legendClassificationAttribute() ) );
406 }
407
408 const QList<QgsLayerTreeModelLegendNode *> rendererNodes = r->createLegendNodes( nodeLayer );
409 for ( QgsLayerTreeModelLegendNode *node : rendererNodes )
410 {
411 if ( QgsSymbolLegendNode *legendNode = qobject_cast< QgsSymbolLegendNode *>( node ) )
412 {
413 const QString ruleKey = legendNode->data( static_cast< int >( QgsLayerTreeModelLegendNode::CustomRole::RuleKey ) ).toString();
414 if ( mTextOnSymbolEnabled && mTextOnSymbolContent.contains( ruleKey ) )
415 {
416 legendNode->setTextOnSymbolLabel( mTextOnSymbolContent.value( ruleKey ) );
417 legendNode->setTextOnSymbolTextFormat( mTextOnSymbolTextFormat );
418 }
419 }
420 nodes << node;
421 }
422
423 if ( nodes.count() == 1 && nodes[0]->data( Qt::EditRole ).toString().isEmpty() && qobject_cast< QgsSymbolLegendNode * >( nodes[0] ) )
424 nodes[0]->setEmbeddedInParent( true );
425
426 if ( mLayer->diagramsEnabled() )
427 {
428 const auto constLegendItems = mLayer->diagramRenderer()->legendItems( nodeLayer );
429 for ( QgsLayerTreeModelLegendNode *i : constLegendItems )
430 {
431 nodes.append( i );
432 }
433 }
434
435 if ( mLayer->labelsEnabled() && mShowLabelLegend )
436 {
437 const QgsAbstractVectorLayerLabeling *labeling = mLayer->labeling();
438 if ( labeling )
439 {
440 const QStringList pList = labeling->subProviders();
441 for ( int i = 0; i < pList.size(); ++i )
442 {
443 const QgsPalLayerSettings s = labeling->settings( pList.at( i ) );
444 QString description;
445 const QgsRuleBasedLabeling *ruleBasedLabeling = dynamic_cast<const QgsRuleBasedLabeling *>( labeling );
446 if ( ruleBasedLabeling && ruleBasedLabeling->rootRule() )
447 {
448 const QgsRuleBasedLabeling::Rule *rule = ruleBasedLabeling->rootRule()->findRuleByKey( pList.at( i ) );
449 if ( rule )
450 {
451 description = rule->description();
452 }
453 }
454 QgsVectorLabelLegendNode *node = new QgsVectorLabelLegendNode( nodeLayer, s );
455 node->setUserLabel( description );
456 nodes.append( node );
457 }
458 }
459 }
460
461 return nodes;
462}
463
464void QgsDefaultVectorLayerLegend::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
465{
466 QgsMapLayerLegend::readXml( elem, context );
467
468 mTextOnSymbolEnabled = false;
469 mTextOnSymbolTextFormat = QgsTextFormat();
470 mTextOnSymbolContent.clear();
471
472 mShowLabelLegend = elem.attribute( u"showLabelLegend"_s, u"0"_s ).compare( u"1"_s, Qt::CaseInsensitive ) == 0;
473
474 const QDomElement tosElem = elem.firstChildElement( u"text-on-symbol"_s );
475 if ( !tosElem.isNull() )
476 {
477 mTextOnSymbolEnabled = true;
478 const QDomElement tosFormatElem = tosElem.firstChildElement( u"text-style"_s );
479 mTextOnSymbolTextFormat.readXml( tosFormatElem, context );
480 const QDomElement tosContentElem = tosElem.firstChildElement( u"content"_s );
481 QDomElement tosContentItemElem = tosContentElem.firstChildElement( u"item"_s );
482 while ( !tosContentItemElem.isNull() )
483 {
484 mTextOnSymbolContent.insert( tosContentItemElem.attribute( u"key"_s ), tosContentItemElem.attribute( u"value"_s ) );
485 tosContentItemElem = tosContentItemElem.nextSiblingElement( u"item"_s );
486 }
487 }
488}
489
490QDomElement QgsDefaultVectorLayerLegend::writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const
491{
492 QDomElement elem = QgsMapLayerLegend::writeXml( doc, context );
493 elem.setAttribute( u"type"_s, u"default-vector"_s );
494 elem.setAttribute( u"showLabelLegend"_s, mShowLabelLegend );
495
496 if ( mTextOnSymbolEnabled )
497 {
498 QDomElement tosElem = doc.createElement( u"text-on-symbol"_s );
499 const QDomElement tosFormatElem = mTextOnSymbolTextFormat.writeXml( doc, context );
500 tosElem.appendChild( tosFormatElem );
501 QDomElement tosContentElem = doc.createElement( u"content"_s );
502 for ( auto it = mTextOnSymbolContent.constBegin(); it != mTextOnSymbolContent.constEnd(); ++it )
503 {
504 QDomElement tosContentItemElem = doc.createElement( u"item"_s );
505 tosContentItemElem.setAttribute( u"key"_s, it.key() );
506 tosContentItemElem.setAttribute( u"value"_s, it.value() );
507 tosContentElem.appendChild( tosContentItemElem );
508 }
509 tosElem.appendChild( tosContentElem );
510 elem.appendChild( tosElem );
511 }
512
513 return elem;
514}
515
516
517// -------------------------------------------------------------------------
518
519
525
527{
528 QList<QgsLayerTreeModelLegendNode *> nodes;
529
530 // temporary solution for WMS. Ideally should be done with a delegate.
531 if ( mLayer->dataProvider() && mLayer->dataProvider()->supportsLegendGraphic() )
532 {
533 nodes << new QgsWmsLegendNode( nodeLayer );
534 }
535
536 const QString placeholderImage = mLayer->legendPlaceholderImage();
537 if ( !placeholderImage.isEmpty() )
538 {
539 bool fitsInCache;
540 const QImage img = QgsApplication::imageCache()->pathAsImage( placeholderImage, QSize(), false, 1.0, fitsInCache );
541 nodes << new QgsImageLegendNode( nodeLayer, img );
542 }
543 else if ( mLayer->renderer() )
544 nodes.append( mLayer->renderer()->createLegendNodes( nodeLayer ) );
545 return nodes;
546}
547
548// -------------------------------------------------------------------------
549
555
557{
558 QList<QgsLayerTreeModelLegendNode *> nodes;
559
560 const QgsMeshRendererSettings rendererSettings = mLayer->rendererSettings();
561
562 const int indexScalar = rendererSettings.activeScalarDatasetGroup();
563 const int indexVector = rendererSettings.activeVectorDatasetGroup();
564
565 QString name;
566 if ( indexScalar > -1 && indexVector > -1 && indexScalar != indexVector )
567 name = QString( "%1 / %2" ).arg( mLayer->datasetGroupMetadata( indexScalar ).name(), mLayer->datasetGroupMetadata( indexVector ).name() );
568 else if ( indexScalar > -1 )
569 name = mLayer->datasetGroupMetadata( indexScalar ).name();
570 else if ( indexVector > -1 )
571 name = mLayer->datasetGroupMetadata( indexVector ).name();
572 else
573 {
574 // neither contours nor vectors get rendered - no legend needed
575 return nodes;
576 }
577
578 if ( indexScalar > -1 )
579 {
580 const QString scalarNameKey = u"scalarName"_s;
581 nodes << new QgsSimpleLegendNode( nodeLayer, mLayer->datasetGroupMetadata( indexScalar ).name(), QIcon(), nullptr, scalarNameKey );
582 const QgsMeshRendererScalarSettings settings = rendererSettings.scalarSettings( indexScalar );
583 const QgsColorRampShader shader = settings.colorRampShader();
584 switch ( shader.colorRampType() )
585 {
587 if ( !shader.legendSettings() || shader.legendSettings()->useContinuousLegend() )
588 {
589 // for interpolated shaders we use a ramp legend node
590 if ( !shader.colorRampItemList().isEmpty() )
591 {
592 nodes
593 << new QgsColorRampLegendNode( nodeLayer, shader.createColorRamp(), shader.legendSettings() ? *shader.legendSettings() : QgsColorRampLegendNodeSettings(), shader.minimumValue(), shader.maximumValue(), nullptr, u"scalarLegend"_s, scalarNameKey );
594 }
595 break;
596 }
597 [[fallthrough]];
600 {
601 // for all others we use itemised lists
602 QgsLegendColorList items;
603 settings.colorRampShader().legendSymbologyItems( items );
604 for ( const QPair< QString, QColor > &item : items )
605 {
606 nodes << new QgsRasterSymbolLegendNode( nodeLayer, item.second, item.first, nullptr, false, u"scalarLegend"_s + QUuid::createUuid().toString(), scalarNameKey );
607 }
608 break;
609 }
610 }
611 }
612
613 if ( indexVector > -1 )
614 {
615 const QgsMeshRendererVectorSettings settings = rendererSettings.vectorSettings( indexVector );
616 const QString vectorNameKey = u"vectorName"_s;
617 switch ( settings.coloringMethod() )
618 {
620 {
621 const QColor arrowColor = settings.color();
622 const QIcon vectorIcon = QgsApplication::getThemeIcon( u"/propertyicons/meshvectors.svg"_s, arrowColor, arrowColor );
623 nodes << new QgsSimpleLegendNode( nodeLayer, mLayer->datasetGroupMetadata( indexVector ).name(), vectorIcon, nullptr, vectorNameKey );
624 break;
625 }
627 {
628 const QIcon vectorIcon = QgsApplication::getThemeIcon( u"/propertyicons/meshvectors.svg"_s );
629 nodes << new QgsSimpleLegendNode( nodeLayer, mLayer->datasetGroupMetadata( indexVector ).name(), vectorIcon, nullptr, vectorNameKey );
630 const QgsColorRampShader shader = settings.colorRampShader();
631 switch ( shader.colorRampType() )
632 {
634 if ( !shader.legendSettings() || shader.legendSettings()->useContinuousLegend() )
635 {
636 // for interpolated shaders we use a ramp legend node
637 if ( !shader.colorRampItemList().isEmpty() )
638 {
639 nodes << new QgsColorRampLegendNode(
640 nodeLayer,
641 shader.createColorRamp(),
643 shader.minimumValue(),
644 shader.maximumValue(),
645 nullptr,
646 u"vectorLegend"_s,
647 vectorNameKey
648 );
649 }
650 break;
651 }
652 [[fallthrough]];
655 {
656 // for all others we use itemised lists
657 QgsLegendColorList items;
658 settings.colorRampShader().legendSymbologyItems( items );
659 for ( const QPair< QString, QColor > &item : items )
660 {
661 nodes << new QgsRasterSymbolLegendNode( nodeLayer, item.second, item.first, nullptr, false, u"vectorLegend"_s + QUuid::createUuid().toString(), vectorNameKey );
662 }
663 break;
664 }
665 break;
666 }
667 }
668 }
669 }
670
671 return nodes;
672}
673
674//
675// QgsDefaultPointCloudLayerLegend
676//
677
683
685{
686 QgsPointCloudRenderer *renderer = mLayer->renderer();
687 if ( !renderer )
688 return QList<QgsLayerTreeModelLegendNode *>();
689
690 return renderer->createLegendNodes( nodeLayer );
691}
QFlags< MapLayerLegendFlag > MapLayerLegendFlags
Map layer legend flags.
Definition qgis.h:5009
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
Definition qgis.h:1577
@ Linear
Interpolates the color between two class breaks linearly.
Definition qgis.h:1575
@ Discrete
Assigns the color of the higher class for every pixel between two class breaks.
Definition qgis.h:1576
@ ExcludeByDefault
If set, the layer should not be included in legends by default, and must be manually added by a user.
Definition qgis.h:5000
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.
QgsProject * project() const
Returns the parent project if this map layer is added to a project.
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.
QgsPathResolver pathResolver() const
Returns path resolver object with considering whether the project uses absolute or relative paths and...
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()
static const QgsSettingsEntryBool * settingsLayerTreeShowLegendClassifiers
Settings entry for showing legend classifiers (classification attribute name) in layer tree.
Implementation of legend node interface for displaying arbitrary labels with icons.
QgsTextFormat defaultTextFormat(QgsStyle::TextFormatContext context=QgsStyle::TextFormatContext::Labeling) const
Returns the default text format to use for new text based objects in the specified context.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
Definition qgsstyle.cpp:164
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:71
QList< QPair< QString, QColor > > QgsLegendColorList