Minor refactor of QgsMapLayerProxyModel

This commit is contained in:
Nyall Dawson 2019-06-12 12:48:40 +10:00
parent 760af67d0f
commit d56ddc25fb
4 changed files with 118 additions and 17 deletions

View File

@ -160,6 +160,13 @@ Returns the current filter string, if set.
.. seealso:: :py:func:`setFilterString`
.. versionadded:: 3.4
%End
bool acceptsLayer( QgsMapLayer *layer ) const;
%Docstring
Returns ``True`` if the proxy model accepts the specified map ``layer``.
.. versionadded:: 3.8
%End
virtual bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const;

View File

@ -92,24 +92,8 @@ void QgsMapLayerProxyModel::setExcludedProviders( const QStringList &providers )
invalidateFilter();
}
void QgsMapLayerProxyModel::setFilterString( const QString &filter )
bool QgsMapLayerProxyModel::acceptsLayer( QgsMapLayer *layer ) const
{
mFilterString = filter;
invalidateFilter();
}
bool QgsMapLayerProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
{
if ( mFilters.testFlag( All ) && mExceptList.isEmpty() && mLayerWhitelist.isEmpty() && mExcludedProviders.isEmpty() && mFilterString.isEmpty() )
return true;
QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
if ( sourceModel()->data( index, QgsMapLayerModel::EmptyRole ).toBool()
|| sourceModel()->data( index, QgsMapLayerModel::AdditionalRole ).toBool() )
return true;
QgsMapLayer *layer = static_cast<QgsMapLayer *>( index.internalPointer() );
if ( !layer )
return false;
@ -161,6 +145,26 @@ bool QgsMapLayerProxyModel::filterAcceptsRow( int source_row, const QModelIndex
return false;
}
void QgsMapLayerProxyModel::setFilterString( const QString &filter )
{
mFilterString = filter;
invalidateFilter();
}
bool QgsMapLayerProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
{
if ( mFilters.testFlag( All ) && mExceptList.isEmpty() && mLayerWhitelist.isEmpty() && mExcludedProviders.isEmpty() && mFilterString.isEmpty() )
return true;
QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
if ( sourceModel()->data( index, QgsMapLayerModel::EmptyRole ).toBool()
|| sourceModel()->data( index, QgsMapLayerModel::AdditionalRole ).toBool() )
return true;
return acceptsLayer( static_cast<QgsMapLayer *>( index.internalPointer() ) );
}
bool QgsMapLayerProxyModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const
{
// empty row is always first

View File

@ -162,6 +162,13 @@ class CORE_EXPORT QgsMapLayerProxyModel : public QSortFilterProxyModel
*/
QString filterString() const { return mFilterString; }
/**
* Returns TRUE if the proxy model accepts the specified map \a layer.
*
* \since QGIS 3.8
*/
bool acceptsLayer( QgsMapLayer *layer ) const;
bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const override;
bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override;

View File

@ -72,6 +72,9 @@ class TestQgsMapLayerProxyModel(unittest.TestCase):
self.assertEqual(m.rowCount(), 1)
self.assertEqual(m.data(m.index(0, 0)), 'l1')
self.assertTrue(m.acceptsLayer(l1))
self.assertFalse(m.acceptsLayer(l2))
def testFilterGeometryType(self):
""" test filtering by geometry type """
QgsProject.instance().clear()
@ -93,24 +96,49 @@ class TestQgsMapLayerProxyModel(unittest.TestCase):
self.assertEqual(m.rowCount(), 1)
self.assertEqual(m.data(m.index(0, 0)), 'layer 2')
self.assertFalse(m.acceptsLayer(l1))
self.assertTrue(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertFalse(m.acceptsLayer(l4))
m.setFilters(QgsMapLayerProxyModel.PointLayer)
self.assertEqual(m.rowCount(), 1)
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
self.assertTrue(m.acceptsLayer(l1))
self.assertFalse(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertFalse(m.acceptsLayer(l4))
m.setFilters(QgsMapLayerProxyModel.LineLayer)
self.assertEqual(m.rowCount(), 1)
self.assertEqual(m.data(m.index(0, 0)), 'layer 4')
self.assertFalse(m.acceptsLayer(l1))
self.assertFalse(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertTrue(m.acceptsLayer(l4))
m.setFilters(QgsMapLayerProxyModel.NoGeometry)
self.assertEqual(m.rowCount(), 1)
self.assertEqual(m.data(m.index(0, 0)), 'layer 3')
self.assertFalse(m.acceptsLayer(l1))
self.assertFalse(m.acceptsLayer(l2))
self.assertTrue(m.acceptsLayer(l3))
self.assertFalse(m.acceptsLayer(l4))
m.setFilters(QgsMapLayerProxyModel.HasGeometry)
self.assertEqual(m.rowCount(), 3)
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
self.assertEqual(m.data(m.index(1, 0)), 'layer 2')
self.assertEqual(m.data(m.index(2, 0)), 'layer 4')
self.assertTrue(m.acceptsLayer(l1))
self.assertTrue(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertTrue(m.acceptsLayer(l4))
m.setFilters(QgsMapLayerProxyModel.VectorLayer)
self.assertEqual(m.rowCount(), 4)
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
@ -118,12 +146,27 @@ class TestQgsMapLayerProxyModel(unittest.TestCase):
self.assertEqual(m.data(m.index(2, 0)), 'layer 3')
self.assertEqual(m.data(m.index(3, 0)), 'layer 4')
self.assertTrue(m.acceptsLayer(l1))
self.assertTrue(m.acceptsLayer(l2))
self.assertTrue(m.acceptsLayer(l3))
self.assertTrue(m.acceptsLayer(l4))
m.setFilters(QgsMapLayerProxyModel.PluginLayer)
self.assertEqual(m.rowCount(), 0)
self.assertFalse(m.acceptsLayer(l1))
self.assertFalse(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertFalse(m.acceptsLayer(l4))
m.setFilters(QgsMapLayerProxyModel.RasterLayer)
self.assertEqual(m.rowCount(), 0)
self.assertFalse(m.acceptsLayer(l1))
self.assertFalse(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertFalse(m.acceptsLayer(l4))
def testFilterString(self):
""" test filtering by string"""
QgsProject.instance().clear()
@ -147,6 +190,11 @@ class TestQgsMapLayerProxyModel(unittest.TestCase):
self.assertEqual(m.data(m.index(1, 0)), 'layer 1')
self.assertEqual(m.data(m.index(2, 0)), 'lAyEr 2')
self.assertTrue(m.acceptsLayer(l1))
self.assertTrue(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertTrue(m.acceptsLayer(l4))
m.setFilterString('')
self.assertEqual(m.rowCount(), 4)
@ -173,32 +221,67 @@ class TestQgsMapLayerProxyModel(unittest.TestCase):
self.assertEqual(m.data(m.index(2, 0)), 'layer 1')
self.assertEqual(m.data(m.index(3, 0)), 'lAyEr 2')
self.assertTrue(m.acceptsLayer(l1))
self.assertTrue(m.acceptsLayer(l2))
self.assertTrue(m.acceptsLayer(l3))
self.assertTrue(m.acceptsLayer(l4))
m.setExceptedLayerList([l1, l3])
self.assertEqual(m.rowCount(), 2)
self.assertEqual(m.data(m.index(0, 0)), 'final layer')
self.assertEqual(m.data(m.index(1, 0)), 'lAyEr 2')
self.assertFalse(m.acceptsLayer(l1))
self.assertTrue(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertTrue(m.acceptsLayer(l4))
m.setExceptedLayerIds([l2.id(), l4.id()])
self.assertEqual(m.rowCount(), 2)
self.assertEqual(m.data(m.index(0, 0)), 'another')
self.assertEqual(m.data(m.index(1, 0)), 'layer 1')
self.assertTrue(m.acceptsLayer(l1))
self.assertFalse(m.acceptsLayer(l2))
self.assertTrue(m.acceptsLayer(l3))
self.assertFalse(m.acceptsLayer(l4))
m.setLayerWhitelist([l1])
self.assertEqual(m.rowCount(), 1)
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
self.assertTrue(m.acceptsLayer(l1))
self.assertFalse(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertFalse(m.acceptsLayer(l4))
m.setExceptedLayerIds([])
self.assertEqual(m.rowCount(), 1)
self.assertEqual(m.data(m.index(0, 0)), 'layer 1')
self.assertTrue(m.acceptsLayer(l1))
self.assertFalse(m.acceptsLayer(l2))
self.assertFalse(m.acceptsLayer(l3))
self.assertFalse(m.acceptsLayer(l4))
m.setLayerWhitelist([l2, l3])
self.assertEqual(m.rowCount(), 2)
self.assertEqual(m.data(m.index(0, 0)), 'another')
self.assertEqual(m.data(m.index(1, 0)), 'lAyEr 2')
self.assertFalse(m.acceptsLayer(l1))
self.assertTrue(m.acceptsLayer(l2))
self.assertTrue(m.acceptsLayer(l3))
self.assertFalse(m.acceptsLayer(l4))
m.setLayerWhitelist([])
self.assertEqual(m.rowCount(), 4)
self.assertTrue(m.acceptsLayer(l1))
self.assertTrue(m.acceptsLayer(l2))
self.assertTrue(m.acceptsLayer(l3))
self.assertTrue(m.acceptsLayer(l4))
if __name__ == '__main__':
unittest.main()