20#include "moc_qgslayertreemodel.cpp" 
   42  : QAbstractItemModel( parent )
 
   43  , mRootNode( rootNode )
 
   44  , mFlags( ShowLegend | AllowLegendChangeState | DeferredLegendInvalidation )
 
 
   64  if ( !
index.isValid() )
 
   67  QObject *obj = 
reinterpret_cast<QObject *
>( 
index.internalPointer() );
 
   68  return qobject_cast<QgsLayerTreeNode *>( obj );
 
 
  102    return QModelIndex();
 
  109    return QModelIndex(); 
 
  116  return createIndex( row, column, 
static_cast<QObject *
>( n->
children().at( row ) ) );
 
 
  122  if ( !child.isValid() )
 
  123    return QModelIndex();
 
  136    return QModelIndex();
 
 
  144  Q_ASSERT( parentNode );
 
  147  if ( !grandParentNode )
 
  148    return QModelIndex();  
 
  150  int row = grandParentNode->
children().indexOf( parentNode );
 
  151  Q_ASSERT( row >= 0 );
 
  153  return createIndex( row, 0, 
static_cast<QObject *
>( parentNode ) );
 
 
  166  if ( role == Qt::DisplayRole || role == Qt::EditRole )
 
  174      QString name = nodeLayer->
name();
 
  176      if ( vlayer && nodeLayer->
customProperty( QStringLiteral( 
"showFeatureCount" ), 0 ).toInt() && role == Qt::DisplayRole )
 
  182        name += QStringLiteral( 
" [%1%2]" ).arg(
 
  183                  estimatedCount ? QStringLiteral( 
"≈" ) : QString(),
 
  184                  count != -1 ? QLocale().toString( count ) : tr( 
"N/A" ) );
 
  189  else if ( role == Qt::DecorationRole && 
index.column() == 0 )
 
  214        QPixmap pixmap( icon.pixmap( iconSize, iconSize ) );
 
  216        QPainter painter( &pixmap );
 
  217        painter.drawPixmap( 0, 0, iconSize, iconSize, 
QgsApplication::getThemePixmap( layer->
isModified() ? QStringLiteral( 
"/mIconEditableEdits.svg" ) : QStringLiteral( 
"/mActionToggleEditing.svg" ) ) );
 
  220        icon = QIcon( pixmap );
 
  226  else if ( role == Qt::CheckStateRole )
 
  250      f.setUnderline( 
true );
 
  256        f.setItalic( !f.italic() );
 
  263    QBrush brush( qApp->palette().color( QPalette::Text ), Qt::SolidPattern );
 
  269        QColor fadedTextColor = brush.color();
 
  270        fadedTextColor.setAlpha( 128 );
 
  271        brush.setColor( fadedTextColor );
 
  276  else if ( role == Qt::ToolTipRole )
 
  282        QString title = !layer->
metadata().
title().isEmpty() ? layer->metadata().title() :
 
  283                        !layer->serverProperties()->title().isEmpty() ? layer->serverProperties()->title() :
 
  284                        !layer->serverProperties()->shortName().isEmpty() ? layer->serverProperties()->shortName() :
 
  287        title = 
