22 #include <QDomElement> 23 #include <QStringList> 94 QList<QgsLayerTreeNode *> nodes;
120 index =
mChildren.count() - nodes.count();
146 if ( childLayer->
layer() == layer )
209 if ( childLayer->
layerId() == layerId )
224 QList<QgsLayerTreeLayer *> list;
257 QList<QgsLayerTreeGroup *> list;
269 if ( element.tagName() != QLatin1String(
"layer-tree-group" ) )
273 bool isExpanded = ( element.attribute( QStringLiteral(
"expanded" ), QStringLiteral(
"1" ) ) == QLatin1String(
"1" ) );
275 bool isMutuallyExclusive = element.attribute( QStringLiteral(
"mutually-exclusive" ), QStringLiteral(
"0" ) ) == QLatin1String(
"1" );
276 int mutuallyExclusiveChildIndex = element.attribute( QStringLiteral(
"mutually-exclusive-child" ), QStringLiteral(
"-1" ) ).toInt();
300 QDomDocument doc = parentElement.ownerDocument();
301 QDomElement elem = doc.createElement( QStringLiteral(
"layer-tree-group" ) );
302 elem.setAttribute( QStringLiteral(
"name" ),
mName );
303 elem.setAttribute( QStringLiteral(
"expanded" ),
mExpanded ?
"1" :
"0" );
304 elem.setAttribute( QStringLiteral(
"checked" ),
mChecked ? QStringLiteral(
"Qt::Checked" ) : QStringLiteral(
"Qt::Unchecked" ) );
307 elem.setAttribute( QStringLiteral(
"mutually-exclusive" ), QStringLiteral(
"1" ) );
316 parentElement.appendChild( elem );
321 QList<QgsLayerTreeNode *> nodes;
322 QDomElement childElem = element.firstChildElement();
323 while ( !childElem.isNull() )
329 childElem = childElem.nextSiblingElement();
337 QString header = QStringLiteral(
"GROUP: %1 checked=%2 expanded=%3\n" ).arg(
name() ).arg(
mChecked ).arg(
mExpanded );
338 QStringList childrenDump;
340 childrenDump << node->
dump().split(
'\n' );
341 for (
int i = 0; i < childrenDump.count(); ++i )
342 childrenDump[i].prepend(
" " );
343 return header + childrenDump.join( QStringLiteral(
"\n" ) );
378 if ( mMutuallyExclusiveChildIndex < 0 || mMutuallyExclusiveChildIndex >=
mChildren.count() )
384 if ( _nodeIsChecked( child ) )
411 int childIndex =
mChildren.indexOf( node );
412 if ( childIndex == -1 )
417 if ( _nodeIsChecked( node ) )
void nodeVisibilityChanged(QgsLayerTreeNode *node)
Layer tree group node serves as a container for layers and further groups.
The class is used as a container of context for various read/write operations on other objects...
void readChildrenFromXml(QDomElement &element, const QgsReadWriteContext &context)
Read children from XML and append them to the group.
void removeChildren(int from, int count)
Remove child nodes from index "from".
void removeChildrenGroupWithoutLayers()
Remove all child group nodes without layers.
static QgsLayerTreeLayer * toLayer(QgsLayerTreeNode *node)
Cast node to a layer.
Base class for all map layer types.
QList< QgsLayerTreeGroup * > findGroups() const
Find all group layer nodes.
QgsLayerTreeGroup * addGroup(const QString &name)
Append a new group node with given name.
static bool isGroup(QgsLayerTreeNode *node)
Check whether the node is a valid group node.
void setIsMutuallyExclusive(bool enabled, int initialChildIndex=-1)
Set whether the group is mutually exclusive (only one child can be checked at a time).
virtual void writeXml(QDomElement &parentElement, const QgsReadWriteContext &context)=0
Write layer tree to XML.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
bool isMutuallyExclusive() const
Returns whether the group is mutually exclusive (only one child can be checked at a time) ...
void removeAllChildren()
Remove all child nodes.
bool mExpanded
whether the node should be shown in GUI as expanded
static QgsLayerTreeGroup * toGroup(QgsLayerTreeNode *node)
Cast node to a group.
bool itemVisibilityChecked() const
Returns whether a node is checked (independently of its ancestors or children)
virtual QString dump() const =0
Returns string with layer tree structure. For debug purposes only.
void writeXml(QDomElement &parentElement, const QgsReadWriteContext &context) override
Write group (tree) as XML element <layer-tree-group> and add it to the given parent element...
void removeChildNode(QgsLayerTreeNode *node)
Remove a child node from this group.
void setItemVisibilityCheckedRecursive(bool checked) override
Check or uncheck a node and all its children (taking into account exclusion rules) ...
static QgsLayerTreeNode * readXml(QDomElement &element, const QgsReadWriteContext &context)
Read layer tree from XML.
void resolveReferences(const QgsProject *project, bool looseMatching=false) override
Calls resolveReferences() on child tree nodes.
void removeLayer(QgsMapLayer *layer)
Remove map layer's node from this group.
QgsLayerTreeLayer * addLayer(QgsMapLayer *layer)
Append a new layer node for given map layer.
virtual void setItemVisibilityCheckedRecursive(bool checked)
Check or uncheck a node and all its children (taking into account exclusion rules) ...
QList< QgsLayerTreeNode * > children()
Gets list of children of the node. Children are owned by the parent.
const QgsProjectTranslator * projectTranslator() const
Returns the project translator.
QgsLayerTreeLayer * insertLayer(int index, QgsMapLayer *layer)
Insert a new layer node for given map layer at specified position.
void insertChildrenPrivate(int index, QList< QgsLayerTreeNode * > nodes)
Low-level insertion of children to the node. The children must not have any parent yet! ...
bool mChangingChildVisibility
QList< QgsLayerTreeLayer * > findLayers() const
Find all layer nodes.
void writeCommonXml(QDomElement &element)
Write common XML elements.
void setName(const QString &n) override
Sets the group's name.
static bool isLayer(const QgsLayerTreeNode *node)
Check whether the node is a valid layer node.
This class is a base class for nodes in a layer tree.
static Qt::CheckState checkStateFromXml(const QString &txt)
Convert QString to Qt::CheckState.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
static QgsLayerTreeGroup * readXml(QDomElement &element, const QgsReadWriteContext &context)
Read group (tree) from XML element <layer-tree-group> and return the newly created group (or null on ...
QString layerId() const
Returns the ID for the map layer associated with this node.
Reads and writes project states.
bool isExpanded() const
Returns whether the node should be shown as expanded or collapsed in GUI.
int mMutuallyExclusiveChildIndex
Keeps track which child has been most recently selected (so if the whole group is unchecked and check...
void insertChildNodes(int index, const QList< QgsLayerTreeNode * > &nodes)
Insert existing nodes at specified position.
void setExpanded(bool expanded)
Sets whether the node should be shown as expanded or collapsed in GUI.
virtual QString translate(const QString &context, const QString &sourceText, const char *disambiguation=nullptr, int n=-1) const =0
The derived translate() translates with QTranslator and qm file the sourceText.
void removeChildrenPrivate(int from, int count, bool destroy=true)
Low-level removal of children from the node.
void updateChildVisibilityMutuallyExclusive()
Set check state of children - if mutually exclusive.
QgsLayerTreeGroup(const QString &name=QString(), bool checked=true)
Constructor.
QString dump() const override
Returns text representation of the tree.
void insertChildNode(int index, QgsLayerTreeNode *node)
Insert existing node at specified position.
QgsLayerTreeGroup * clone() const override
Returns a clone of the group.
void visibilityChanged(QgsLayerTreeNode *node)
Emitted when check state of a node within the tree has been changed.
void readCommonXml(QDomElement &element)
Read common XML elements.
QStringList findLayerIds() const
Find layer IDs used in all layer nodes.
QgsLayerTreeGroup * findGroup(const QString &name)
Find group node with specified name.
bool mMutuallyExclusive
Whether the group is mutually exclusive (i.e. only one child can be checked at a time) ...
virtual void resolveReferences(const QgsProject *project, bool looseMatching=false)=0
Turn textual references to layers into map layer object from project.
void addChildNode(QgsLayerTreeNode *node)
Append an existing node.
void setItemVisibilityChecked(bool checked)
Check or uncheck a node (independently of its ancestors or children)
QString name() const override
Returns the group's name.
NodeType nodeType() const
Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree...
QList< QgsLayerTreeNode * > mChildren
list of children - node is responsible for their deletion
Container of other groups and layers.
void nameChanged(QgsLayerTreeNode *node, QString name)
Emitted when the name of the node is changed.
QgsLayerTreeLayer * findLayer(QgsMapLayer *layer) const
Find layer node representing the map layer.
QgsLayerTreeGroup * insertGroup(int index, const QString &name)
Insert a new group node with given name at specified position.
Layer tree node points to a map layer.