Skip to content

Commit 7cbba81

Browse files
committed
Some more indicator refactoring
Pass QgsMapLayer instance to tooltip and icon, in case they needs updates
1 parent a9a5039 commit 7cbba81

8 files changed

+71
-202
lines changed

src/app/qgslayertreeviewbadlayerindicator.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,15 @@ void QgsLayerTreeViewBadLayerIndicatorProvider::onIndicatorClicked( const QModel
4040
// TODO: open source select dialog
4141
}
4242

43-
QString QgsLayerTreeViewBadLayerIndicatorProvider::iconName()
43+
QString QgsLayerTreeViewBadLayerIndicatorProvider::iconName( QgsMapLayer *layer )
4444
{
45+
Q_UNUSED( layer );
4546
return QStringLiteral( "/mIndicatorBadLayer.svg" );
4647
}
4748

48-
QString QgsLayerTreeViewBadLayerIndicatorProvider::tooltipText()
49+
QString QgsLayerTreeViewBadLayerIndicatorProvider::tooltipText( QgsMapLayer *layer )
4950
{
51+
Q_UNUSED( layer );
5052
return tr( "<b>Bad layer!</b><br>Layer data source could not be found, click here to set a new data source." );
5153
}
5254

src/app/qgslayertreeviewbadlayerindicator.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class QgsLayerTreeViewBadLayerIndicatorProvider : public QgsLayerTreeViewIndicat
3333
void onIndicatorClicked( const QModelIndex &index ) override;
3434

3535
private:
36-
QString iconName() override;
37-
QString tooltipText() override;
36+
QString iconName( QgsMapLayer *layer ) override;
37+
QString tooltipText( QgsMapLayer *layer ) override;
3838
bool acceptLayer( QgsMapLayer *layer ) override;
3939
};
4040

src/app/qgslayertreeviewfilterindicator.cpp

+29-150
Original file line numberDiff line numberDiff line change
@@ -24,115 +24,10 @@
2424

2525

2626
QgsLayerTreeViewFilterIndicatorProvider::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-
13631
void 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+

src/app/qgslayertreeviewfilterindicator.h

+12-29
Original file line numberDiff line numberDiff line change
@@ -16,44 +16,27 @@
1616
#ifndef QGSLAYERTREEVIEWFILTERINDICATOR_H
1717
#define QGSLAYERTREEVIEWFILTERINDICATOR_H
1818

19-
#include "qgslayertreeviewindicator.h"
20-
21-
#include <QSet>
22-
#include <memory>
23-
24-
class QgsLayerTreeNode;
25-
class QgsLayerTreeView;
26-
class QgsVectorLayer;
19+
#include "qgslayertreeviewindicatorprovider.h"
2720

21+
#include <QObject>
2822

2923
//! Adds indicators showing whether vector layers have a filter applied.
30-
class QgsLayerTreeViewFilterIndicatorProvider : public QObject
24+
class QgsLayerTreeViewFilterIndicatorProvider : public QgsLayerTreeViewIndicatorProvider
3125
{
3226
Q_OBJECT
3327
public:
3428
explicit QgsLayerTreeViewFilterIndicatorProvider( QgsLayerTreeView *view );
3529

36-
private slots:
37-
//! Connects to signals of layers newly added to the tree
38-
void onAddedChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo );
39-
//! Disconnects from layers about to be removed from the tree
40-
void onWillRemoveChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo );
41-
//! Starts listening to layer provider's dataChanged signal
42-
void onLayerLoaded();
43-
//! Adds/removes indicator of a layer
44-
void onSubsetStringChanged();
45-
46-
void onIndicatorClicked( const QModelIndex &index );
47-
48-
private:
49-
std::unique_ptr< QgsLayerTreeViewIndicator > newIndicator( const QString &filter );
50-
void updateIndicator( QgsLayerTreeViewIndicator *indicator, const QString &filter );
51-
void addOrRemoveIndicator( QgsLayerTreeNode *node, QgsVectorLayer *vlayer );
52-
5330
private:
54-
QgsLayerTreeView *mLayerTreeView = nullptr;
55-
QIcon mIcon;
56-
QSet<QgsLayerTreeViewIndicator *> mIndicators;
31+
bool acceptLayer( QgsMapLayer *layer ) override;
32+
QString iconName( QgsMapLayer *layer ) override;
33+
QString tooltipText( QgsMapLayer *layer ) override;
34+
35+
// QgsLayerTreeViewIndicatorProvider interface
36+
protected slots:
37+
void onIndicatorClicked( const QModelIndex &index ) override;
38+
void connectSignals( QgsMapLayer *layer ) override;
39+
void disconnectSignals( QgsMapLayer *layer ) override;
5740
};
5841

5942
#endif // QGSLAYERTREEVIEWFILTERINDICATOR_H

src/app/qgslayertreeviewindicatorprovider.cpp

