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( 
',' ) );
 
   89   int numNodes = lst.count();
 
   98     QgsDebugMsg( QStringLiteral( 
"Legend node order manipulation is invalid without existing legend" ) );
 
  102   int numNodes = _originalLegendNodeCount( nodeLayer );
 
  105   order.reserve( numNodes );
 
  106   for ( 
int i = 0; i < numNodes; ++i )
 
  113   QString orderStr = nodeLayer->
customProperty( QStringLiteral( 
"legend/node-order" ) ).toString();
 
  115   if ( orderStr.isEmpty() )
 
  116     return _makeNodeOrder( nodeLayer );
 
  118   if ( orderStr == QLatin1String( 
"empty" ) )
 
  121   int numNodes = _originalLegendNodeCount( nodeLayer );
 
  124   const auto constSplit = orderStr.split( 
',' );
 
  125   for ( 
const QString &item : constSplit )
 
  128     int id = item.toInt( &ok );
 
  129     if ( !ok || id < 0 || id >= numNodes )
 
  130       return _makeNodeOrder( nodeLayer );
 
  140   return nodeLayer->
customProperties().contains( QStringLiteral( 
"legend/node-order" ) );
 
  145   nodeLayer->
setCustomProperty( 
"legend/label-" + QString::number( originalIndex ), newLabel );
 
  150   return nodeLayer->
customProperty( 
"legend/label-" + QString::number( originalIndex ) ).toString();
 
  155   return nodeLayer->
customProperties().contains( 
"legend/label-" + QString::number( originalIndex ) );
 
  160   QDomDocument patchDoc;
 
  161   QDomElement patchElem = patchDoc.createElement( QStringLiteral( 
"patch" ) );
 
  163   patchDoc.appendChild( patchElem );
 
  164   nodeLayer->
setCustomProperty( 
"legend/patch-shape-" + QString::number( originalIndex ), patchDoc.toString() );
 
  169   QString patchDef = nodeLayer->
customProperty( 
"legend/patch-shape-" + QString::number( originalIndex ) ).toString();
 
  170   if ( patchDef.isEmpty() )
 
  173   QDomDocument doc( QStringLiteral( 
"patch" ) );
 
  174   doc.setContent( patchDef );
 
  182   if ( size.isValid() )
 
  190   const QString size = nodeLayer->
customProperty( 
"legend/symbol-size-" + QString::number( originalIndex ) ).toString();
 
  191   if ( size.isEmpty() )
 
  205     doc.appendChild( elem );
 
  206     nodeLayer->
setCustomProperty( 
"legend/custom-symbol-" + QString::number( originalIndex ), doc.toString() );
 
  214   const QString symbolDef = nodeLayer->
customProperty( 
"legend/custom-symbol-" + QString::number( originalIndex ) ).toString();
 
  215   if ( symbolDef.isEmpty() )
 
  219   doc.setContent( symbolDef );
 
  220   const QDomElement elem = doc.documentElement();
 
  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() );
 
  241     nodeLayer->
removeCustomProperty( 
"legend/custom-ramp-settings-" + QString::number( originalIndex ) );
 
  246   const QString settingsDef = nodeLayer->
customProperty( 
"legend/custom-ramp-settings-" + QString::number( originalIndex ) ).toString();
 
  247   if ( settingsDef.isEmpty() )
 
  251   doc.setContent( settingsDef );
 
  252   const QDomElement elem = doc.documentElement();
 
  258   settings.
readXml( elem, rwContext );
 
  264   if ( columnBreakBeforeNode )
 
  265     nodeLayer->
setCustomProperty( 
"legend/column-break-" + QString::number( originalIndex ), QStringLiteral( 
"1" ) );
 
  272   return nodeLayer->
customProperty( 
"legend/column-break-" + QString::number( originalIndex ) ).toInt();
 
  279   const auto constNodes = nodes;
 
  283     if ( !userLabel.isNull() )
 
  289       symbolNode->setPatchShape( shape );
 
  298         colorRampNode->setSettings( *settings );
 
  303     if ( userSize.isValid() )
 
  319     QList<QgsLayerTreeModelLegendNode *> newOrder;
 
  320     QSet<int> usedIndices;
 
  321     const auto constOrder = order;
 
  322     for ( 
int idx : constOrder )
 
  324       if ( usedIndices.contains( idx ) )
 
  326         QgsDebugMsg( QStringLiteral( 
"invalid node order. ignoring." ) );
 
  330       newOrder << nodes[idx];
 
  335     for ( 
int i = 0; i < nodes.count(); ++i )
 
  337       if ( !usedIndices.contains( i ) )
 
  358   QList<QgsLayerTreeModelLegendNode *> nodes;
 
  364   if ( nodeLayer->
customProperty( QStringLiteral( 
"showFeatureCount" ), 0 ).toBool() )
 
  376     if ( 
auto *lDataDefinedSizeLegendSettings = i.dataDefinedSizeLegendSettings() )
 
  381       if ( mTextOnSymbolEnabled && mTextOnSymbolContent.contains( i.ruleKey() ) )
 
  383         legendNode->setTextOnSymbolLabel( mTextOnSymbolContent.value( i.ruleKey() ) );
 
  384         legendNode->setTextOnSymbolTextFormat( mTextOnSymbolTextFormat );
 
  390   if ( nodes.count() == 1 && nodes[0]->data( Qt::EditRole ).toString().isEmpty() )
 
  409   mTextOnSymbolEnabled = 
false;
 
  411   mTextOnSymbolContent.clear();
 
  413   QDomElement tosElem = elem.firstChildElement( QStringLiteral( 
"text-on-symbol" ) );
 
  414   if ( !tosElem.isNull() )
 
  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() )
 
  423       mTextOnSymbolContent.insert( tosContentItemElem.attribute( QStringLiteral( 
"key" ) ), tosContentItemElem.attribute( QStringLiteral( 
"value" ) ) );
 
  424       tosContentItemElem = tosContentItemElem.nextSiblingElement( QStringLiteral( 
"item" ) );
 
  431   QDomElement elem = doc.createElement( QStringLiteral( 
"legend" ) );
 
  432   elem.setAttribute( QStringLiteral( 
"type" ), QStringLiteral( 
"default-vector" ) );
 
  434   if ( mTextOnSymbolEnabled )
 
  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 )
 
  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 );
 
  447     tosElem.appendChild( tosContentElem );
 
  448     elem.appendChild( tosElem );
 
  466   QList<QgsLayerTreeModelLegendNode *> nodes;
 
  489   QList<QgsLayerTreeModelLegendNode *> nodes;
 
  501   if ( indexScalar > -1 && indexVector > -1 && indexScalar != indexVector )
 
  503   else if ( indexScalar > -1 )
 
  505   else if ( indexVector > -1 )
 
  515   if ( indexScalar > -1 )
 
  535         for ( 
const QPair< QString, QColor > &item : items )
 
  561     return QList<QgsLayerTreeModelLegendNode *>();
 
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.
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.
virtual QgsMeshDatasetGroupMetadata datasetGroupMetadata(int groupIndex) const =0
Returns dataset group metadata.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
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.
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:
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.
Container for all settings relating to text rendering.
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)
QList< QPair< QString, QColor > > QgsLegendColorList