2424
2525
2626QgsLayerTreeViewFilterIndicatorProvider::QgsLayerTreeViewFilterIndicatorProvider ( QgsLayerTreeView *view )
27- : QObject( view )
28- , mLayerTreeView( view )
27+ : QgsLayerTreeViewIndicatorProvider( view )
2928{
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- }
11429}
11530
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-
13631void QgsLayerTreeViewFilterIndicatorProvider::onIndicatorClicked ( const QModelIndex &index )
13732{
13833 QgsLayerTreeNode *node = mLayerTreeView ->layerTreeModel ()->index2node ( index );
@@ -150,57 +45,41 @@ void QgsLayerTreeViewFilterIndicatorProvider::onIndicatorClicked( const QModelIn
15045 vlayer->setSubsetString ( qb.sql () );
15146}
15247
153- std::unique_ptr<QgsLayerTreeViewIndicator> QgsLayerTreeViewFilterIndicatorProvider::newIndicator ( const QString &filter )
48+ QString QgsLayerTreeViewFilterIndicatorProvider::iconName ( QgsMapLayer *layer )
15449{
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" );
16152}
16253
163- void QgsLayerTreeViewFilterIndicatorProvider::updateIndicator ( QgsLayerTreeViewIndicator *indicator, const QString &filter )
54+ QString QgsLayerTreeViewFilterIndicatorProvider::tooltipText ( QgsMapLayer *layer )
16455{
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 () );
16660}
16761
168-
169- void QgsLayerTreeViewFilterIndicatorProvider::addOrRemoveIndicator ( QgsLayerTreeNode *node, QgsVectorLayer *vlayer )
62+ void QgsLayerTreeViewFilterIndicatorProvider::connectSignals ( QgsMapLayer *layer )
17063{
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+ }
19269
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+ }
20377
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 ();
20684}
85+
0 commit comments