"<b>" + title.toHtmlEscaped() + 
"</b>";
 
  289        if ( layer->isSpatial() && layer->crs().isValid() )
 
  291          QString layerCrs = layer->crs().authid();
 
  292          if ( !std::isnan( layer->crs().coordinateEpoch() ) )
 
  294            layerCrs += QStringLiteral( 
" @ %1" ).arg( 
qgsDoubleToString( layer->crs().coordinateEpoch(), 3 ) );
 
  296          if ( 
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
 
  299            title += tr( 
" (%1)" ).arg( layerCrs ).toHtmlEscaped();
 
  305        const QString abstract = !layer->metadata().abstract().isEmpty() ? layer->metadata().abstract() : layer->serverProperties()->abstract();
 
  306        if ( !abstract.isEmpty() )
 
  309          const QStringList abstractLines = abstract.split( 
'\n' );
 
  310          for ( 
const auto &l : abstractLines )
 
  312            parts << l.toHtmlEscaped();
 
  317        QString source( layer->publicSource() );
 
  318        if ( source.size() > 1024 )
 
  320          source = source.left( 1023 ) + QString( QChar( 0x2026 ) );
 
  323        parts << 
"<i>" + source.toHtmlEscaped() + 
"</i>";
 
  326        const bool showFeatureCount = nodeLayer->
customProperty( QStringLiteral( 
"showFeatureCount" ), 0 ).toBool();
 
  328        if ( showFeatureCount && estimatedCount )
 
  330          parts << tr( 
"<b>Feature count is estimated</b> : the feature count is determined by the database statistics" );
 
  333        return parts.join( QLatin1String( 
"<br/>" ) );
 
 
  344  if ( !
index.isValid() )
 
  346    Qt::ItemFlags rootFlags = Qt::ItemFlags();
 
  348      rootFlags |= Qt::ItemIsDropEnabled;
 
  355  Qt::ItemFlags f = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
 
  358    f |= Qt::ItemIsEditable;
 
  361  bool isEmbedded = node->
customProperty( QStringLiteral( 
"embedded" ) ).toInt();
 
  366    if ( !isEmbedded || ( isEmbedded && node->
parent() && !node->
parent()->
customProperty( QStringLiteral( 
"embedded" ) ).toInt() ) )
 
  367      f |= Qt::ItemIsDragEnabled;
 
  371    f |= Qt::ItemIsUserCheckable;
 
  374    f |= Qt::ItemIsDropEnabled;
 
 
  386    bool res = sym->
setData( value, role );
 
  394    return QAbstractItemModel::setData( 
index, value, role );
 
  396  if ( role == Qt::CheckStateRole )
 
  401    bool checked = 
static_cast< Qt::CheckState 
>( value.toInt() ) == Qt::Checked;
 
  402    if ( checked &&  node->
children().isEmpty() )
 
  422  else if ( role == Qt::EditRole )
 
  430      layer->
setName( value.toString() );
 
  440  return QAbstractItemModel::setData( 
index, value, role );
 
 
  445  if ( !node || !node->
parent() )
 
  446    return QModelIndex(); 
 
  451  Q_ASSERT( row >= 0 );
 
  452  return index( row, 0, parentIndex );
 
 
  461  if ( child->
parent() == node )
 
  464  return _isChildOfNode( child->
parent(), node );
 
  467static bool _isChildOfNodes( 
QgsLayerTreeNode *child, 
const QList<QgsLayerTreeNode *> &nodes )
 
  471    if ( _isChildOfNode( child, n ) )
 
  481  QList<QgsLayerTreeNode *> nodes;
 
  482  const auto constList = list;
 
  483  for ( 
const QModelIndex &
index : constList )
 
  496  QList<QgsLayerTreeNode *> nodesFinal;
 
  499    if ( !_isChildOfNodes( node, nodes ) )
 
 
  530  emit dataChanged( idx, idx );
 
  534  if ( oldNodeCount > 0 )
 
  536    beginRemoveRows( idx, 0, oldNodeCount - 1 );
 
 
  620    auto filterSettings = std::make_unique< QgsLayerTreeFilterSettings >( *settings );
 
  631    if ( useExpressions )
 
 
  653    mFilterSettings = std::make_unique< QgsLayerTreeFilterSettings >( *settings );
 
  656    bool hitTestWasRunning = 
false;
 
  663      hitTestWasRunning = 
true;
 
  666    std::unique_ptr< QgsMapHitTest > blockingHitTest;
 
  670      blockingHitTest = std::make_unique< QgsMapHitTest >( *
mFilterSettings );
 
  677      if ( !hitTestWasRunning )
 
  682      blockingHitTest->run();
 
  684      handleHitTestResults();
 
  693    handleHitTestResults();
 
 
  702void QgsLayerTreeModel::handleHitTestResults()
 
  730  if ( scale != previousScale )
 
 
  782  beginInsertRows( 
node2index( node ), indexFrom, indexTo );
 
 
  785static QList<QgsLayerTreeLayer *> _layerNodesInSubtree( 
QgsLayerTreeNode *node, 
int indexFrom, 
int indexTo )
 
  787  QList<QgsLayerTreeNode *> children = node->
children();
 
  788  QList<QgsLayerTreeLayer *> newLayerNodes;
 
  789  for ( 
int i = indexFrom; i <= indexTo; ++i )
 
  797  return newLayerNodes;
 
  806  const auto subNodes = _layerNodesInSubtree( node, indexFrom, indexTo );
 
 
  815  beginRemoveRows( 
node2index( node ), indexFrom, indexTo );
 
  818  const auto subNodes = _layerNodesInSubtree( node, indexFrom, indexTo );
 
 
  883  QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
 
 
  899  QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
 
 
  913  QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
 
  924  if ( nodeLayer->
customProperty( QStringLiteral( 
"showFeatureCount" ) ).toInt() )
 
 
  936  if ( 
index.isValid() )
 
 
  940void QgsLayerTreeModel::legendNodeSizeChanged()
 
  947  if ( 
index.isValid() )
 
  948    emit dataChanged( 
index, 
index, QVector<int> { Qt::SizeHintRole } );
 
  951void QgsLayerTreeModel::hitTestTaskCompleted()
 
  956    handleHitTestResults();
 
  963  if ( !nodeLayer->
layer() )
 
 
 1015  const auto constChildren = group->
children();
 
 1033  disconnect( nodeLayer, 
nullptr, 
this, 
nullptr ); 
 
 1035  if ( !nodeLayer->
layer() )
 
 1046    disconnect( nodeLayer->
layer(), 
nullptr, 
this, 
nullptr );
 
 
 1052  const auto constChildren = parentGroup->
children();
 
 
 1064  const auto constChildren = parentGroup->
children();
 
 
 1093    disconnect( 
mRootNode, 
nullptr, 
this, 
nullptr );
 
 
 1104  int count = node->
children().count();
 
 1107  emit dataChanged( 
index( 0, 0, idx ), 
index( count - 1, 0, idx ) );
 
 1108  for ( 
int i = 0; i < count; ++i )
 
 
 1124        emit dataChanged( idx, idx, QVector<int>() << Qt::FontRole << Qt::ForegroundRole );
 
 1127  int count = node->
children().count();
 
 1128  for ( 
int i = 0; i < count; ++i )
 
 
 1134  return Qt::CopyAction | Qt::MoveAction;
 
 
 1140  types << QStringLiteral( 
"application/qgis.layertreemodeldata" );
 
 
 1148  QModelIndexList sortedIndexes = indexes;
 
 1149  std::sort( sortedIndexes.begin(), sortedIndexes.end(), std::less<QModelIndex>() );
 
 1151  QList<QgsLayerTreeNode *> nodesFinal = 
indexes2nodes( sortedIndexes, 
true );
 
 1153  if ( nodesFinal.isEmpty() )
 
 1156  QMimeData *
mimeData = 
new QMimeData();
 
 1158  QDomDocument layerTreeDoc;
 
 1159  QDomElement rootLayerTreeElem = layerTreeDoc.createElement( QStringLiteral( 
"layer_tree_model_data" ) );
 
 1165  layerTreeDoc.appendChild( rootLayerTreeElem );
 
 1167  QString errorMessage;
 
 1169  QDomDocument layerDefinitionsDoc( QStringLiteral( 
"qgis-layer-definition" ) );
 
 1172  QString txt = layerDefinitionsDoc.toString();
 
 1174  mimeData->setData( QStringLiteral( 
"application/qgis.layertreemodeldata" ), layerTreeDoc.toString().toUtf8() );
 
 1175  mimeData->setData( QStringLiteral( 
"application/qgis.application.pid" ), QString::number( QCoreApplication::applicationPid() ).toUtf8() );
 
 1176  mimeData->setData( QStringLiteral( 
"application/qgis.layertree.source" ), QStringLiteral( 
":0x%1" ).arg( 
reinterpret_cast<quintptr
>( 
this ), 2 * QT_POINTER_SIZE, 16, QLatin1Char( 
'0' ) ).toUtf8() );
 
 1177  mimeData->setData( QStringLiteral( 
"application/qgis.layertree.layerdefinitions" ), txt.toUtf8() );
 
 
 1185  if ( action == Qt::IgnoreAction )
 
 1188  if ( !
data->hasFormat( QStringLiteral( 
"application/qgis.layertreemodeldata" ) ) )
 
 1195  const QString restrictTypes( 
data->data( QStringLiteral( 
"application/qgis.restrictlayertreemodelsubclass" ) ) );
 
 1196  if ( !restrictTypes.isEmpty() && restrictTypes != QString( metaObject()->className() ) )
 
 1203  if ( 
parent.isValid() && row == -1 )
 
 1209  qint64 qgisPid = 
data->data( QStringLiteral( 
"application/qgis.application.pid" ) ).toInt( &ok );
 
 1211  if ( ok && qgisPid != QCoreApplication::applicationPid() )
 
 1213    QByteArray encodedLayerDefinitionData = 
data->data( QStringLiteral( 
"application/qgis.layertree.layerdefinitions" ) );
 
 1214    QDomDocument layerDefinitionDoc;
 
 1215    if ( !layerDefinitionDoc.setContent( QString::fromUtf8( encodedLayerDefinitionData ) ) )
 
 1218    QString errorMessage;
 
 1220    emit 
messageEmitted( tr( 
"New layers added from another QGIS instance" ) );
 
 1224    QByteArray encodedLayerTreeData = 
data->data( QStringLiteral( 
"application/qgis.layertreemodeldata" ) );
 
 1226    QDomDocument layerTreeDoc;
 
 1227    if ( !layerTreeDoc.setContent( QString::fromUtf8( encodedLayerTreeData ) ) )
 
 1230    QDomElement rootLayerTreeElem = layerTreeDoc.documentElement();
 
 1231    if ( rootLayerTreeElem.tagName() != QLatin1String( 
"layer_tree_model_data" ) )
 
 1234    QList<QgsLayerTreeNode *> nodes;
 
 1236    QDomElement elem = rootLayerTreeElem.firstChildElement();
 
 1237    while ( !elem.isNull() )
 
 1243      elem = elem.nextSiblingElement();
 
 1246    if ( nodes.isEmpty() )
 
 
 1285  return mFlags.testFlag( f );
 
 
 1295  QList<QgsLayerTreeModelLegendNode *> filtered;
 
 1307    if ( !nodes.isEmpty() && 
mFilterSettings->layers().contains( nodes.at( 0 )->layerNode()->layer() ) )
 
 1329                                 || node->data( Qt::CheckStateRole ).toInt() == Qt::Checked;
 
 1333              if ( 
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( node->layerNode()->layer() ) )
 
 1337                     ( it->contains( ruleKey ) ||
 
 1338                       ( !it->isEmpty() && isDataDefinedSize )
 
 
 1373  const auto constMLegend = 
mLegend;
 
 1376    qDeleteAll( 
data.originalNodes );
 
 
 1393  if ( 
mLegend.contains( nodeLayer ) )
 
 1395    qDeleteAll( 
mLegend[nodeLayer].originalNodes );
 
 1396    delete mLegend[nodeLayer].tree;
 
 
 1404  if ( !nodeL || !nodeL->
layer() )
 
 1424    int widgetsCount = ml->
customProperty( QStringLiteral( 
"embeddedWidgets/count" ), 0 ).toInt();
 
 1425    while ( widgetsCount > 0 )
 
 1427      lstNew.insert( 0, 
new EmbeddedWidgetLegendNode( nodeL ) );
 
 1432  QList<QgsLayerTreeModelLegendNode *> filteredLstNew = 
filterLegendNodes( lstNew );
 
 1434  const auto constLstNew = lstNew;
 
 1437    n->setParent( 
this );
 
 1446  const auto constFilteredLstNew = filteredLstNew;
 
 1451      embeddedNode = legendNode;
 
 1452      filteredLstNew.removeOne( legendNode );
 
 1463  int count = legendTree ? legendTree->
children[
nullptr].count() : filteredLstNew.count();
 
 1465  if ( !filteredLstNew.isEmpty() )
 
 1468    const QModelIndex nodeIndex { 
node2index( nodeL ) };
 
 1475    beginInsertRows( 
node2index( nodeL ), 0, count - 1 );
 
 1480  data.activeNodes = filteredLstNew;
 
 1481  data.embeddedNodeInParent = embeddedNode;
 
 1482  data.tree = legendTree;
 
 1486  if ( !filteredLstNew.isEmpty() )
 
 
 1501  bool hasParentKeys = 
false;
 
 1506      hasParentKeys = 
true;
 
 1510  if ( !hasParentKeys )
 
 1514  QHash<QString, QgsLayerTreeModelLegendNode *> rule2node;
 
 1515  rule2node[QString()] = 
nullptr;
 
 1519    if ( ruleKey.isEmpty() ) 
 
 1521    if ( rule2node.contains( ruleKey ) ) 
 
 1523    rule2node[ruleKey] = n;
 
 
 1548  context->setScaleFactor( dpi / 25.4 );
 
 1555  context->setRendererScale( scale );
 
 1560  return validData ? context.release() : 
nullptr;
 
 
 1565  return qobject_cast<QgsLayerTreeModelLegendNode *>( 
reinterpret_cast<QObject *
>( 
index.internalPointer() ) );
 
 
 1577      int row = 
data.tree->children[parentLegendNode].indexOf( legendNode );
 
 1578      return index( row, 0, parentIndex );
 
 1583      int row = 
data.tree->children[
nullptr].indexOf( legendNode );
 
 1584      return index( row, 0, parentIndex );
 
 1589  Q_ASSERT( parentIndex.isValid() );
 
 1590  int row = 
data.activeNodes.indexOf( legendNode );
 
 1592    return QModelIndex();
 
 1594  return index( row, 0, parentIndex );
 
 
 1610  if ( !
mLegend.contains( nL ) )
 
 1617  int count = 
data.activeNodes.count();
 
 
 1624  Q_ASSERT( 
mLegend.contains( nL ) );
 
 1627    return createIndex( row, column, 
static_cast<QObject *
>( 
data.tree->children[
nullptr].at( row ) ) );
 
 1629  return createIndex( row, column, 
static_cast<QObject *
>( 
data.activeNodes.at( row ) ) );
 
 
 1637    return createIndex( row, column, 
static_cast<QObject *
>( 
data.tree->children[node].at( row ) ) );
 
 1639  return QModelIndex(); 
 
 
 1652      int row = 
data.tree->children[grandParentNode].indexOf( parentNode );
 
 1653      return createIndex( row, 0, 
static_cast<QObject *
>( parentNode ) );
 
 
 1667  return node->
data( role );
 
 
 1673  Qt::ItemFlags f = node->
flags();
 
 1675    f &= ~Qt::ItemIsUserCheckable;
 
 
 1682  return static_cast< bool >( 
mLegend[nodeLayer].embeddedNodeInParent );
 
 
 1687  return mLegend[nodeLayer].embeddedNodeInParent;
 
 
 1696  return QIcon( qvariant_cast<QPixmap>( legendNode->
data( Qt::DecorationRole ) ) );
 
 
 1702  if ( !
mLegend.contains( nodeLayer ) )
 
 1703    return QList<QgsLayerTreeModelLegendNode *>();
 
 1706  QList<QgsLayerTreeModelLegendNode *> lst( 
data.activeNodes );
 
 1707  if ( !skipNodeEmbeddedInParent && 
data.embeddedNodeInParent )
 
 1708    lst.prepend( 
data.embeddedNodeInParent );
 
 
 1714  return mLegend.value( nodeLayer ).originalNodes;
 
 
 1719  for ( 
auto it = 
mLegend.constBegin(); it != 
mLegend.constEnd(); ++it )
 
 1722    if ( layer->
layerId() == layerId )
 
 1724      const auto activeNodes = 
mLegend.value( layer ).activeNodes;
 
 
 1763    QList<QgsSymbolLegendNode *> symbolNodes;
 
 1764    QMap<QString, int> widthMax;
 
 1772        widthMax[parentKey] = std::max( sz.width(), widthMax.contains( parentKey ) ? widthMax[parentKey] : 0 );
 
 1774        symbolNodes.append( n );
 
 1780      Q_ASSERT( widthMax[parentKey] > 0 );
 
 1781      const int twiceMarginWidth = 2; 
 
 1782      n->setIconSize( QSize( widthMax[parentKey] + twiceMarginWidth, n->iconSize().rheight() + twiceMarginWidth ) );
 
 
 1791void QgsLayerTreeModel::layerProfileGenerationPropertyChanged()
 
 1797  if ( !elevationProperties )
 
 1800  if ( 
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( elevationProperties->parent() ) )
 
@ UsersCannotToggleEditing
Indicates that users are not allowed to toggle editing for this layer. Note that this does not imply ...
 
@ SkipVisibilityCheck
If set, the standard visibility check should be skipped.
 
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
 
@ RenderLayerTree
The render is for a layer tree display where map based properties are not available and where avoidan...
 
@ Antialiasing
Use antialiasing while drawing.
 
static int scaleIconSize(int standardSize, bool applyDevicePixelRatio=false)
Scales an icon size to compensate for display pixel density, making the icon size hi-dpi friendly,...
 
static QPixmap getThemePixmap(const QString &name, const QColor &foreColor=QColor(), const QColor &backColor=QColor(), int size=16)
Helper to get a theme icon as a pixmap.
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
static QgsTaskManager * taskManager()
Returns the application's task manager, used for managing application wide background task handling.
 
virtual QString dataSourceUri(bool expandAuthConfig=false) const
Gets the data source specification.
 
Stores the component parts of a data source URI (e.g.
 
bool useEstimatedMetadata() const
Returns true if estimated metadata should be used for the connection.
 
A geometry is the spatial representation of a feature.
 
static QIcon iconForLayer(const QgsMapLayer *layer)
Returns the icon corresponding to a specified map layer.
 
static bool loadLayerDefinition(const QString &path, QgsProject *project, QgsLayerTreeGroup *rootGroup, QString &errorMessage, Qgis::LayerTreeInsertionMethod insertMethod=Qgis::LayerTreeInsertionMethod::OptimalInInsertionGroup, const QgsLayerTreeRegistryBridge::InsertionPoint *insertPoint=nullptr)
Loads the QLR at path into QGIS.
 
static bool exportLayerDefinition(const QString &path, const QList< QgsLayerTreeNode * > &selectedTreeNodes, QString &errorMessage)
Exports the selected layer tree nodes to a QLR file.
 
Contains settings relating to filtering the contents of QgsLayerTreeModel and views.
 
void setFilterPolygon(const QgsGeometry &polygon)
Sets the optional filter polygon, used when testing for symbols to show in the legend.
 
void setLayerFilterExpressionsFromLayerTree(QgsLayerTree *tree)
Sets layer filter expressions using a layer tree.
 
void setFlags(Qgis::LayerTreeFilterFlags flags)
Sets the filter flags.
 
Layer tree group node serves as a container for layers and further groups.
 
void setName(const QString &n) override
Sets the group's name.
 
QString name() const override
Returns the group's name.
 
void insertChildNodes(int index, const QList< QgsLayerTreeNode * > &nodes)
Insert existing nodes at specified position.
 
QList< QgsLayerTreeLayer * > findLayers() const
Find all layer nodes.
 
QgsLayerTreeLayer * findLayer(QgsMapLayer *layer) const
Find layer node representing the map layer.
 
void removeChildren(int from, int count)
Remove child nodes from index "from".
 
Layer tree node points to a map layer.
 
QString layerId() const
Returns the ID for the map layer associated with this node.
 
void layerWillBeUnloaded()
Emitted when a previously available layer got unloaded (from layer registry).
 
void setName(const QString &n) override
Sets the layer's name.
 
QString name() const override
Returns the layer's name.
 
void layerLoaded()
Emitted when a previously unavailable layer got loaded.
 
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.
 
NodeTypes
Types of legend nodes.
 
@ SimpleLegend
Simple label with icon legend node type.
 
@ RasterSymbolLegend
Raster symbol legend node type.
 
@ ImageLegend
Raster image legend node type.
 
@ DataDefinedSizeLegend
Marker symbol legend node type.
 
@ WmsLegend
WMS legend node type.
 
@ EmbeddedWidget
Embedded widget placeholder node type.
 
@ ColorRampLegend
Color ramp legend.
 
@ SymbolLegend
Vector symbol legend node type.
 
@ ParentRuleKey
Rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2....
 
@ NodeType
Type of node. Added in 3.16.
 
@ RuleKey
Rule key of the node (QString)
 
@ IsDataDefinedSize
Set when a node is related to data defined size (title or separated legend items)....
 
virtual void invalidateMapBasedData()
Notification from model that information from associated map view has changed.
 
void sizeChanged()
Emitted when the size of this node changes.
 
void dataChanged()
Emitted on internal data change so the layer tree model can forward the signal to views.
 
virtual bool isEmbeddedInParent() const
 
virtual Qt::ItemFlags flags() const
Returns item flags associated with the item. Default implementation returns Qt::ItemIsEnabled.
 
QgsLayerTreeLayer * layerNode() const
Returns pointer to the parent layer node.
 
virtual bool setData(const QVariant &value, int role)
Sets some data associated with the item. Default implementation does nothing and returns false.
 
QTimer mDeferLegendInvalidationTimer
 
void legendInvalidateMapBasedData()
 
void connectToLayer(QgsLayerTreeLayer *nodeLayer)
 
int columnCount(const QModelIndex &parent=QModelIndex()) const override
 
QModelIndex node2index(QgsLayerTreeNode *node) const
Returns index for a given node. If the node does not belong to the layer tree, the result is undefine...
 
Flags flags() const
Returns OR-ed combination of model flags.
 
double mLegendFilterByScale
scale denominator for filtering of legend nodes (<= 0 means no filtering)
 
QList< QgsLayerTreeModelLegendNode * > layerLegendNodes(QgsLayerTreeLayer *nodeLayer, bool skipNodeEmbeddedInParent=false)
Returns filtered list of active legend nodes attached to a particular layer node (by default it retur...
 
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
 
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
 
int autoCollapseLegendNodes() const
Returns at what number of legend nodes the layer node should be collapsed. -1 means no auto-collapse ...
 
void nodeLayerWillBeUnloaded()
 
void setFilterSettings(const QgsLayerTreeFilterSettings *settings=nullptr)
Sets the filter settings to use to filter legend nodes.
 
QVariant legendNodeData(QgsLayerTreeModelLegendNode *node, int role) const
 
void hitTestStarted()
Emitted when a hit test for visible legend items starts.
 
double mLegendMapViewScale
 
void setRootGroup(QgsLayerTree *newRootGroup)
Reset the model and use a new root group node.
 
Q_DECL_DEPRECATED void setLegendFilterByMap(const QgsMapSettings *settings)
Force only display of legend nodes which are valid for given map settings.
 
QModelIndex legendNode2index(QgsLayerTreeModelLegendNode *legendNode)
Returns index for a given legend node.
 
void setLegendFilterByScale(double scale)
Force only display of legend nodes which are valid for a given scale.
 
~QgsLayerTreeModel() override
 
void hitTestCompleted()
Emitted when a hit test for visible legend items completes.
 
std::unique_ptr< QgsLayerTreeFilterSettings > mFilterSettings
 
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
 
void setLegendMapViewData(double mapUnitsPerPixel, int dpi, double scale)
Give the layer tree model hints about the currently associated map view so that legend nodes that use...
 
void nodeCustomPropertyChanged(QgsLayerTreeNode *node, const QString &key)
 
QgsLayerTreeModel(QgsLayerTree *rootNode, QObject *parent=nullptr)
Construct a new tree model with given layer tree (root node must not be nullptr).
 
void connectToLayers(QgsLayerTreeGroup *parentGroup)
 
QMap< QString, QSet< QString > > mHitTestResults
 
QModelIndex parent(const QModelIndex &child) const override
 
void setFlag(Flag f, bool on=true)
Enable or disable a model flag.
 
QModelIndex legendParent(QgsLayerTreeModelLegendNode *legendNode) const
 
void setLayerTreeNodeFont(int nodeType, const QFont &font)
Sets font for a particular type of layer tree node. nodeType should come from QgsLayerTreeNode::NodeT...
 
int legendNodeRowCount(QgsLayerTreeModelLegendNode *node) const
 
void nodeAddedChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
 
void setAutoCollapseLegendNodes(int nodeCount)
Sets at what number of legend nodes the layer node should be collapsed. Setting -1 disables the auto-...
 
void legendMapViewData(double *mapUnitsPerPixel, int *dpi, double *scale) const
Gets hints about map view - to be used in legend nodes.
 
QModelIndex currentIndex() const
Gets index of the item marked as current. Item marked as current is underlined.
 
bool hitTestInProgress() const
Returns true if a hit test for visible legend items is currently in progress.
 
void recursivelyEmitDataChanged(const QModelIndex &index=QModelIndex())
emit dataChanged() for layer tree node items
 
bool legendEmbeddedInParent(QgsLayerTreeLayer *nodeLayer) const
 
QHash< QgsLayerTreeLayer *, LayerLegendData > mLegend
Per layer data about layer's legend nodes.
 
void disconnectFromLayer(QgsLayerTreeLayer *nodeLayer)
 
void setCurrentIndex(const QModelIndex ¤tIndex)
Sets index of the current item. May be used by view. Item marked as current is underlined.
 
QIcon legendIconEmbeddedInParent(QgsLayerTreeLayer *nodeLayer) const
 
void layerFlagsChanged()
Triggered when layer flags have changed.
 
void nodeNameChanged(QgsLayerTreeNode *node, const QString &name)
Updates model when node's name has changed.
 
QPersistentModelIndex mCurrentIndex
Current index - will be underlined.
 
LayerLegendTree * tryBuildLegendTree(const QList< QgsLayerTreeModelLegendNode * > &nodes)
 
Qt::DropActions supportedDropActions() const override
 
void disconnectFromRootNode()
 
QModelIndex legendNodeIndex(int row, int column, QgsLayerTreeModelLegendNode *node) const
 
QgsRenderContext * createTemporaryRenderContext() const
Returns a temporary render context.
 
void invalidateLegendMapBasedData()
 
void setFlags(QgsLayerTreeModel::Flags f)
Sets OR-ed combination of model flags.
 
QgsLayerTree * rootGroup() const
Returns pointer to the root node of the layer tree. Always a non nullptr value.
 
void nodeWillRemoveChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
 
QgsLayerTreeNode * index2node(const QModelIndex &index) const
Returns layer tree node for given index.
 
QgsLayerTree * mRootNode
Pointer to the root node of the layer tree. Not owned by the model.
 
QSet< QgsScreenProperties > targetScreenProperties() const
Returns the target screen properties to use when generating icons.
 
QStringList mimeTypes() const override
 
QMimeData * mimeData(const QModelIndexList &indexes) const override
 
QSet< QgsScreenProperties > mTargetScreenProperties
 
void nodeRemovedChildren()
 
int rowCount(const QModelIndex &parent=QModelIndex()) const override
 
QPointer< QgsMapHitTestTask > mHitTestTask
 
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
 
static int scaleIconSize(int standardSize)
Scales an layer tree model icon size to compensate for display pixel density, making the icon size hi...
 
void messageEmitted(const QString &message, Qgis::MessageLevel level=Qgis::MessageLevel::Info, int duration=5)
Emits a message than can be displayed to the user in a GUI class.
 
QgsLayerTreeModelLegendNode * legendNodeEmbeddedInParent(QgsLayerTreeLayer *nodeLayer) const
Returns legend node that may be embedded in parent (i.e.
 
QList< QgsLayerTreeNode * > indexes2nodes(const QModelIndexList &list, bool skipInternal=false) const
Convert a list of indexes to a list of layer tree nodes.
 
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
 
QList< QgsLayerTreeModelLegendNode * > filterLegendNodes(const QList< QgsLayerTreeModelLegendNode * > &nodes)
Filter nodes from QgsMapLayerLegend according to the current filtering rules.
 
const QgsLayerTreeFilterSettings * filterSettings() const
Returns the filter settings to use to filter legend nodes.
 
QList< QgsLayerTreeModelLegendNode * > layerOriginalLegendNodes(QgsLayerTreeLayer *nodeLayer)
Returns original (unfiltered) list of legend nodes attached to a particular layer node.
 
int mAutoCollapseLegendNodesCount
Minimal number of nodes when legend should be automatically collapsed. -1 = disabled.
 
QMap< QString, QString > layerStyleOverrides() const
Gets map of map layer style overrides (key: layer ID, value: style name) where a different style shou...
 
Qt::ItemFlags legendNodeFlags(QgsLayerTreeModelLegendNode *node) const
 
void setLayerStyleOverrides(const QMap< QString, QString > &overrides)
Sets map of map layer style overrides (key: layer ID, value: style name) where a different style shou...
 
void nodeVisibilityChanged(QgsLayerTreeNode *node)
 
void refreshScaleBasedLayers(const QModelIndex &index=QModelIndex(), double previousScale=0.0)
Updates layer data for scale dependent layers, should be called when map scale changes.
 
void removeLegendFromLayer(QgsLayerTreeLayer *nodeLayer)
 
QModelIndex legendRootIndex(int row, int column, QgsLayerTreeLayer *nL) const
 
static QgsLayerTreeModelLegendNode * index2legendNode(const QModelIndex &index)
Returns legend node for given index.
 
double mLegendMapViewMupp
 
void legendNodeDataChanged()
 
QMap< QString, QString > mLayerStyleOverrides
Overrides of map layers' styles: key = layer ID, value = style XML.
 
void nodeWillAddChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
 
const QgsMapSettings * legendFilterMapSettings() const
Returns the current map settings used for the current legend filter (or nullptr if none is enabled)
 
QFont layerTreeNodeFont(int nodeType) const
Gets font for a particular type of layer tree node. nodeType should come from QgsLayerTreeNode::NodeT...
 
void refreshLayerLegend(QgsLayerTreeLayer *nodeLayer)
Force a refresh of legend nodes of a layer node.
 
void waitForHitTestBlocking()
When a current hit test for visible legend items is in progress, calling this method will block until...
 
void addLegendToLayer(QgsLayerTreeLayer *nodeL)
 
bool testFlag(Flag f) const
Check whether a flag is enabled.
 
void disconnectFromLayers(QgsLayerTreeGroup *parentGroup)
 
void layerLegendChanged()
 
QModelIndex indexOfParentLayerTreeNode(QgsLayerTreeNode *parentNode) const
 
QSet< QgsLayerTreeLayer * > mInvalidatedNodes
Keep track of layer nodes for which the legend size needs to be recalculated.
 
@ ActionHierarchical
Check/uncheck action has consequences on children (or parents for leaf node)
 
@ AllowNodeChangeVisibility
Allow user to set node visibility with a checkbox.
 
@ ShowLegendAsTree
For legends that support it, will show them in a tree instead of a list (needs also ShowLegend)....
 
@ UseTextFormatting
Layer nodes will alter text appearance based on layer properties, such as scale based visibility.
 
@ AllowNodeReorder
Allow reordering with drag'n'drop.
 
@ ShowLegend
Add legend nodes for layer nodes.
 
@ DeferredLegendInvalidation
Defer legend model invalidation.
 
@ AllowNodeRename
Allow renaming of groups and layers.
 
@ AllowLegendChangeState
Allow check boxes for legend nodes (if supported by layer's legend)
 
@ UseEmbeddedWidgets
Layer nodes may optionally include extra embedded widgets (if used in QgsLayerTreeView)....
 
@ UseThreadedHitTest
Run legend hit tests in a background thread.
 
void addTargetScreenProperties(const QgsScreenProperties &properties)
Adds additional target screen properties to use when generating icons for Qt::DecorationRole data.
 
Flags mFlags
Sets of flags for the model.
 
Q_DECL_DEPRECATED void setLegendFilter(const QgsMapSettings *settings, bool useExtent=true, const QgsGeometry &polygon=QgsGeometry(), bool useExpressions=true)
Filter display of legend nodes for given map settings.
 
int legendRootRowCount(QgsLayerTreeLayer *nL) const
 
QgsLayerTreeModelLegendNode * findLegendNode(const QString &layerId, const QString &ruleKey) const
Searches through the layer tree to find a legend node with a matching layer ID and rule key.
 
Base class for nodes in a layer tree.
 
@ NodeGroup
Container of other groups and layers.
 
@ NodeLayer
Leaf node pointing to a layer.
 
void removedChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
Emitted when one or more nodes has been removed from a node within the tree.
 
void nameChanged(QgsLayerTreeNode *node, QString name)
Emitted when the name of the node is changed.
 
bool isVisible() const
Returns whether a node is really visible (ie checked and all its ancestors checked as well)
 
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.
 
virtual void writeXml(QDomElement &parentElement, const QgsReadWriteContext &context)=0
Write layer tree to XML.
 
static QgsLayerTreeNode * readXml(QDomElement &element, const QgsReadWriteContext &context)
Read layer tree from XML.
 
QList< QgsLayerTreeNode * > children()
Gets list of children of the node. Children are owned by the parent.
 
void willRemoveChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
Emitted when one or more nodes will be removed from a node within the tree.
 
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.
 
void setExpanded(bool expanded)
Sets whether the node should be shown as expanded or collapsed in GUI.
 
QgsLayerTreeNode * parent()
Gets pointer to the parent. If parent is nullptr, the node is a root node.
 
NodeType nodeType() const
Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree...
 
void customPropertyChanged(QgsLayerTreeNode *node, const QString &key)
Emitted when a custom property of a node within the tree has been changed or removed.
 
void addedChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
Emitted when one or more nodes have been added to a node within the tree.
 
void willAddChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
Emitted when one or more nodes will be added to a node within the tree.
 
void visibilityChanged(QgsLayerTreeNode *node)
Emitted when check state of a node within the tree has been changed.
 
virtual void setItemVisibilityCheckedRecursive(bool checked)
Check or uncheck a node and all its children (taking into account exclusion rules)
 
void setItemVisibilityChecked(bool checked)
Check or uncheck a node (independently of its ancestors or children)
 
bool itemVisibilityChecked() const
Returns whether a node is checked (independently of its ancestors or children)
 
void setItemVisibilityCheckedParentRecursive(bool checked)
Check or uncheck a node and all its parents.
 
Namespace with helper functions for layer tree operations.
 
static QgsLayerTreeLayer * toLayer(QgsLayerTreeNode *node)
Cast node to a layer.
 
static bool isLayer(const QgsLayerTreeNode *node)
Check whether the node is a valid layer node.
 
static bool isGroup(QgsLayerTreeNode *node)
Check whether the node is a valid group node.
 
static QgsLayerTreeGroup * toGroup(QgsLayerTreeNode *node)
Cast node to a group.
 
Executes a QgsMapHitTest in a background thread.
 
Base class for storage of map layer elevation properties.
 
void profileGenerationPropertyChanged()
Emitted when any of the elevation properties which relate solely to generation of elevation profiles ...
 
static void applyLayerNodeProperties(QgsLayerTreeLayer *nodeLayer, QList< QgsLayerTreeModelLegendNode * > &nodes)
update according to layer node's custom properties (order of items, user labels for items)
 
An abstract interface for implementations of legends for one map layer.
 
virtual QList< QgsLayerTreeModelLegendNode * > createLayerTreeModelLegendNodes(QgsLayerTreeLayer *nodeLayer)=0
Returns list of legend nodes to be used for a particular layer tree layer node.
 
Restore overridden layer style on destruction.
 
void setOverrideStyle(const QString &style)
Temporarily apply a different style to the layer.
 
Base class for all map layer types.
 
virtual bool isSpatial() const
Returns true if the layer is considered a spatial layer, ie it has some form of geometry associated w...
 
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
 
void legendChanged()
Signal emitted when legend of the layer has changed.
 
QgsMapLayerLegend * legend() const
Can be nullptr.
 
void editingStopped()
Emitted when edited changes have been successfully written to the data provider.
 
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
 
void editingStarted()
Emitted when editing on this layer has started.
 
QgsLayerMetadata metadata
 
virtual Qgis::MapLayerProperties properties() const
Returns the map layer properties of this layer.
 
virtual bool isEditable() const
Returns true if the layer can be edited.
 
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
 
virtual bool isModified() const
Returns true if the layer has been modified since last commit/save.
 
void flagsChanged()
Emitted when layer's flags have been modified.
 
virtual QgsMapLayerElevationProperties * elevationProperties()
Returns the layer's elevation properties.
 
void layerModified()
Emitted when modifications has been done on layer.
 
Contains configuration for rendering maps.
 
bool hasValidSettings() const
Check whether the map settings are valid and can be used for rendering.
 
Perform transforms between map coordinates and device coordinates.
 
static QByteArray layerTreeNodesToUriList(const QList< QgsLayerTreeNode * > &nodes)
Returns encoded URI list from a list of layer tree nodes.
 
static QgsProject * instance()
Returns the QgsProject singleton instance.
 
A container for the context for various read/write operations on objects.
 
Contains information about the context of a rendering operation.
 
Stores properties relating to a screen.
 
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
 
static const QgsSettingsEntryBool * settingsLayerTreeShowFeatureCountForNewLayers
Settings entry show feature counts for newly added layers by default.
 
Implementation of legend node interface for displaying preview of vector symbols and their labels and...
 
void setIconSize(QSize sz)
Set the icon size.
 
QSize minimumIconSize() const
Calculates the minimum icon size to prevent cropping.
 
QVariant data(int role) const override
Returns data associated with the item. Must be implemented in derived class.
 
long addTask(QgsTask *task, int priority=0)
Adds a task to the manager.
 
void taskCompleted()
Will be emitted by task to indicate its successful completion.
 
Represents a vector layer which manages a vector based dataset.
 
long long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
 
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
 
static Q_INVOKABLE QString displayString(Qgis::WkbType type)
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
 
#define Q_NOWARN_DEPRECATED_POP
 
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
 
#define Q_NOWARN_DEPRECATED_PUSH
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
#define QgsDebugMsgLevel(str, level)
 
Structure that stores all data associated with one map layer.
 
LayerLegendTree * tree
Optional pointer to a tree structure - see LayerLegendTree for details.
 
QList< QgsLayerTreeModelLegendNode * > originalNodes
Data structure for storage of legend nodes.
 
Structure that stores tree representation of map layer's legend.
 
QMap< QgsLayerTreeModelLegendNode *, QgsLayerTreeModelLegendNode * > parents
Pointer to parent for each active node. Top-level nodes have nullptr parent. Pointers are not owned.
 
QMap< QgsLayerTreeModelLegendNode *, QList< QgsLayerTreeModelLegendNode * > > children
List of children for each active node. Top-level nodes are under nullptr key. Pointers are not owned.