24
24
25
25
26
26
QgsLayerTreeViewFilterIndicatorProvider::QgsLayerTreeViewFilterIndicatorProvider ( QgsLayerTreeView *view )
27
- : QObject( view )
28
- , mLayerTreeView( view )
27
+ : QgsLayerTreeViewIndicatorProvider( view )
29
28
{
30
- mIcon = QgsApplication::getThemeIcon ( QStringLiteral ( " /mIndicatorFilter.svg" ) );
31
-
32
- QgsLayerTree *tree = mLayerTreeView ->layerTreeModel ()->rootGroup ();
33
- onAddedChildren ( tree, 0 , tree->children ().count () - 1 );
34
-
35
- connect ( tree, &QgsLayerTree::addedChildren, this , &QgsLayerTreeViewFilterIndicatorProvider::onAddedChildren );
36
- connect ( tree, &QgsLayerTree::willRemoveChildren, this , &QgsLayerTreeViewFilterIndicatorProvider::onWillRemoveChildren );
37
- }
38
-
39
-
40
- void QgsLayerTreeViewFilterIndicatorProvider::onAddedChildren ( QgsLayerTreeNode *node, int indexFrom, int indexTo )
41
- {
42
- // recursively connect to providers' dataChanged() signal
43
-
44
- QList<QgsLayerTreeNode *> children = node->children ();
45
- for ( int i = indexFrom; i <= indexTo; ++i )
46
- {
47
- QgsLayerTreeNode *childNode = children[i];
48
-
49
- if ( QgsLayerTree::isGroup ( childNode ) )
50
- {
51
- onAddedChildren ( childNode, 0 , childNode->children ().count () - 1 );
52
- }
53
- else if ( QgsLayerTree::isLayer ( childNode ) )
54
- {
55
- QgsLayerTreeLayer *childLayerNode = QgsLayerTree::toLayer ( childNode );
56
- if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( childLayerNode->layer () ) )
57
- {
58
- if ( QgsLayerTreeUtils::countMapLayerInTree ( mLayerTreeView ->layerTreeModel ()->rootGroup (), vlayer ) == 1 )
59
- connect ( vlayer, &QgsVectorLayer::subsetStringChanged, this , &QgsLayerTreeViewFilterIndicatorProvider::onSubsetStringChanged );
60
-
61
- addOrRemoveIndicator ( childLayerNode, vlayer );
62
- }
63
- else if ( !childLayerNode->layer () )
64
- {
65
- // wait for layer to be loaded (e.g. when loading project, first the tree is loaded, afterwards the references to layers are resolved)
66
- connect ( childLayerNode, &QgsLayerTreeLayer::layerLoaded, this , &QgsLayerTreeViewFilterIndicatorProvider::onLayerLoaded );
67
- }
68
- }
69
- }
70
- }
71
-
72
-
73
- void QgsLayerTreeViewFilterIndicatorProvider::onWillRemoveChildren ( QgsLayerTreeNode *node, int indexFrom, int indexTo )
74
- {
75
- // recursively disconnect from providers' dataChanged() signal
76
-
77
- QList<QgsLayerTreeNode *> children = node->children ();
78
- for ( int i = indexFrom; i <= indexTo; ++i )
79
- {
80
- QgsLayerTreeNode *childNode = children[i];
81
-
82
- if ( QgsLayerTree::isGroup ( childNode ) )
83
- {
84
- onWillRemoveChildren ( childNode, 0 , childNode->children ().count () - 1 );
85
- }
86
- else if ( QgsLayerTree::isLayer ( childNode ) )
87
- {
88
- QgsLayerTreeLayer *childLayerNode = QgsLayerTree::toLayer ( childNode );
89
- if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( childLayerNode->layer () ) )
90
- {
91
- if ( QgsLayerTreeUtils::countMapLayerInTree ( mLayerTreeView ->layerTreeModel ()->rootGroup (), vlayer ) == 1 )
92
- disconnect ( vlayer, &QgsVectorLayer::subsetStringChanged, this , &QgsLayerTreeViewFilterIndicatorProvider::onSubsetStringChanged );
93
- }
94
- }
95
- }
96
- }
97
-
98
-
99
- void QgsLayerTreeViewFilterIndicatorProvider::onLayerLoaded ()
100
- {
101
- QgsLayerTreeLayer *nodeLayer = qobject_cast<QgsLayerTreeLayer *>( sender () );
102
- if ( !nodeLayer )
103
- return ;
104
-
105
- if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( nodeLayer->layer () ) )
106
- {
107
- if ( vlayer )
108
- {
109
- connect ( vlayer, &QgsVectorLayer::subsetStringChanged, this , &QgsLayerTreeViewFilterIndicatorProvider::onSubsetStringChanged );
110
-
111
- addOrRemoveIndicator ( nodeLayer, vlayer );
112
- }
113
- }
114
29
}
115
30
116
-
117
- void QgsLayerTreeViewFilterIndicatorProvider::onSubsetStringChanged ()
118
- {
119
- QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( sender () );
120
- if ( !vlayer )
121
- return ;
122
-
123
- // walk the tree and find layer node that needs to be updated
124
- const QList<QgsLayerTreeLayer *> layerNodes = mLayerTreeView ->layerTreeModel ()->rootGroup ()->findLayers ();
125
- for ( QgsLayerTreeLayer *node : layerNodes )
126
- {
127
- if ( node->layer () && node->layer () == vlayer )
128
- {
129
- addOrRemoveIndicator ( node, vlayer );
130
- break ;
131
- }
132
- }
133
- }
134
-
135
-
136
31
void QgsLayerTreeViewFilterIndicatorProvider::onIndicatorClicked ( const QModelIndex &index )
137
32
{
138
33
QgsLayerTreeNode *node = mLayerTreeView ->layerTreeModel ()->index2node ( index );
@@ -150,57 +45,41 @@ void QgsLayerTreeViewFilterIndicatorProvider::onIndicatorClicked( const QModelIn
150
45
vlayer->setSubsetString ( qb.sql () );
151
46
}
152
47
153
- std::unique_ptr<QgsLayerTreeViewIndicator> QgsLayerTreeViewFilterIndicatorProvider::newIndicator ( const QString &filter )
48
+ QString QgsLayerTreeViewFilterIndicatorProvider::iconName ( QgsMapLayer *layer )
154
49
{
155
- std::unique_ptr< QgsLayerTreeViewIndicator > indicator = qgis::make_unique< QgsLayerTreeViewIndicator >( this );
156
- indicator->setIcon ( mIcon );
157
- updateIndicator ( indicator.get (), filter );
158
- connect ( indicator.get (), &QgsLayerTreeViewIndicator::clicked, this , &QgsLayerTreeViewFilterIndicatorProvider::onIndicatorClicked );
159
- mIndicators .insert ( indicator.get () );
160
- return indicator;
50
+ Q_UNUSED ( layer );
51
+ return QStringLiteral ( " /mIndicatorFilter.svg" );
161
52
}
162
53
163
- void QgsLayerTreeViewFilterIndicatorProvider::updateIndicator ( QgsLayerTreeViewIndicator *indicator, const QString &filter )
54
+ QString QgsLayerTreeViewFilterIndicatorProvider::tooltipText ( QgsMapLayer *layer )
164
55
{
165
- indicator->setToolTip ( QStringLiteral ( " <b>%1:</b><br>%2" ).arg ( tr ( " Filter" ), filter ) );
56
+ QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
57
+ if ( !vlayer )
58
+ return QString ();
59
+ return QStringLiteral ( " <b>%1:</b><br>%2" ).arg ( tr ( " Filter" ), vlayer->subsetString () );
166
60
}
167
61
168
-
169
- void QgsLayerTreeViewFilterIndicatorProvider::addOrRemoveIndicator ( QgsLayerTreeNode *node, QgsVectorLayer *vlayer )
62
+ void QgsLayerTreeViewFilterIndicatorProvider::connectSignals ( QgsMapLayer *layer )
170
63
{
171
- QString filter = vlayer->subsetString ();
172
- if ( !filter.isEmpty () )
173
- {
174
- const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView ->indicators ( node );
175
-
176
- // maybe the indicator exists already
177
- for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
178
- {
179
- if ( mIndicators .contains ( indicator ) )
180
- {
181
- updateIndicator ( indicator, filter );
182
- return ;
183
- }
184
- }
185
-
186
- // it does not exist: need to create a new one
187
- mLayerTreeView ->addIndicator ( node, newIndicator ( filter ).release () );
188
- }
189
- else
190
- {
191
- const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView ->indicators ( node );
64
+ QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
65
+ if ( !vlayer )
66
+ return ;
67
+ connect ( vlayer, &QgsVectorLayer::subsetStringChanged, this , &QgsLayerTreeViewFilterIndicatorProvider::onLayerChanged );
68
+ }
192
69
193
- // there may be existing indicator we need to get rid of
194
- for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
195
- {
196
- if ( mIndicators .contains ( indicator ) )
197
- {
198
- mLayerTreeView ->removeIndicator ( node, indicator );
199
- indicator->deleteLater ();
200
- return ;
201
- }
202
- }
70
+ void QgsLayerTreeViewFilterIndicatorProvider::disconnectSignals ( QgsMapLayer *layer )
71
+ {
72
+ QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
73
+ if ( !vlayer )
74
+ return ;
75
+ disconnect ( vlayer, &QgsVectorLayer::subsetStringChanged, this , &QgsLayerTreeViewFilterIndicatorProvider::onLayerChanged );
76
+ }
203
77
204
- // no indicator was there before, nothing to do
205
- }
78
+ bool QgsLayerTreeViewFilterIndicatorProvider::acceptLayer ( QgsMapLayer *layer )
79
+ {
80
+ QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
81
+ if ( !vlayer )
82
+ return false ;
83
+ return ! vlayer->subsetString ().isEmpty ();
206
84
}
85
+
0 commit comments