17
17
#include " qgslayertree.h"
18
18
#include " qgslayertreemodel.h"
19
19
#include " qgslayertreeview.h"
20
+ #include " qgsvectorlayer.h"
20
21
21
22
QgsLayerTreeViewMemoryIndicatorProvider::QgsLayerTreeViewMemoryIndicatorProvider ( QgsLayerTreeView *view )
22
23
: QObject( view )
@@ -28,6 +29,7 @@ QgsLayerTreeViewMemoryIndicatorProvider::QgsLayerTreeViewMemoryIndicatorProvider
28
29
onAddedChildren ( tree, 0 , tree->children ().count () - 1 );
29
30
30
31
connect ( tree, &QgsLayerTree::addedChildren, this , &QgsLayerTreeViewMemoryIndicatorProvider::onAddedChildren );
32
+ connect ( tree, &QgsLayerTree::willRemoveChildren, this , &QgsLayerTreeViewMemoryIndicatorProvider::onWillRemoveChildren );
31
33
}
32
34
33
35
void QgsLayerTreeViewMemoryIndicatorProvider::onAddedChildren ( QgsLayerTreeNode *node, int indexFrom, int indexTo )
@@ -46,8 +48,11 @@ void QgsLayerTreeViewMemoryIndicatorProvider::onAddedChildren( QgsLayerTreeNode
46
48
{
47
49
if ( QgsLayerTreeLayer *layerNode = dynamic_cast < QgsLayerTreeLayer * >( childNode ) )
48
50
{
49
- if ( layerNode->layer () && layerNode->layer ()->dataProvider ()->name () == QLatin1String ( " memory" ) )
50
- addIndicatorForMemoryLayer ( childNode );
51
+ if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layerNode->layer () ) )
52
+ {
53
+ connect ( vlayer, &QgsVectorLayer::dataSourceChanged, this , &QgsLayerTreeViewMemoryIndicatorProvider::onDataSourceChanged );
54
+ addOrRemoveIndicator ( childNode, vlayer );
55
+ }
51
56
else if ( !layerNode->layer () )
52
57
{
53
58
// wait for layer to be loaded (e.g. when loading project, first the tree is loaded, afterwards the references to layers are resolved)
@@ -58,14 +63,63 @@ void QgsLayerTreeViewMemoryIndicatorProvider::onAddedChildren( QgsLayerTreeNode
58
63
}
59
64
}
60
65
66
+ void QgsLayerTreeViewMemoryIndicatorProvider::onWillRemoveChildren ( QgsLayerTreeNode *node, int indexFrom, int indexTo )
67
+ {
68
+ // recursively disconnect from providers' dataChanged() signal
69
+
70
+ QList<QgsLayerTreeNode *> children = node->children ();
71
+ for ( int i = indexFrom; i <= indexTo; ++i )
72
+ {
73
+ QgsLayerTreeNode *childNode = children[i];
74
+
75
+ if ( QgsLayerTree::isGroup ( childNode ) )
76
+ {
77
+ onWillRemoveChildren ( childNode, 0 , childNode->children ().count () - 1 );
78
+ }
79
+ else if ( QgsLayerTree::isLayer ( childNode ) )
80
+ {
81
+ QgsLayerTreeLayer *childLayerNode = QgsLayerTree::toLayer ( childNode );
82
+ if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( childLayerNode->layer () ) )
83
+ {
84
+ if ( vlayer )
85
+ disconnect ( vlayer, &QgsVectorLayer::dataSourceChanged, this , &QgsLayerTreeViewMemoryIndicatorProvider::onDataSourceChanged );
86
+ }
87
+ }
88
+ }
89
+ }
90
+
61
91
void QgsLayerTreeViewMemoryIndicatorProvider::onLayerLoaded ()
62
92
{
63
93
QgsLayerTreeLayer *layerNode = qobject_cast<QgsLayerTreeLayer *>( sender () );
64
94
if ( !layerNode )
65
95
return ;
66
96
67
- if ( layerNode->layer () && layerNode->layer ()->dataProvider ()->name () == QLatin1String ( " memory" ) )
68
- addIndicatorForMemoryLayer ( layerNode );
97
+ if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layerNode->layer () ) )
98
+ {
99
+ if ( vlayer )
100
+ {
101
+ connect ( vlayer, &QgsVectorLayer::dataSourceChanged, this , &QgsLayerTreeViewMemoryIndicatorProvider::onDataSourceChanged );
102
+ addOrRemoveIndicator ( layerNode, vlayer );
103
+ }
104
+ }
105
+ }
106
+
107
+ void QgsLayerTreeViewMemoryIndicatorProvider::onDataSourceChanged ()
108
+ {
109
+ QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( sender () );
110
+ if ( !vlayer )
111
+ return ;
112
+
113
+ // walk the tree and find layer node that needs to be updated
114
+ const QList<QgsLayerTreeLayer *> layerNodes = mLayerTreeView ->layerTreeModel ()->rootGroup ()->findLayers ();
115
+ for ( QgsLayerTreeLayer *node : layerNodes )
116
+ {
117
+ if ( node->layer () && node->layer () == vlayer )
118
+ {
119
+ addOrRemoveIndicator ( node, vlayer );
120
+ break ;
121
+ }
122
+ }
69
123
}
70
124
71
125
std::unique_ptr< QgsLayerTreeViewIndicator > QgsLayerTreeViewMemoryIndicatorProvider::newIndicator ()
@@ -77,19 +131,41 @@ std::unique_ptr< QgsLayerTreeViewIndicator > QgsLayerTreeViewMemoryIndicatorProv
77
131
return indicator;
78
132
}
79
133
80
- void QgsLayerTreeViewMemoryIndicatorProvider::addIndicatorForMemoryLayer ( QgsLayerTreeNode *node )
134
+ void QgsLayerTreeViewMemoryIndicatorProvider::addOrRemoveIndicator ( QgsLayerTreeNode *node, QgsVectorLayer *vlayer )
81
135
{
82
- const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView -> indicators ( node );
136
+ const bool isMemory = vlayer-> dataProvider ()-> name () == QLatin1String ( " memory " );
83
137
84
- // maybe the indicator exists already
85
- for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
138
+ if ( isMemory )
86
139
{
87
- if ( mIndicators .contains ( indicator ) )
140
+ const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView ->indicators ( node );
141
+
142
+ // maybe the indicator exists already
143
+ for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
88
144
{
89
- return ;
145
+ if ( mIndicators .contains ( indicator ) )
146
+ {
147
+ return ;
148
+ }
90
149
}
150
+
151
+ // it does not exist: need to create a new one
152
+ mLayerTreeView ->addIndicator ( node, newIndicator ().release () );
91
153
}
154
+ else
155
+ {
156
+ const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView ->indicators ( node );
92
157
93
- // it does not exist: need to create a new one
94
- mLayerTreeView ->addIndicator ( node, newIndicator ().release () );
158
+ // there may be existing indicator we need to get rid of
159
+ for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
160
+ {
161
+ if ( mIndicators .contains ( indicator ) )
162
+ {
163
+ mLayerTreeView ->removeIndicator ( node, indicator );
164
+ indicator->deleteLater ();
165
+ return ;
166
+ }
167
+ }
168
+
169
+ // no indicator was there before, nothing to do
170
+ }
95
171
}
0 commit comments