+13-10
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
44
---------------------
55
begin : 17.10.2018
6-
copyright : (C) 2018 by ale
7-
email : [your-email-here]
6+
copyright : (C) 2018 by Alessandro Pasotti
7+
email : elpaso@itopen.it
88
***************************************************************************
99
* *
1010
* This program is free software; you can redistribute it and/or modify *
@@ -82,7 +82,7 @@ void QgsLayerTreeViewIndicatorProvider::onWillRemoveChildren( QgsLayerTreeNode *
8282
{
8383
QgsLayerTreeLayer *childLayerNode = QgsLayerTree::toLayer( childNode );
8484
if ( QgsLayerTreeUtils::countMapLayerInTree( mLayerTreeView->layerTreeModel()->rootGroup(), childLayerNode->layer() ) == 1 )
85-
disconnectSignals( childLayerNode->layer() );
85+
disconnectSignals( childLayerNode->layer() );
8686
}
8787
}
8888
}
@@ -121,33 +121,33 @@ void QgsLayerTreeViewIndicatorProvider::onLayerChanged()
121121
}
122122
}
123123

124-
void QgsLayerTreeViewIndicatorProvider::connectSignals(QgsMapLayer* layer)
124+
void QgsLayerTreeViewIndicatorProvider::connectSignals( QgsMapLayer *layer )
125125
{
126126
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
127127
if ( !vlayer )
128128
return;
129129
connect( vlayer, &QgsVectorLayer::dataSourceChanged, this, &QgsLayerTreeViewIndicatorProvider::onLayerChanged );
130130
}
131131

132-
void QgsLayerTreeViewIndicatorProvider::disconnectSignals(QgsMapLayer* layer)
132+
void QgsLayerTreeViewIndicatorProvider::disconnectSignals( QgsMapLayer *layer )
133133
{
134134
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
135135
if ( !vlayer )
136136
return;
137137
disconnect( vlayer, &QgsVectorLayer::dataSourceChanged, this, &QgsLayerTreeViewIndicatorProvider::onLayerChanged );
138138
}
139139

140-
std::unique_ptr< QgsLayerTreeViewIndicator > QgsLayerTreeViewIndicatorProvider::newIndicator()
140+
std::unique_ptr< QgsLayerTreeViewIndicator > QgsLayerTreeViewIndicatorProvider::newIndicator( QgsMapLayer *layer )
141141
{
142142
std::unique_ptr< QgsLayerTreeViewIndicator > indicator = qgis::make_unique< QgsLayerTreeViewIndicator >( this );
143-
indicator->setIcon( QgsApplication::getThemeIcon( iconName() ) );
144-
indicator->setToolTip( tooltipText() );
143+
indicator->setIcon( QgsApplication::getThemeIcon( iconName( layer ) ) );
144+
indicator->setToolTip( tooltipText( layer ) );
145145
connect( indicator.get(), &QgsLayerTreeViewIndicator::clicked, this, &QgsLayerTreeViewIndicatorProvider::onIndicatorClicked );
146146
mIndicators.insert( indicator.get() );
147147
return indicator;
148148
}
149149

150-
void QgsLayerTreeViewIndicatorProvider::addOrRemoveIndicator(QgsLayerTreeNode *node, QgsMapLayer* layer )
150+
void QgsLayerTreeViewIndicatorProvider::addOrRemoveIndicator( QgsLayerTreeNode *node, QgsMapLayer *layer )
151151
{
152152

153153
if ( acceptLayer( layer ) )
@@ -159,12 +159,15 @@ void QgsLayerTreeViewIndicatorProvider::addOrRemoveIndicator(QgsLayerTreeNode *n
159159
{
160160
if ( mIndicators.contains( indicator ) )
161161
{
162+
// Update just in case ...
163+
indicator->setToolTip( tooltipText( layer ) );
164+
indicator->setIcon( QgsApplication::getThemeIcon( iconName( layer ) ) );
162165
return;
163166
}
164167
}
165168

166169
// it does not exist: need to create a new one
167-
mLayerTreeView->addIndicator( node, newIndicator().release() );
170+
mLayerTreeView->addIndicator( node, newIndicator( layer ).release() );
168171
}
169172
else
170173
{

src/app/qgslayertreeviewindicatorprovider.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
44
---------------------
55
begin : 17.10.2018
6-
copyright : (C) 2018 by ale
7-
email : [your-email-here]
6+
copyright : (C) 2018 by Alessandro Pasotti
7+
email : elpaso@itopen.it
88
***************************************************************************
99
* *
1010
* This program is free software; you can redistribute it and/or modify *
@@ -66,9 +66,9 @@ class QgsLayerTreeViewIndicatorProvider : public QObject
6666
private:
6767
//! Layer filter
6868
virtual bool acceptLayer( QgsMapLayer *layer ) = 0;
69-
virtual QString iconName() = 0;
70-
virtual QString tooltipText() = 0;
71-
virtual std::unique_ptr< QgsLayerTreeViewIndicator > newIndicator();
69+
virtual QString iconName( QgsMapLayer *layer ) = 0;
70+
virtual QString tooltipText( QgsMapLayer *layer ) = 0;
71+
virtual std::unique_ptr< QgsLayerTreeViewIndicator > newIndicator( QgsMapLayer *layer );
7272
virtual void addOrRemoveIndicator( QgsLayerTreeNode *node, QgsMapLayer *layer );
7373

7474
protected:

0 commit comments

Comments
 (0)