Skip to content

Commit 1a61c15

Browse files
committed
Propagate added/removed children signals to the root for easier manipulation
1 parent 36d8d88 commit 1a61c15

9 files changed

+40
-63
lines changed

src/core/layertree/qgslayertreegroup.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ void QgsLayerTreeGroup::connectToChildNode(QgsLayerTreeNode* node)
5151
}
5252

5353
connect(node, SIGNAL(visibilityChanged(Qt::CheckState)), this, SLOT(updateVisibilityFromChildren()));
54-
// forward the signal towards the root
55-
connect(node, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)), this, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)));
5654
}
5755

5856
void QgsLayerTreeGroup::insertChildNode(int index, QgsLayerTreeNode* node)

src/core/layertree/qgslayertreenode.cpp

+13-4
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,19 @@ void QgsLayerTreeNode::insertChildren(int index, QList<QgsLayerTreeNode*> nodes)
9292
index = mChildren.count();
9393

9494
int indexTo = index+nodes.count()-1;
95-
emit willAddChildren(index, indexTo);
95+
emit willAddChildren(this, index, indexTo);
9696
for (int i = 0; i < nodes.count(); ++i)
97+
{
9798
mChildren.insert(index+i, nodes[i]);
98-
emit addedChildren(index, indexTo);
99+
100+
// forward the signal towards the root
101+
connect(nodes[i], SIGNAL(willAddChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(willAddChildren(QgsLayerTreeNode*,int,int)));
102+
connect(nodes[i], SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)));
103+
connect(nodes[i], SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)));
104+
connect(nodes[i], SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)));
105+
connect(nodes[i], SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)), this, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)));
106+
}
107+
emit addedChildren(this, index, indexTo);
99108
}
100109

101110
void QgsLayerTreeNode::removeChildAt(int i)
@@ -109,12 +118,12 @@ void QgsLayerTreeNode::removeChildrenRange(int from, int count)
109118
return;
110119

111120
int to = from+count-1;
112-
emit willRemoveChildren(from, to);
121+
emit willRemoveChildren(this, from, to);
113122
while (--count >= 0)
114123
{
115124
QgsLayerTreeNode* node = mChildren.takeAt(from);
116125
node->mParent = 0;
117126
delete node;
118127
}
119-
emit removedChildren(from, to);
128+
emit removedChildren(this, from, to);
120129
}

src/core/layertree/qgslayertreenode.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ class CORE_EXPORT QgsLayerTreeNode : public QObject
4949

5050
// low-level signals (mainly for the model)
5151

52-
void willAddChildren(int indexFrom, int indexTo);
53-
void addedChildren(int indexFrom, int indexTo);
52+
void willAddChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
53+
void addedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
5454

55-
void willRemoveChildren(int indexFrom, int indexTo);
56-
void removedChildren(int indexFrom, int indexTo);
55+
void willRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
56+
void removedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
5757

5858
void visibilityChanged(Qt::CheckState state);
5959

src/core/layertree/qgslayertreeregistrybridge.cpp

+5-31
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ QgsLayerTreeRegistryBridge::QgsLayerTreeRegistryBridge(QgsLayerTreeGroup *root,
1616
connect(QgsMapLayerRegistry::instance(), SIGNAL(layersAdded(QList<QgsMapLayer*>)), this, SLOT(layersAdded(QList<QgsMapLayer*>)));
1717
connect(QgsMapLayerRegistry::instance(), SIGNAL(layersWillBeRemoved(QStringList)), this, SLOT(layersWillBeRemoved(QStringList)));
1818

19-
connectToGroup(mRoot);
19+
connect(mRoot, SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)), this, SLOT(groupWillRemoveChildren(QgsLayerTreeNode*,int,int)));
20+
connect(mRoot, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(groupRemovedChildren()));
2021
}
2122

2223
void QgsLayerTreeRegistryBridge::setLayerInsertionPoint(QgsLayerTreeGroup* parentGroup, int index)
@@ -59,19 +60,6 @@ void QgsLayerTreeRegistryBridge::layersWillBeRemoved(QStringList layerIds)
5960
}
6061

6162

62-
void QgsLayerTreeRegistryBridge::groupAddedChildren(int indexFrom, int indexTo)
63-
{
64-
QgsLayerTreeGroup* group = qobject_cast<QgsLayerTreeGroup*>(sender());
65-
Q_ASSERT(group);
66-
67-
for (int i = indexFrom; i <= indexTo; ++i)
68-
{
69-
QgsLayerTreeNode* child = group->children()[i];
70-
if (QgsLayerTree::isGroup(child))
71-
connectToGroup(QgsLayerTree::toGroup(child));
72-
}
73-
}
74-
7563
static void _collectLayerIdsInGroup(QgsLayerTreeGroup* group, int indexFrom, int indexTo, QStringList& lst)
7664
{
7765
for (int i = indexFrom; i <= indexTo; ++i)
@@ -88,12 +76,12 @@ static void _collectLayerIdsInGroup(QgsLayerTreeGroup* group, int indexFrom, int
8876
}
8977
}
9078

