QGIS API Documentation
3.26.3-Buenos Aires (65e4edfdad)
|
Go to the documentation of this file.
17 #include <QTextStream>
44 : QAbstractItemModel( parent )
45 , mRootNode( rootNode )
46 , mFlags( ShowLegend | AllowLegendChangeState | DeferredLegendInvalidation )
47 , mAutoCollapseLegendNodesCount( -1 )
48 , mLegendFilterByScale( 0 )
49 , mLegendFilterUsesExtent( false )
50 , mLegendMapViewMupp( 0 )
51 , mLegendMapViewDpi( 0 )
52 , mLegendMapViewScale( 0 )
69 if ( !
index.isValid() )
72 QObject *obj =
reinterpret_cast<QObject *
>(
index.internalPointer() );
73 return qobject_cast<QgsLayerTreeNode *>( obj );
107 return QModelIndex();
114 return QModelIndex();
121 return createIndex( row, column,
static_cast<QObject *
>( n->
children().at( row ) ) );
127 if ( !child.isValid() )
128 return QModelIndex();
141 return QModelIndex();
149 Q_ASSERT( parentNode );
152 if ( !grandParentNode )
153 return QModelIndex();
155 int row = grandParentNode->
children().indexOf( parentNode );
156 Q_ASSERT( row >= 0 );
158 return createIndex( row, 0,
static_cast<QObject *
>( parentNode ) );
171 if ( role == Qt::DisplayRole || role == Qt::EditRole )
179 QString name = nodeLayer->
name();
180 if ( nodeLayer->
customProperty( QStringLiteral(
"showFeatureCount" ), 0 ).toInt() && role == Qt::DisplayRole )
184 name += QStringLiteral(
" [%1]" ).arg( vlayer->
featureCount() );
189 else if ( role == Qt::DecorationRole &&
index.column() == 0 )
216 QPainter painter( &pixmap );
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 )
283 !layer->
title().isEmpty() ? layer->title() :
284 !layer->shortName().isEmpty() ? layer->shortName() :
287 title =
"<b>" + title.toHtmlEscaped() +
"</b>";
289 if ( layer->isSpatial() && layer->crs().isValid() )
291 if (
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
294 title += tr(
" (%1)" ).arg( layer->crs().authid() ).toHtmlEscaped();
300 if ( !layer->abstract().isEmpty() )
303 const QStringList abstractLines = layer->abstract().split(
'\n' );
304 for (
const auto &l : abstractLines )
306 parts << l.toHtmlEscaped();
311 QString source( layer->publicSource() );
312 if ( source.size() > 1024 )
314 source = source.left( 1023 ) + QString( QChar( 0x2026 ) );
317 parts <<
"<i>" + source.toHtmlEscaped() +
"</i>";
319 return parts.join( QLatin1String(
"<br/>" ) );
330 if ( !
index.isValid() )
332 Qt::ItemFlags rootFlags = Qt::ItemFlags();
334 rootFlags |= Qt::ItemIsDropEnabled;
341 Qt::ItemFlags f = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
344 f |= Qt::ItemIsEditable;
347 bool isEmbedded = node->
customProperty( QStringLiteral(
"embedded" ) ).toInt();
352 if ( !isEmbedded || ( isEmbedded && node->
parent() && !node->
parent()->
customProperty( QStringLiteral(
"embedded" ) ).toInt() ) )
353 f |= Qt::ItemIsDragEnabled;
357 f |= Qt::ItemIsUserCheckable;
360 f |= Qt::ItemIsDropEnabled;
372 bool res = sym->
setData( value, role );
380 return QAbstractItemModel::setData(
index, value, role );
382 if ( role == Qt::CheckStateRole )
387 bool checked =
static_cast< Qt::CheckState
>( value.toInt() ) == Qt::Checked;
388 if ( checked && node->
children().isEmpty() )
408 else if ( role == Qt::EditRole )
416 layer->
setName( value.toString() );
426 return QAbstractItemModel::setData(
index, value, role );
431 if ( !node || !node->
parent() )
432 return QModelIndex();
437 Q_ASSERT( row >= 0 );
438 return index( row, 0, parentIndex );
447 if ( child->
parent() == node )
450 return _isChildOfNode( child->
parent(), node );
453 static bool _isChildOfNodes(
QgsLayerTreeNode *child,
const QList<QgsLayerTreeNode *> &nodes )
457 if ( _isChildOfNode( child, n ) )
467 QList<QgsLayerTreeNode *> nodes;
468 const auto constList = list;
469 for (
const QModelIndex &
index : constList )
482 QList<QgsLayerTreeNode *> nodesFinal;
485 if ( !_isChildOfNodes( node, nodes ) )
516 emit dataChanged( idx, idx );
520 if ( oldNodeCount > 0 )
522 beginRemoveRows( idx, 0, oldNodeCount - 1 );
609 if ( useExpressions )
616 if ( enabled && !expr.isEmpty() )
618 exprs[ nodeLayer->layerId()] = expr;
623 if ( useExpressions && !useExtent && !polygonValid )
668 if ( scale != previousScale )
696 beginInsertRows(
node2index( node ), indexFrom, indexTo );
699 static QList<QgsLayerTreeLayer *> _layerNodesInSubtree(
QgsLayerTreeNode *node,
int indexFrom,
int indexTo )
701 QList<QgsLayerTreeNode *> children = node->
children();
702 QList<QgsLayerTreeLayer *> newLayerNodes;
703 for (
int i = indexFrom; i <= indexTo; ++i )
711 return newLayerNodes;
720 const auto subNodes = _layerNodesInSubtree( node, indexFrom, indexTo );
729 beginRemoveRows(
node2index( node ), indexFrom, indexTo );
732 const auto subNodes = _layerNodesInSubtree( node, indexFrom, indexTo );
797 QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
813 QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
827 QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
838 if ( nodeLayer->
customProperty( QStringLiteral(
"showFeatureCount" ) ).toInt() )
850 if (
index.isValid() )
854 void QgsLayerTreeModel::legendNodeSizeChanged()
861 if (
index.isValid() )
862 emit dataChanged(
index,
index, QVector<int> { Qt::SizeHintRole } );
868 if ( !nodeLayer->
layer() )
915 const auto constChildren = group->
children();
933 disconnect( nodeLayer,
nullptr,
this,
nullptr );
935 if ( !nodeLayer->
layer() )
946 disconnect( nodeLayer->
layer(),
nullptr,
this,
nullptr );
952 const auto constChildren = parentGroup->
children();
964 const auto constChildren = parentGroup->
children();
991 disconnect(
mRootNode,
nullptr,
this,
nullptr );
1002 int count = node->
children().count();
1005 emit dataChanged(
index( 0, 0, idx ),
index( count - 1, 0, idx ) );
1006 for (
int i = 0; i < count; ++i )
1022 emit dataChanged( idx, idx, QVector<int>() << Qt::FontRole << Qt::ForegroundRole );
1025 int count = node->
children().count();
1026 for (
int i = 0; i < count; ++i )
1032 return Qt::CopyAction | Qt::MoveAction;
1038 types << QStringLiteral(
"application/qgis.layertreemodeldata" );
1046 QModelIndexList sortedIndexes = indexes;
1047 std::sort( sortedIndexes.begin(), sortedIndexes.end(), std::less<QModelIndex>() );
1049 QList<QgsLayerTreeNode *> nodesFinal =
indexes2nodes( sortedIndexes,
true );
1051 if ( nodesFinal.isEmpty() )
1054 QMimeData *
mimeData =
new QMimeData();
1056 QDomDocument layerTreeDoc;
1057 QDomElement rootLayerTreeElem = layerTreeDoc.createElement( QStringLiteral(
"layer_tree_model_data" ) );
1063 layerTreeDoc.appendChild( rootLayerTreeElem );
1065 QString errorMessage;
1067 QDomDocument layerDefinitionsDoc( QStringLiteral(
"qgis-layer-definition" ) );
1070 QString txt = layerDefinitionsDoc.toString();
1072 mimeData->setData( QStringLiteral(
"application/qgis.layertreemodeldata" ), layerTreeDoc.toString().toUtf8() );
1073 mimeData->setData( QStringLiteral(
"application/qgis.application.pid" ), QString::number( QCoreApplication::applicationPid() ).toUtf8() );
1074 mimeData->setData( QStringLiteral(
"application/qgis.layertree.source" ), QStringLiteral(
":0x%1" ).arg(
reinterpret_cast<quintptr
>(
this ), 2 * QT_POINTER_SIZE, 16, QLatin1Char(
'0' ) ).toUtf8() );
1075 mimeData->setData( QStringLiteral(
"application/qgis.layertree.layerdefinitions" ), txt.toUtf8() );
1083 if ( action == Qt::IgnoreAction )
1086 if ( !
data->hasFormat( QStringLiteral(
"application/qgis.layertreemodeldata" ) ) )
1093 const QString restrictTypes(
data->data( QStringLiteral(
"application/qgis.restrictlayertreemodelsubclass" ) ) );
1094 if ( !restrictTypes.isEmpty() && restrictTypes != QString( metaObject()->className() ) )
1101 if (
parent.isValid() && row == -1 )
1107 qint64 qgisPid =
data->data( QStringLiteral(
"application/qgis.application.pid" ) ).toInt( &ok );
1109 if ( ok && qgisPid != QCoreApplication::applicationPid() )
1111 QByteArray encodedLayerDefinitionData =
data->data( QStringLiteral(
"application/qgis.layertree.layerdefinitions" ) );
1112 QDomDocument layerDefinitionDoc;
1113 if ( !layerDefinitionDoc.setContent( QString::fromUtf8( encodedLayerDefinitionData ) ) )
1116 QString errorMessage;
1118 emit
messageEmitted( tr(
"New layers added from another QGIS instance" ) );
1122 QByteArray encodedLayerTreeData =
data->data( QStringLiteral(
"application/qgis.layertreemodeldata" ) );
1124 QDomDocument layerTreeDoc;
1125 if ( !layerTreeDoc.setContent( QString::fromUtf8( encodedLayerTreeData ) ) )
1128 QDomElement rootLayerTreeElem = layerTreeDoc.documentElement();
1129 if ( rootLayerTreeElem.tagName() != QLatin1String(
"layer_tree_model_data" ) )
1132 QList<QgsLayerTreeNode *> nodes;
1134 QDomElement elem = rootLayerTreeElem.firstChildElement();
1135 while ( !elem.isNull() )
1141 elem = elem.nextSiblingElement();
1144 if ( nodes.isEmpty() )
1183 return mFlags.testFlag( f );
1193 QList<QgsLayerTreeModelLegendNode *> filtered;
1227 if (
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( node->layerNode()->layer() ) )
1260 const auto constMLegend =
mLegend;
1263 qDeleteAll(
data.originalNodes );
1272 if (
mLegend.contains( nodeLayer ) )
1274 qDeleteAll(
mLegend[nodeLayer].originalNodes );
1275 delete mLegend[nodeLayer].tree;
1283 if ( !nodeL || !nodeL->
layer() )
1303 int widgetsCount = ml->
customProperty( QStringLiteral(
"embeddedWidgets/count" ), 0 ).toInt();
1304 while ( widgetsCount > 0 )
1306 lstNew.insert( 0,
new EmbeddedWidgetLegendNode( nodeL ) );
1311 QList<QgsLayerTreeModelLegendNode *> filteredLstNew =
filterLegendNodes( lstNew );
1313 const auto constLstNew = lstNew;
1316 n->setParent(
this );
1325 const auto constFilteredLstNew = filteredLstNew;
1342 int count = legendTree ? legendTree->
children[
nullptr].count() : filteredLstNew.count();
1344 if ( !filteredLstNew.isEmpty() )
1347 const QModelIndex nodeIndex {
node2index( nodeL ) };
1354 beginInsertRows(
node2index( nodeL ), 0, count - 1 );
1358 data.originalNodes = lstNew;
1359 data.activeNodes = filteredLstNew;
1360 data.embeddedNodeInParent = embeddedNode;
1361 data.tree = legendTree;
1365 if ( !filteredLstNew.isEmpty() )
1380 bool hasParentKeys =
false;
1385 hasParentKeys =
true;
1389 if ( !hasParentKeys )
1393 QHash<QString, QgsLayerTreeModelLegendNode *> rule2node;
1394 rule2node[QString()] =
nullptr;
1398 if ( ruleKey.isEmpty() )
1400 if ( rule2node.contains( ruleKey ) )
1402 rule2node[ruleKey] = n;
1427 context->setScaleFactor( dpi / 25.4 );
1428 context->setRendererScale( scale );
1431 return validData ? context.release() :
nullptr;
1437 return qobject_cast<QgsLayerTreeModelLegendNode *>(
reinterpret_cast<QObject *
>(
index.internalPointer() ) );
1449 int row =
data.tree->children[parentLegendNode].indexOf(
legendNode );
1450 return index( row, 0, parentIndex );
1456 return index( row, 0, parentIndex );
1461 Q_ASSERT( parentIndex.isValid() );
1464 return QModelIndex();
1466 return index( row, 0, parentIndex );
1474 return data.tree->children[node].count();
1482 if ( !
mLegend.contains( nL ) )
1487 return data.tree->children[
nullptr].count();
1489 int count =
data.activeNodes.count();
1496 Q_ASSERT(
mLegend.contains( nL ) );
1499 return createIndex( row, column,
static_cast<QObject *
>(
data.tree->children[
nullptr].at( row ) ) );
1501 return createIndex( row, column,
static_cast<QObject *
>(
data.activeNodes.at( row ) ) );
1509 return createIndex( row, column,
static_cast<QObject *
>(
data.tree->children[node].at( row ) ) );
1511 return QModelIndex();
1524 int row =
data.tree->children[grandParentNode].indexOf( parentNode );
1525 return createIndex( row, 0,
static_cast<QObject *
>( parentNode ) );
1539 return node->
data( role );
1545 Qt::ItemFlags f = node->
flags();
1547 f &= ~Qt::ItemIsUserCheckable;
1554 return static_cast< bool >(
mLegend[nodeLayer].embeddedNodeInParent );
1559 return mLegend[nodeLayer].embeddedNodeInParent;
1568 return QIcon( qvariant_cast<QPixmap>(
legendNode->
data( Qt::DecorationRole ) ) );
1574 if ( !
mLegend.contains( nodeLayer ) )
1575 return QList<QgsLayerTreeModelLegendNode *>();
1578 QList<QgsLayerTreeModelLegendNode *> lst(
data.activeNodes );
1579 if ( !skipNodeEmbeddedInParent &&
data.embeddedNodeInParent )
1580 lst.prepend(
data.embeddedNodeInParent );
1586 return mLegend.value( nodeLayer ).originalNodes;
1591 for (
auto it =
mLegend.constBegin(); it !=
mLegend.constEnd(); ++it )
1594 if ( layer->
layerId() == layerId )
1596 const auto activeNodes =
mLegend.value( layer ).activeNodes;
1635 QList<QgsSymbolLegendNode *> symbolNodes;
1636 QMap<QString, int> widthMax;
1644 widthMax[parentKey] = std::max( sz.width(), widthMax.contains( parentKey ) ? widthMax[parentKey] : 0 );
1646 symbolNodes.append( n );
1652 Q_ASSERT( widthMax[parentKey] > 0 );
1653 const int twiceMarginWidth = 2;
1654 n->setIconSize( QSize( widthMax[parentKey] + twiceMarginWidth, n->iconSize().rheight() + twiceMarginWidth ) );
@ NodeGroup
Container of other groups and layers.
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 flagsChanged()
Emitted when layer's flags have been modified.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
QgsLayerTreeLayer * findLayer(QgsMapLayer *layer) const
Find layer node representing the map layer.
QList< QgsLayerTreeLayer * > findLayers() const
Find all layer nodes.
void nodeWillRemoveChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
static void applyLayerNodeProperties(QgsLayerTreeLayer *nodeLayer, QList< QgsLayerTreeModelLegendNode * > &nodes)
update according to layer node's custom properties (order of items, user labels for items)
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
QgsLayerTree * mRootNode
Pointer to the root node of the layer tree. Not owned by the model.
void disconnectFromRootNode()
This class is a base class for nodes in a layer tree.
QModelIndex currentIndex() const
Gets index of the item marked as current. Item marked as current is underlined.
virtual bool isEmbeddedInParent() const
Qt::ItemFlags legendNodeFlags(QgsLayerTreeModelLegendNode *node) const
static QString displayString(Type type) SIP_HOLDGIL
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
void nodeLayerWillBeUnloaded()
void addLegendToLayer(QgsLayerTreeLayer *nodeL)
LayerLegendTree * tryBuildLegendTree(const QList< QgsLayerTreeModelLegendNode * > &nodes)
QModelIndex indexOfParentLayerTreeNode(QgsLayerTreeNode *parentNode) const
void editingStopped()
Emitted when edited changes have been successfully written to the data provider.
void removeChildren(int from, int count)
Remove child nodes from index "from".
QMap< QgsLayerTreeModelLegendNode *, QList< QgsLayerTreeModelLegendNode * > > children
List of children for each active node. Top-level nodes are under nullptr key. Pointers are not owned.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
void setItemVisibilityChecked(bool checked)
Check or uncheck a node (independently of its ancestors or children)
void removedChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
Emitted when one or more nodes has been removed from a node within the tree.
The class is used as a container of context for various read/write operations on other objects.
virtual void invalidateMapBasedData()
Notification from model that information from associated map view has changed.
virtual QVariant data(int role) const =0
Returns data associated with the item. Must be implemented in derived class.
@ VectorLayer
Vector layer.
QList< QgsLayerTreeModelLegendNode * > filterLegendNodes(const QList< QgsLayerTreeModelLegendNode * > &nodes)
Filter nodes from QgsMapLayerLegend according to the current filtering rules.
void layerLoaded()
Emitted when a previously unavailable layer got loaded.
#define QgsDebugMsgLevel(str, level)
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.
QString layerId() const
Returns the ID for the map layer associated with this node.
void recursivelyEmitDataChanged(const QModelIndex &index=QModelIndex())
emit dataChanged() for layer tree node items
double mLegendMapViewMupp
static QByteArray layerTreeNodesToUriList(const QList< QgsLayerTreeNode * > &nodes)
Returns encoded URI list from a list of layer tree nodes.
@ NodeLayer
Leaf node pointing to a layer.
long long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
static QIcon iconForLayer(const QgsMapLayer *layer)
Returns the icon corresponding to a specified map layer.
virtual Qgis::MapLayerProperties properties() const
Returns the map layer properties of this layer.
QFont layerTreeNodeFont(int nodeType) const
Gets font for a particular type of layer tree node. nodeType should come from QgsLayerTreeNode::NodeT...
@ AllowLegendChangeState
Allow check boxes for legend nodes (if supported by layer's legend)
QHash< QgsLayerTreeLayer *, LayerLegendData > mLegend
Per layer data about layer's legend nodes.
QMimeData * mimeData(const QModelIndexList &indexes) const override
bool legendEmbeddedInParent(QgsLayerTreeLayer *nodeLayer) const
QModelIndex parent(const QModelIndex &child) const override
bool hasValidSettings() const
Check whether the map settings are valid and can be used for rendering.
void nodeWillAddChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
The QgsMapLayerLegend class is abstract interface for implementations of legends for one map layer.
@ SimpleLegend
Simple label with icon legend node type.
Flags mFlags
Sets of flags for the model.
std::unique_ptr< QgsMapHitTest > mLegendFilterHitTest
Contains information about the context of a rendering operation.
QMap< QString, QString > LayerFilterExpression
Maps an expression string to a layer id.
void removeLegendFromLayer(QgsLayerTreeLayer *nodeLayer)
static QgsProject * instance()
Returns the QgsProject singleton instance.
void setFlags(QgsLayerTreeModel::Flags f)
Sets OR-ed combination of model flags.
bool testFlag(Flag f) const
Check whether a flag is enabled.
std::unique_ptr< QgsMapSettings > mLegendFilterMapSettings
bool mLegendFilterUsesExtent
whether to use map filtering
void customPropertyChanged(QgsLayerTreeNode *node, const QString &key)
Emitted when a custom property of a node within the tree has been changed or removed.
virtual QList< QgsLayerTreeModelLegendNode * > createLayerTreeModelLegendNodes(QgsLayerTreeLayer *nodeLayer)=0
Returns list of legend nodes to be used for a particular layer tree layer node.
static QgsLayerTreeLayer * toLayer(QgsLayerTreeNode *node)
Cast node to a layer.
void nameChanged(QgsLayerTreeNode *node, QString name)
Emitted when the name of the node is changed.
QString name() const override
Returns the layer's name.
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.
void editingStarted()
Emitted when editing on this layer has started.
void nodeCustomPropertyChanged(QgsLayerTreeNode *node, const QString &key)
@ ShowLegendAsTree
For legends that support it, will show them in a tree instead of a list (needs also ShowLegend)....
QVariant legendNodeData(QgsLayerTreeModelLegendNode *node, int role) const
QgsMapLayerLegend * legend() const
Can be nullptr.
void layerLegendChanged()
void disconnectFromLayer(QgsLayerTreeLayer *nodeLayer)
Restore overridden layer style on destruction.
void setItemVisibilityCheckedParentRecursive(bool checked)
Check or uncheck a node and all its parents.
@ ActionHierarchical
Check/uncheck action has consequences on children (or parents for leaf node)
static QgsLayerTreeGroup * toGroup(QgsLayerTreeNode *node)
Cast node to a group.
@ AllowNodeRename
Allow renaming of groups and layers.
void disconnectFromLayers(QgsLayerTreeGroup *parentGroup)
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.
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.
NodeType nodeType() const
Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree...
void sizeChanged()
Emitted when the size of this node changes.
virtual Qt::ItemFlags flags() const
Returns item flags associated with the item. Default implementation returns Qt::ItemIsEnabled.
static int scaleIconSize(int standardSize)
Scales an layer tree model icon size to compensate for display pixel density, making the icon size hi...
void legendNodeDataChanged()
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
QgsRenderContext * createTemporaryRenderContext() const
Returns a temporary render context.
Class that runs a hit test with given map settings. Based on the hit test it returns which symbols wi...
QModelIndex legendNode2index(QgsLayerTreeModelLegendNode *legendNode)
Returns index for a given legend node.
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...
static const QgsSettingsEntryBool settingsLayerTreeShowFeatureCountForNewLayers
Settings entry show feature counts for newly added layers by default.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
static QgsLayerTreeModelLegendNode * index2legendNode(const QModelIndex &index)
Returns legend node for given index.
virtual bool isModified() const
Returns true if the layer has been modified since last commit/save.
@ EmbeddedWidget
Embedded widget placeholder node type.
Namespace with helper functions for layer tree operations.
~QgsLayerTreeModel() override
void setLayerTreeNodeFont(int nodeType, const QFont &font)
Sets font for a particular type of layer tree node. nodeType should come from QgsLayerTreeNode::NodeT...
void nodeAddedChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
QMap< QString, QString > layerStyleOverrides() const
Gets map of map layer style overrides (key: layer ID, value: style name) where a different style shou...
@ NodeTypeRole
Type of node. Added in 3.16.
QPersistentModelIndex mCurrentIndex
Current index - will be underlined.
void connectToLayers(QgsLayerTreeGroup *parentGroup)
QModelIndex legendParent(QgsLayerTreeModelLegendNode *legendNode) const
@ ImageLegend
Raster image legend node type.
void setName(const QString &n) override
Sets the layer's name.
@ DeferredLegendInvalidation
Defer legend model invalidation.
void setLegendFilterByScale(double scale)
Force only display of legend nodes which are valid for a given scale.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QTimer mDeferLegendInvalidationTimer
void refreshLayerLegend(QgsLayerTreeLayer *nodeLayer)
Force a refresh of legend nodes of a layer node.
@ DataDefinedSizeLegend
Marker symbol legend node type.
@ ColorRampLegend
Color ramp legend (since QGIS 3.18)
QModelIndex legendNodeIndex(int row, int column, QgsLayerTreeModelLegendNode *node) const
Layer tree node points to a map layer.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
virtual void writeXml(QDomElement &parentElement, const QgsReadWriteContext &context)=0
Write layer tree to XML.
void setIconSize(QSize sz)
Set the icon size.
Structure that stores all data associated with one map layer.
double mLegendFilterByScale
scale denominator for filtering of legend nodes (<= 0 means no filtering)
Layer tree group node serves as a container for layers and further groups.
void setLegendFilterByMap(const QgsMapSettings *settings)
Force only display of legend nodes which are valid for given map settings.
Structure that stores tree representation of map layer's legend.
void setName(const QString &n) override
Sets the group's name.
void insertChildNodes(int index, const QList< QgsLayerTreeNode * > &nodes)
Insert existing nodes at specified position.
virtual bool isEditable() const
Returns true if the layer can be edited.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
void setAutoCollapseLegendNodes(int nodeCount)
Sets at what number of legend nodes the layer node should be collapsed. Setting -1 disables the auto-...
QMap< QgsLayerTreeModelLegendNode *, QgsLayerTreeModelLegendNode * > parents
Pointer to parent for each active node. Top-level nodes have nullptr parent. Pointers are not owned.
NodeTypes
Types of legend nodes.
@ ParentRuleKeyRole
Rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2....
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 layerModified()
Emitted when modifications has been done on layer.
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
Qt::DropActions supportedDropActions() const override
void setRootGroup(QgsLayerTree *newRootGroup)
Reset the model and use a new root group node.
QIcon legendIconEmbeddedInParent(QgsLayerTreeLayer *nodeLayer) const
@ RasterSymbolLegend
Raster symbol legend node type.
static QgsLayerTreeNode * readXml(QDomElement &element, const QgsReadWriteContext &context)
Read layer tree from XML.
int autoCollapseLegendNodes() const
Returns at what number of legend nodes the layer node should be collapsed. -1 means no auto-collapse ...
QgsLayerTree * rootGroup() const
Returns pointer to the root node of the layer tree. Always a non nullptr value.
QgsLayerTreeModelLegendNode * legendNode(const QString &rule, QgsLayerTreeModel &model)
void legendChanged()
Signal emitted when legend of the layer has changed.
void layerWillBeUnloaded()
Emitted when a previously available layer got unloaded (from layer registry).
QgsLayerTreeNode * index2node(const QModelIndex &index) const
Returns layer tree node for given index.
void legendMapViewData(double *mapUnitsPerPixel, int *dpi, double *scale) const
Gets hints about map view - to be used in legend nodes.
void willAddChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
Emitted when one or more nodes will be added to a node within the tree.
virtual void setItemVisibilityCheckedRecursive(bool checked)
Check or uncheck a node and all its children (taking into account exclusion rules)
virtual bool setData(const QVariant &value, int role)
Sets some data associated with the item. Default implementation does nothing and returns false.
static bool loadLayerDefinition(const QString &path, QgsProject *project, QgsLayerTreeGroup *rootGroup, QString &errorMessage)
Loads the QLR at path into QGIS. New layers are added to given project into layer tree specified by r...
int legendNodeRowCount(QgsLayerTreeModelLegendNode *node) const
static bool isLayer(const QgsLayerTreeNode *node)
Check whether the node is a valid layer node.
QgsLayerTreeLayer * layerNode() const
Returns pointer to the parent layer node.
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
QStringList mimeTypes() const override
double mLegendMapViewScale
A geometry is the spatial representation of a feature.
void setFlag(Flag f, bool on=true)
Enable or disable a model flag.
Perform transforms between map coordinates and device coordinates.
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 layerFlagsChanged()
Emitted when layer flags have changed.
Represents a vector layer which manages a vector based data sets.
QModelIndex legendRootIndex(int row, int column, QgsLayerTreeLayer *nL) const
bool itemVisibilityChecked() const
Returns whether a node is checked (independently of its ancestors or children)
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.
Flags flags() const
Returns OR-ed combination of model flags.
Base class for all map layer types. This is the base class for all map layer types (vector,...
static bool exportLayerDefinition(const QString &path, const QList< QgsLayerTreeNode * > &selectedTreeNodes, QString &errorMessage)
Exports the selected layer tree nodes to a QLR file.
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,...
QMap< QString, QString > mLayerStyleOverrides
Overrides of map layers' styles: key = layer ID, value = style XML.
@ UseTextFormatting
Layer nodes will alter text appearance based on layer properties, such as scale based visibility.
QList< QgsLayerTreeNode * > children()
Gets list of children of the node. Children are owned by the parent.
void setLegendFilter(const QgsMapSettings *settings, bool useExtent=true, const QgsGeometry &polygon=QgsGeometry(), bool useExpressions=true)
Filter display of legend nodes for given map settings.
QVariant data(int role) const override
Returns data associated with the item. Must be implemented in derived class.
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...
QString name() const override
Returns the group's name.
void addedChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
Emitted when one or more nodes have been added to a node within the tree.
int mAutoCollapseLegendNodesCount
Minimal number of nodes when legend should be automatically collapsed. -1 = disabled.
void setOverrideStyle(const QString &style)
Temporarily apply a different style to the layer.
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
QgsLayerTreeNode * parent()
Gets pointer to the parent. If parent is nullptr, the node is a root node.
@ AllowNodeChangeVisibility
Allow user to set node visibility with a checkbox.
void nodeRemovedChildren()
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
void invalidateLegendMapBasedData()
void willRemoveChildren(QgsLayerTreeNode *node, int indexFrom, int indexTo)
Emitted when one or more nodes will be removed from a node within the tree.
@ AllowNodeReorder
Allow reordering with drag'n'drop.
@ UsersCannotToggleEditing
Indicates that users are not allowed to toggle editing for this layer. Note that this does not imply ...
QSize minimumIconSize() const
Calculates the minimum icon size to prevent cropping.
virtual bool isSpatial() const
Returns true if the layer is considered a spatial layer, ie it has some form of geometry associated w...
void nodeVisibilityChanged(QgsLayerTreeNode *node)
bool isVisible() const
Returns whether a node is really visible (ie checked and all its ancestors checked as well)
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...
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
@ ShowLegend
Add legend nodes for layer nodes.
The QgsMapSettings class contains configuration for rendering of the map. The rendering itself is don...
void nodeNameChanged(QgsLayerTreeNode *node, const QString &name)
Updates model when node's name has changed.
static QString legendFilterByExpression(const QgsLayerTreeLayer &layer, bool *enabled=nullptr)
Returns the expression filter of a legend layer.
Implementation of legend node interface for displaying preview of vector symbols and their labels and...
QgsLayerTreeModel(QgsLayerTree *rootNode, QObject *parent=nullptr)
Construct a new tree model with given layer tree (root node must not be nullptr).
@ RuleKeyRole
Rule key of the node (QString)
void setExpanded(bool expanded)
Sets whether the node should be shown as expanded or collapsed in GUI.
int legendRootRowCount(QgsLayerTreeLayer *nL) const
QgsWkbTypes::GeometryType type
static bool isGroup(QgsLayerTreeNode *node)
Check whether the node is a valid group node.
void legendInvalidateMapBasedData()
void connectToLayer(QgsLayerTreeLayer *nodeLayer)
void dataChanged()
Emitted on internal data change so the layer tree model can forward the signal to views.
@ UseEmbeddedWidgets
Layer nodes may optionally include extra embedded widgets (if used in QgsLayerTreeView)....
QSet< QgsLayerTreeLayer * > mInvalidatedNodes
Keep track of layer nodes for which the legend size needs to be recalculated.
void setCurrentIndex(const QModelIndex ¤tIndex)
Sets index of the current item. May be used by view. Item marked as current is underlined.
@ SymbolLegend
Vector symbol legend node type.
QList< QgsLayerTreeNode * > indexes2nodes(const QModelIndexList &list, bool skipInternal=false) const
Convert a list of indexes to a list of layer tree nodes.
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
void visibilityChanged(QgsLayerTreeNode *node)
Emitted when check state of a node within the tree has been changed.
@ WmsLegend
WMS legend node type.
QList< QgsLayerTreeModelLegendNode * > layerOriginalLegendNodes(QgsLayerTreeLayer *nodeLayer)
Returns original (unfiltered) list of legend nodes attached to a particular layer node.
The QgsLegendRendererItem class is abstract interface for legend items returned from QgsMapLayerLegen...