Skip to content

Commit bc49cd4

Browse files
committed
Forward the visibilityChanged() signal towards the parent node.
Listening to the signal is simpler as it is enough to listen to the parent without having to connect to the whole tree and also follow the changes withing the tree
1 parent 1a61c15 commit bc49cd4

9 files changed

+57
-63
lines changed

src/core/layertree/qgslayertreegroup.cpp

+9-16
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ QgsLayerTreeGroup::QgsLayerTreeGroup(const QString& name, Qt::CheckState checked
99
, mChecked(checked)
1010
, mChangingChildVisibility(false)
1111
{
12+
connect(this, SIGNAL(visibilityChanged(QgsLayerTreeNode*,Qt::CheckState)), this, SLOT(nodeVisibilityChanged(QgsLayerTreeNode*)));
1213
}
1314

1415
QgsLayerTreeGroup::QgsLayerTreeGroup(const QgsLayerTreeGroup& other)
@@ -17,6 +18,7 @@ QgsLayerTreeGroup::QgsLayerTreeGroup(const QgsLayerTreeGroup& other)
1718
, mChecked(other.mChecked)
1819
, mChangingChildVisibility(false)
1920
{
21+
connect(this, SIGNAL(visibilityChanged(QgsLayerTreeNode*,Qt::CheckState)), this, SLOT(nodeVisibilityChanged(QgsLayerTreeNode*)));
2022
}
2123

2224

@@ -41,18 +43,6 @@ QgsLayerTreeLayer* QgsLayerTreeGroup::addLayer(QgsMapLayer* layer)
4143
return ll;
4244
}
4345

44-
void QgsLayerTreeGroup::connectToChildNode(QgsLayerTreeNode* node)
45-
{
46-
if (QgsLayerTree::isLayer(node))
47-
{
48-
// TODO: this could be handled directly by LayerTreeLayer by listening to QgsMapLayerRegistry...
49-
//QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer(node);
50-
//connect(nodeLayer->layer(), SIGNAL(destroyed()), this, SLOT(layerDestroyed()));
51-
}
52-
53-
connect(node, SIGNAL(visibilityChanged(Qt::CheckState)), this, SLOT(updateVisibilityFromChildren()));
54-
}
55-
5646
void QgsLayerTreeGroup::insertChildNode(int index, QgsLayerTreeNode* node)
5747
{
5848
QList<QgsLayerTreeNode*> nodes;
@@ -65,9 +55,6 @@ void QgsLayerTreeGroup::insertChildNodes(int index, QList<QgsLayerTreeNode*> nod
6555
// low-level insert
6656
insertChildren(index, nodes);
6757

68-
foreach (QgsLayerTreeNode* node, nodes)
69-
connectToChildNode(node);
70-
7158
updateVisibilityFromChildren();
7259
}
7360

@@ -234,7 +221,7 @@ void QgsLayerTreeGroup::setVisible(Qt::CheckState state)
234221
return;
235222

236223
mChecked = state;
237-
emit visibilityChanged(state);
224+
emit visibilityChanged(this, state);
238225

239226
if (mChecked == Qt::Unchecked || mChecked == Qt::Checked)
240227
{
@@ -273,6 +260,12 @@ void QgsLayerTreeGroup::layerDestroyed()
273260
removeLayer(layer);
274261
}
275262

263+
void QgsLayerTreeGroup::nodeVisibilityChanged(QgsLayerTreeNode* node)
264+
{
265+
if (mChildren.indexOf(node) != -1)
266+
updateVisibilityFromChildren();
267+
}
268+
276269
void QgsLayerTreeGroup::updateVisibilityFromChildren()
277270
{
278271
if (mChangingChildVisibility)

src/core/layertree/qgslayertreegroup.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ class QgsLayerTreeGroup : public QgsLayerTreeNode
5151

5252
protected slots:
5353
void layerDestroyed();
54-
void updateVisibilityFromChildren();
54+
void nodeVisibilityChanged(QgsLayerTreeNode* node);
5555

5656
protected:
57-
void connectToChildNode(QgsLayerTreeNode* node);
57+
void updateVisibilityFromChildren();
5858

5959
protected:
6060
QString mName;

src/core/layertree/qgslayertreelayer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void QgsLayerTreeLayer::setVisible(Qt::CheckState state)
5454
return;
5555

5656
mVisible = state;
57-
emit visibilityChanged(state);
57+
emit visibilityChanged(this, state);
5858
}
5959

6060
QgsLayerTreeLayer* QgsLayerTreeLayer::readXML(QDomElement& element)

src/core/layertree/qgslayertreenode.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ void QgsLayerTreeNode::insertChildren(int index, QList<QgsLayerTreeNode*> nodes)
103103
connect(nodes[i], SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)));
104104
connect(nodes[i], SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)));
105105
connect(nodes[i], SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)), this, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)));
106+
connect(nodes[i], SIGNAL(visibilityChanged(QgsLayerTreeNode*,Qt::CheckState)), this, SIGNAL(visibilityChanged(QgsLayerTreeNode*,Qt::CheckState)));
106107
}
107108
emit addedChildren(this, index, indexTo);
108109
}

