Skip to content

Commit d56ddc2

Browse files
committedJun 12, 2019
Minor refactor of QgsMapLayerProxyModel
1 parent 760af67 commit d56ddc2

File tree

4 files changed

+118
-17
lines changed

4 files changed

+118
-17
lines changed
 

‎python/core/auto_generated/qgsmaplayerproxymodel.sip.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,13 @@ Returns the current filter string, if set.
160160
.. seealso:: :py:func:`setFilterString`
161161

162162
.. versionadded:: 3.4
163+
%End
164+
165+
bool acceptsLayer( QgsMapLayer *layer ) const;
166+
%Docstring
167+
Returns ``True`` if the proxy model accepts the specified map ``layer``.
168+
169+
.. versionadded:: 3.8
163170
%End
164171

165172
virtual bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const;

‎src/core/qgsmaplayerproxymodel.cpp

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -92,24 +92,8 @@ void QgsMapLayerProxyModel::setExcludedProviders( const QStringList &providers )
9292
invalidateFilter();
9393
}
9494

95-
void QgsMapLayerProxyModel::setFilterString( const QString &filter )
95+
bool QgsMapLayerProxyModel::acceptsLayer( QgsMapLayer *layer ) const
9696
{
97-
mFilterString = filter;
98-
invalidateFilter();
99-
}
100-
101-
bool QgsMapLayerProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
102-
{
103-
if ( mFilters.testFlag( All ) && mExceptList.isEmpty() && mLayerWhitelist.isEmpty() && mExcludedProviders.isEmpty() && mFilterString.isEmpty() )
104-
return true;
105-
106-
QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
107-
108-
if ( sourceModel()->data( index, QgsMapLayerModel::EmptyRole ).toBool()
109-
|| sourceModel()->data( index, QgsMapLayerModel::AdditionalRole ).toBool() )
110-
return true;
111-
112-
QgsMapLayer *layer = static_cast<QgsMapLayer *>( index.internalPointer() );
11397
if ( !layer )
11498
return false;
11599

@@ -161,6 +145,26 @@ bool QgsMapLayerProxyModel::filterAcceptsRow( int source_row, const QModelIndex
161145
return false;
162146
}
163147

148+
void QgsMapLayerProxyModel::setFilterString( const QString &filter )
149+
{
150+
mFilterString = filter;
151+
invalidateFilter();
152+
}
153+
154+
bool QgsMapLayerProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
155+
{
156+
if ( mFilters.testFlag( All ) && mExceptList.isEmpty() && mLayerWhitelist.isEmpty() && mExcludedProviders.isEmpty() && mFilterString.isEmpty() )
157+
return true;
158+
159+
QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
160+
161+
if ( sourceModel()->data( index, QgsMapLayerModel::EmptyRole ).toBool()
162+
|| sourceModel()->data( index, QgsMapLayerModel::AdditionalRole ).toBool() )
163+
return true;
164+
165+
return acceptsLayer( static_cast<QgsMapLayer *>( index.internalPointer() ) );
166+
}
167+
164168
bool QgsMapLayerProxyModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const
165169
{
166170
// empty row is always first

‎src/core/qgsmaplayerproxymodel.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,13 @@ class CORE_EXPORT QgsMapLayerProxyModel : public QSortFilterProxyModel
162162
*/
163163
QString filterString() const { return mFilterString; }
164164

165+
/**
166+
* Returns TRUE if the proxy model accepts the specified map \a layer.
167+
*
168+
* \since QGIS 3.8
169+
*/
170+
bool acceptsLayer( QgsMapLayer *layer ) const;
171+
165172
bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const override;
166173
bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override;
167174

‎tests/src/python/test_qgsmaplayerproxymodel.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ def testMeshLayer(self):
7272
self.assertEqual(m.rowCount(), 1)
7373
self.assertEqual(m.data(m.index(0, 0)), 'l1')
7474

75+
self.assertTrue(m.acceptsLayer(l1))
76+
self.assertFalse(m.acceptsLayer(l2))
77+
7578
def testFilterGeometryType(self):
7679
""" test filtering by geometry type """
7780
QgsProject.instance().clear()
@@ -93,37 +96,77 @@ def testFilterGeometryType(self):
9396
self.assertEqual(m.rowCount(), 1)
9497
self.assertEqual(m.data(m.index(0, 0)), 'layer 2')
9598

99+
self.assertFalse(m.acceptsLayer(l1))
100+
self.assertTrue(m.acceptsLayer(l2))
101+
self.assertFalse(m.acceptsLayer(l3))
102+
self.assertFalse(m.acceptsLayer(l4))
103+
96104
m.setFilters(QgsMapLayerProxyModel.PointLayer)
97105
self.assertEqual(m.rowCount(), 1)
98106
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
99107

108+
self.assertTrue(m.acceptsLayer(l1))
109+
self.assertFalse(m.acceptsLayer(l2))
110+
self.assertFalse(m.acceptsLayer(l3))
111+
self.assertFalse(m.acceptsLayer(l4))
112+
100113
m.setFilters(QgsMapLayerProxyModel.LineLayer)
101114
self.assertEqual(m.rowCount(), 1)
102115
self.assertEqual(m.data(m.index(0, 0)), 'layer 4')
103116

117+
self.assertFalse(m.acceptsLayer(l1))
118+
self.assertFalse(m.acceptsLayer(l2))
119+
self.assertFalse(m.acceptsLayer(l3))
120+
self.assertTrue(m.acceptsLayer(l4))
121+
104122
m.setFilters(QgsMapLayerProxyModel.NoGeometry)
105123
self.assertEqual(m.rowCount(), 1)
106124
self.assertEqual(m.data(m.index(0, 0)), 'layer 3')
107125

126+
self.assertFalse(m.acceptsLayer(l1))
127+
self.assertFalse(m.acceptsLayer(l2))
128+
self.assertTrue(m.acceptsLayer(l3))
129+
self.assertFalse(m.acceptsLayer(l4))
130+
108131
m.setFilters(QgsMapLayerProxyModel.HasGeometry)
109132
self.assertEqual(m.rowCount(), 3)
110133
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
111134
self.assertEqual(m.data(m.index(1, 0)), 'layer 2')
112135
self.assertEqual(m.data(m.index(2, 0)), 'layer 4')
113136

137+
self.assertTrue(m.acceptsLayer(l1))
138+
self.assertTrue(m.acceptsLayer(l2))
139+
self.assertFalse(m.acceptsLayer(l3))
140+
self.assertTrue(m.acceptsLayer(l4))
141+
114142
m.setFilters(QgsMapLayerProxyModel.VectorLayer)
115143
self.assertEqual(m.rowCount(), 4)
116144
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
117145
self.assertEqual(m.data(m.index(1, 0)), 'layer 2')
118146
self.assertEqual(m.data(m.index(2, 0)), 'layer 3')
119147
self.assertEqual(m.data(m.index(3, 0)), 'layer 4')
120148

149+
self.assertTrue(m.acceptsLayer(l1))
150+
self.assertTrue(m.acceptsLayer(l2))
151+
self.assertTrue(m.acceptsLayer(l3))
152+
self.assertTrue(m.acceptsLayer(l4))
153+
121154
m.setFilters(QgsMapLayerProxyModel.PluginLayer)
122155
self.assertEqual(m.rowCount(), 0)
123156

157+
self.assertFalse(m.acceptsLayer(l1))
158+
self.assertFalse(m.acceptsLayer(l2))
159+
self.assertFalse(m.acceptsLayer(l3))
160+
self.assertFalse(m.acceptsLayer(l4))
161+
124162
m.setFilters(QgsMapLayerProxyModel.RasterLayer)
125163
self.assertEqual(m.rowCount(), 0)
126164

165+
self.assertFalse(m.acceptsLayer(l1))
166+
self.assertFalse(m.acceptsLayer(l2))
167+
self.assertFalse(m.acceptsLayer(l3))
168+
self.assertFalse(m.acceptsLayer(l4))
169+
127170
def testFilterString(self):
128171
""" test filtering by string"""
129172
QgsProject.instance().clear()
@@ -147,6 +190,11 @@ def testFilterString(self):
147190
self.assertEqual(m.data(m.index(1, 0)), 'layer 1')
148191
self.assertEqual(m.data(m.index(2, 0)), 'lAyEr 2')
149192

193+
self.assertTrue(m.acceptsLayer(l1))
194+
self.assertTrue(m.acceptsLayer(l2))
195+
self.assertFalse(m.acceptsLayer(l3))
196+
self.assertTrue(m.acceptsLayer(l4))
197+
150198
m.setFilterString('')
151199
self.assertEqual(m.rowCount(), 4)
152200

@@ -173,32 +221,67 @@ def testFilterByLayer(self):
173221
self.assertEqual(m.data(m.index(2, 0)), 'layer 1')
174222
self.assertEqual(m.data(m.index(3, 0)), 'lAyEr 2')
175223

224+
self.assertTrue(m.acceptsLayer(l1))
225+
self.assertTrue(m.acceptsLayer(l2))
226+
self.assertTrue(m.acceptsLayer(l3))
227+
self.assertTrue(m.acceptsLayer(l4))
228+
176229
m.setExceptedLayerList([l1, l3])
177230
self.assertEqual(m.rowCount(), 2)
178231
self.assertEqual(m.data(m.index(0, 0)), 'final layer')
179232
self.assertEqual(m.data(m.index(1, 0)), 'lAyEr 2')
180233

234+
self.assertFalse(m.acceptsLayer(l1))
235+
self.assertTrue(m.acceptsLayer(l2))
236+
self.assertFalse(m.acceptsLayer(l3))
237+
self.assertTrue(m.acceptsLayer(l4))
238+
181239
m.setExceptedLayerIds([l2.id(), l4.id()])
182240
self.assertEqual(m.rowCount(), 2)
183241
self.assertEqual(m.data(m.index(0, 0)), 'another')
184242
self.assertEqual(m.data(m.index(1, 0)), 'layer 1')
185243

244+
self.assertTrue(m.acceptsLayer(l1))
245+
self.assertFalse(m.acceptsLayer(l2))
246+
self.assertTrue(m.acceptsLayer(l3))
247+
self.assertFalse(m.acceptsLayer(l4))
248+
186249
m.setLayerWhitelist([l1])
187250
self.assertEqual(m.rowCount(), 1)
188251
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
189252

253+
self.assertTrue(m.acceptsLayer(l1))
254+
self.assertFalse(m.acceptsLayer(l2))
255+
self.assertFalse(m.acceptsLayer(l3))
256+
self.assertFalse(m.acceptsLayer(l4))
257+
190258
m.setExceptedLayerIds([])
191259
self.assertEqual(m.rowCount(), 1)
192260
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
193261

262+
self.assertTrue(m.acceptsLayer(l1))
263+
self.assertFalse(m.acceptsLayer(l2))
264+
self.assertFalse(m.acceptsLayer(l3))
265+
self.assertFalse(m.acceptsLayer(l4))
266+
194267
m.setLayerWhitelist([l2, l3])
195268
self.assertEqual(m.rowCount(), 2)
196269
self.assertEqual(m.data(m.index(0, 0)), 'another')
197270
self.assertEqual(m.data(m.index(1, 0)), 'lAyEr 2')
198271

272+
self.assertFalse(m.acceptsLayer(l1))
273+
self.assertTrue(m.acceptsLayer(l2))
274+
self.assertTrue(m.acceptsLayer(l3))
275+
self.assertFalse(m.acceptsLayer(l4))
276+
199277
m.setLayerWhitelist([])
200278
self.assertEqual(m.rowCount(), 4)
201279

280+
self.assertTrue(m.acceptsLayer(l1))
281+
self.assertTrue(m.acceptsLayer(l2))
282+
self.assertTrue(m.acceptsLayer(l3))
283+
self.assertTrue(m.acceptsLayer(l4))
284+
202285

203286
if __name__ == '__main__':
204287
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.