91-
void QgsLayerTreeRegistryBridge::groupWillRemoveChildren(int indexFrom, int indexTo)
79+
void QgsLayerTreeRegistryBridge::groupWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
9280
{
9381
Q_ASSERT(mLayerIdsForRemoval.isEmpty());
9482

95-
QgsLayerTreeGroup* group = qobject_cast<QgsLayerTreeGroup*>(sender());
96-
Q_ASSERT(group);
83+
Q_ASSERT(QgsLayerTree::isGroup(node));
84+
QgsLayerTreeGroup* group = QgsLayerTree::toGroup(node);
9785

9886
_collectLayerIdsInGroup(group, indexFrom, indexTo, mLayerIdsForRemoval);
9987
}
@@ -110,17 +98,3 @@ void QgsLayerTreeRegistryBridge::groupRemovedChildren()
11098

11199
QgsMapLayerRegistry::instance()->removeMapLayers(toRemove);
112100
}
113-
114-
void QgsLayerTreeRegistryBridge::connectToGroup(QgsLayerTreeGroup* group)
115-
{
116-
connect(group, SIGNAL(addedChildren(int,int)), this, SLOT(groupAddedChildren(int,int)));
117-
connect(group, SIGNAL(willRemoveChildren(int,int)), this, SLOT(groupWillRemoveChildren(int,int)));
118-
connect(group, SIGNAL(removedChildren(int,int)), this, SLOT(groupRemovedChildren()));
119-
120-
foreach (QgsLayerTreeNode* child, group->children())
121-
{
122-
if (QgsLayerTree::isGroup(child))
123-
connectToGroup(QgsLayerTree::toGroup(child));
124-
}
125-
}
126-

src/core/layertree/qgslayertreeregistrybridge.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <QStringList>
66

77
class QgsLayerTreeGroup;
8+
class QgsLayerTreeNode;
89

910
class QgsMapLayer;
1011

@@ -30,12 +31,10 @@ protected slots:
3031
void layersAdded(QList<QgsMapLayer*> layers);
3132
void layersWillBeRemoved(QStringList layerIds);
3233

33-
void groupAddedChildren(int indexFrom, int indexTo);
34-
void groupWillRemoveChildren(int indexFrom, int indexTo);
34+
void groupWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
3535
void groupRemovedChildren();
3636

3737
protected:
38-
void connectToGroup(QgsLayerTreeGroup* group);
3938

4039
protected:
4140
QgsLayerTreeGroup* mRoot;

src/gui/layertree/qgslayertreemapcanvasbridge.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ QgsLayerTreeMapCanvasBridge::QgsLayerTreeMapCanvasBridge(QgsLayerTreeGroup *root
1111
, mHasCustomLayerOrder(false)
1212
{
1313
connectToNode(root);
14+
connect(root, SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeAddedChildren(QgsLayerTreeNode*,int,int)));
1415
connect(root, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)), this, SLOT(nodeCustomPropertyChanged(QgsLayerTreeNode*,QString)));
16+
connect(root, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeRemovedChildren()));
1517

1618
setCanvasLayers();
1719
}
@@ -69,8 +71,6 @@ void QgsLayerTreeMapCanvasBridge::setCustomLayerOrder(const QStringList& order)
6971

7072
void QgsLayerTreeMapCanvasBridge::connectToNode(QgsLayerTreeNode *node)
7173
{
72-
connect(node, SIGNAL(addedChildren(int,int)), this, SLOT(nodeAddedChildren(int,int)));
73-
connect(node, SIGNAL(removedChildren(int,int)), this, SLOT(nodeRemovedChildren()));
7474
connect(node, SIGNAL(visibilityChanged(Qt::CheckState)), this, SLOT(nodeVisibilityChanged()));
7575

7676
if (QgsLayerTree::isLayer(node))
@@ -126,11 +126,10 @@ void QgsLayerTreeMapCanvasBridge::deferredSetCanvasLayers()
126126
QMetaObject::invokeMethod(this, "setCanvasLayers", Qt::QueuedConnection);
127127
}
128128