src/core/layertree/qgslayertreenode.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class CORE_EXPORT QgsLayerTreeNode : public QObject
5555
void willRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
5656
void removedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
5757

58-
void visibilityChanged(Qt::CheckState state);
58+
void visibilityChanged(QgsLayerTreeNode* node, Qt::CheckState state);
5959

6060
void customPropertyChanged(QgsLayerTreeNode* node, QString key);
6161

src/gui/layertree/qgslayertreemapcanvasbridge.cpp

+23-18
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ QgsLayerTreeMapCanvasBridge::QgsLayerTreeMapCanvasBridge(QgsLayerTreeGroup *root
1010
, mPendingCanvasUpdate(false)
1111
, mHasCustomLayerOrder(false)
1212
{
13-
connectToNode(root);
1413
connect(root, SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeAddedChildren(QgsLayerTreeNode*,int,int)));
1514
connect(root, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)), this, SLOT(nodeCustomPropertyChanged(QgsLayerTreeNode*,QString)));
1615
connect(root, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeRemovedChildren()));
16+
connect(root, SIGNAL(visibilityChanged(QgsLayerTreeNode*,Qt::CheckState)), this, SLOT(nodeVisibilityChanged()));
1717

1818
setCanvasLayers();
1919
}
@@ -69,21 +69,6 @@ void QgsLayerTreeMapCanvasBridge::setCustomLayerOrder(const QStringList& order)
6969
deferredSetCanvasLayers();
7070
}
7171

72-
void QgsLayerTreeMapCanvasBridge::connectToNode(QgsLayerTreeNode *node)
73-
{
74-
connect(node, SIGNAL(visibilityChanged(Qt::CheckState)), this, SLOT(nodeVisibilityChanged()));
75-
76-
if (QgsLayerTree::isLayer(node))
77-
{
78-
QString layerId = QgsLayerTree::toLayer(node)->layerId();
79-
if (!mCustomLayerOrder.contains(layerId))
80-
mCustomLayerOrder.append(layerId);
81-
}
82-
83-
foreach (QgsLayerTreeNode* child, node->children())
84-
connectToNode(child);
85-
}
86-
8772
void QgsLayerTreeMapCanvasBridge::setCanvasLayers()
8873
{
8974
QList<QgsMapCanvasLayer> layers;
@@ -128,10 +113,30 @@ void QgsLayerTreeMapCanvasBridge::deferredSetCanvasLayers()
128113

129114
void QgsLayerTreeMapCanvasBridge::nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
130115
{
131-
// connect to new children
132116
Q_ASSERT(node);
117+
118+
// collect layer IDs that have been added in order to put them into custom layer order
119+
QStringList layerIds;
120+
QList<QgsLayerTreeNode*> children = node->children();
133121
for (int i = indexFrom; i <= indexTo; ++i)
134-
connectToNode(node->children()[i]);
122+
{
123+
QgsLayerTreeNode* child = children.at(i);
124+
if (QgsLayerTree::isLayer(child))
125+
{
126+
layerIds << QgsLayerTree::toLayer(child)->layerId();
127+
}
128+
else if (QgsLayerTree::isGroup(child))
129+
{
130+
foreach (QgsLayerTreeLayer* nodeL, QgsLayerTree::toGroup(child)->findLayers())
131+
layerIds << nodeL->layerId();
132+
}
133+
}
134+
135+
foreach (QString layerId, layerIds)
136+
{
137+
if (!mCustomLayerOrder.contains(layerId))
138+
mCustomLayerOrder.append(layerId);
139+
}
135140

136141
emit customLayerOrderChanged(mCustomLayerOrder);
137142

src/gui/layertree/qgslayertreemapcanvasbridge.h

-3
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ public slots:
2929
void customLayerOrderChanged(const QStringList& order);
3030

3131
protected:
32-
void connectToNode(QgsLayerTreeNode* node);
33-
34-
// TODO: disconnectFromNode
3532

3633
void defaultLayerOrder(QgsLayerTreeNode* node, QStringList& order) const;
3734

src/gui/layertree/qgslayertreemodel.cpp

+19-20
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@ QgsLayerTreeModel::QgsLayerTreeModel(QgsLayerTreeGroup* rootNode, QObject *paren
2020
{
2121
Q_ASSERT(mRootNode);
2222

23-
// connect to all existing nodes
24-
connectToNode(mRootNode);
25-
2623
connect(mRootNode, SIGNAL(willAddChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeWillAddChildren(QgsLayerTreeNode*,int,int)));
2724
connect(mRootNode, SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeAddedChildren(QgsLayerTreeNode*,int,int)));
2825
connect(mRootNode, SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeWillRemoveChildren(QgsLayerTreeNode*,int,int)));
2926
connect(mRootNode, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeRemovedChildren()));
27+
connect(mRootNode, SIGNAL(visibilityChanged(QgsLayerTreeNode*,Qt::CheckState)), this, SLOT(nodeVisibilityChanged(QgsLayerTreeNode*)));
3028
}
3129

3230
QgsLayerTreeModel::~QgsLayerTreeModel()
@@ -36,19 +34,6 @@ QgsLayerTreeModel::~QgsLayerTreeModel()
3634
mSymbologyNodes.clear();
3735
}
3836

39-
void QgsLayerTreeModel::connectToNode(QgsLayerTreeNode* node)
40-
{
41-
connect(node, SIGNAL(visibilityChanged(Qt::CheckState)), this, SLOT(nodeVisibilityChanded()));
42-
43-
if (QgsLayerTree::isLayer(node) && testFlag(ShowSymbology))
44-
{
45-
addSymbologyToLayer(QgsLayerTree::toLayer(node));
46-
}
47-
48-
foreach (QgsLayerTreeNode* child, node->children())
49-
connectToNode(child);
50-
}
51-
5237
QgsLayerTreeNode* QgsLayerTreeModel::index2node(const QModelIndex& index) const
5338
{
5439
if (!index.isValid())
@@ -378,8 +363,23 @@ void QgsLayerTreeModel::nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom,
378363

379364
endInsertRows();
380365

381-
for (int i = indexFrom; i <= indexTo; ++i)
382-
connectToNode( node->children()[i] );
366+
if (testFlag(ShowSymbology))
367+
{
368+
// collect layers for which we need to add symbology
369+
QList<QgsLayerTreeLayer*> newLayerNodes;
370+
QList<QgsLayerTreeNode*> children = node->children();
371+
for (int i = indexFrom; i <= indexTo; ++i)
372+
{
373+
QgsLayerTreeNode* child = children.at(i);
374+
if (QgsLayerTree::isLayer(child))
375+
newLayerNodes << QgsLayerTree::toLayer(child);
376+
else if (QgsLayerTree::isGroup(child))
377+
newLayerNodes << QgsLayerTree::toGroup(child)->findLayers();
378+
}
379+
380+
foreach (QgsLayerTreeLayer* newLayerNode, newLayerNodes)
381+
addSymbologyToLayer(newLayerNode);
382+
}
383383
}
384384

385385
void QgsLayerTreeModel::nodeWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
@@ -398,9 +398,8 @@ void QgsLayerTreeModel::nodeRemovedChildren()
398398
endRemoveRows();
399399
}
400400

401-
void QgsLayerTreeModel::nodeVisibilityChanded()
401+
void QgsLayerTreeModel::nodeVisibilityChanged(QgsLayerTreeNode* node)
402402
{
403-
QgsLayerTreeNode* node = qobject_cast<QgsLayerTreeNode*>(sender());
404403
Q_ASSERT(node);
405404

406405
QModelIndex index = node2index(node);

src/gui/layertree/qgslayertreemodel.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,12 @@ protected slots:
8484
void nodeWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
8585
void nodeRemovedChildren();
8686

87-
void nodeVisibilityChanded();
87+
void nodeVisibilityChanged(QgsLayerTreeNode* node);
8888

8989
void nodeLayerLoaded();
9090
void layerRendererChanged();
9191

9292
protected:
93-
void connectToNode(QgsLayerTreeNode* node);
9493
void removeSymbologyFromSubtree(QgsLayerTreeNode* node);
9594
void removeSymbologyFromLayer(QgsLayerTreeLayer* nodeLayer);
9695
void addSymbologyToLayer(QgsLayerTreeLayer* nodeL);

0 commit comments

Comments
 (0)