129-
void QgsLayerTreeMapCanvasBridge::nodeAddedChildren(int indexFrom, int indexTo)
129+
void QgsLayerTreeMapCanvasBridge::nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
130130
{
131131
// connect to new children
132-
Q_ASSERT(sender() && qobject_cast<QgsLayerTreeNode*>(sender()));
133-
QgsLayerTreeNode* node = qobject_cast<QgsLayerTreeNode*>(sender());
132+
Q_ASSERT(node);
134133
for (int i = indexFrom; i <= indexTo; ++i)
135134
connectToNode(node->children()[i]);
136135

src/gui/layertree/qgslayertreemapcanvasbridge.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public slots:
4040
void deferredSetCanvasLayers();
4141

4242
protected slots:
43-
void nodeAddedChildren(int indexFrom, int indexTo);
43+
void nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
4444
void nodeRemovedChildren();
4545
void nodeVisibilityChanged();
4646
void nodeCustomPropertyChanged(QgsLayerTreeNode* node, QString key);

src/gui/layertree/qgslayertreemodel.cpp

+8-10
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ QgsLayerTreeModel::QgsLayerTreeModel(QgsLayerTreeGroup* rootNode, QObject *paren
2222

2323
// connect to all existing nodes
2424
connectToNode(mRootNode);
25+
26+
connect(mRootNode, SIGNAL(willAddChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeWillAddChildren(QgsLayerTreeNode*,int,int)));
27+
connect(mRootNode, SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeAddedChildren(QgsLayerTreeNode*,int,int)));
28+
connect(mRootNode, SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeWillRemoveChildren(QgsLayerTreeNode*,int,int)));
29+
connect(mRootNode, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeRemovedChildren()));
2530
}
2631

2732
QgsLayerTreeModel::~QgsLayerTreeModel()
@@ -33,10 +38,6 @@ QgsLayerTreeModel::~QgsLayerTreeModel()
3338

3439
void QgsLayerTreeModel::connectToNode(QgsLayerTreeNode* node)
3540
{
36-
connect(node, SIGNAL(willAddChildren(int,int)), this, SLOT(nodeWillAddChildren(int,int)));
37-
connect(node, SIGNAL(addedChildren(int,int)), this, SLOT(nodeAddedChildren(int,int)));
38-
connect(node, SIGNAL(willRemoveChildren(int,int)), this, SLOT(nodeWillRemoveChildren(int,int)));
39-
connect(node, SIGNAL(removedChildren(int,int)), this, SLOT(nodeRemovedChildren()));
4041
connect(node, SIGNAL(visibilityChanged(Qt::CheckState)), this, SLOT(nodeVisibilityChanded()));
4142

4243
if (QgsLayerTree::isLayer(node) && testFlag(ShowSymbology))
@@ -365,16 +366,14 @@ void QgsLayerTreeModel::refreshLayerSymbology(QgsLayerTreeLayer* nodeLayer)
365366
addSymbologyToLayer(nodeLayer);
366367
}
367368

368-
void QgsLayerTreeModel::nodeWillAddChildren(int indexFrom, int indexTo)
369+
void QgsLayerTreeModel::nodeWillAddChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
369370
{
370-
QgsLayerTreeNode* node = qobject_cast<QgsLayerTreeNode*>(sender());
371371
Q_ASSERT(node);
372372
beginInsertRows(node2index(node), indexFrom, indexTo);
373373
}
374374

375-
void QgsLayerTreeModel::nodeAddedChildren(int indexFrom, int indexTo)
375+
void QgsLayerTreeModel::nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
376376
{
377-
QgsLayerTreeNode* node = qobject_cast<QgsLayerTreeNode*>(sender());
378377
Q_ASSERT(node);
379378

380379
endInsertRows();
@@ -383,9 +382,8 @@ void QgsLayerTreeModel::nodeAddedChildren(int indexFrom, int indexTo)
383382
connectToNode( node->children()[i] );
384383
}
385384

386-
void QgsLayerTreeModel::nodeWillRemoveChildren(int indexFrom, int indexTo)
385+
void QgsLayerTreeModel::nodeWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
387386
{
388-
QgsLayerTreeNode* node = qobject_cast<QgsLayerTreeNode*>(sender());
389387
Q_ASSERT(node);
390388

391389
beginRemoveRows(node2index(node), indexFrom, indexTo);

src/gui/layertree/qgslayertreemodel.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ class GUI_EXPORT QgsLayerTreeModel : public QAbstractItemModel
7979
signals:
8080

8181
protected slots:
82-
void nodeWillAddChildren(int indexFrom, int indexTo);
83-
void nodeAddedChildren(int indexFrom, int indexTo);
84-
void nodeWillRemoveChildren(int indexFrom, int indexTo);
82+
void nodeWillAddChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
83+
void nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
84+
void nodeWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
8585
void nodeRemovedChildren();
8686

8787
void nodeVisibilityChanded();

0 commit comments

Comments
 (0)