Skip to content

Commit dc3b2cd

Browse files
committedApr 18, 2017
Add some methods for working with lists of map layer references
1 parent eb1e820 commit dc3b2cd

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed
 

‎src/core/qgsmaplayerlistutils.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <QPointer>
1414

1515
#include "qgsmaplayer.h"
16+
#include "qgsmaplayerref.h"
1617

1718
/// @cond PRIVATE
1819

@@ -39,6 +40,40 @@ inline QgsWeakMapLayerPointerList _qgis_listRawToQPointer( const QList<QgsMapLay
3940
return lst;
4041
}
4142

43+
inline QList<QgsMapLayer *> _qgis_listRefToRaw( const QList< QgsMapLayerRef > &layers )
44+
{
45+
QList<QgsMapLayer *> lst;
46+
lst.reserve( layers.count() );
47+
Q_FOREACH ( const QgsMapLayerRef &layer, layers )
48+
{
49+
if ( layer )
50+
lst.append( &layer );
51+
}
52+
return lst;
53+
}
54+
55+
inline QList< QgsMapLayerRef > _qgis_listRawToRef( const QList<QgsMapLayer *> &layers )
56+
{
57+
QList< QgsMapLayerRef > lst;
58+
lst.reserve( layers.count() );
59+
Q_FOREACH ( QgsMapLayer *layer, layers )
60+
{
61+
lst.append( QgsMapLayerRef( layer ) );
62+
}
63+
return lst;
64+
}
65+
66+
inline void _qgis_removeLayers( QList< QgsMapLayerRef > &list, QList< QgsMapLayer *> layersToRemove )
67+
{
68+
QMutableListIterator<QgsMapLayerRef> it( list );
69+
while ( it.hasNext() )
70+
{
71+
QgsMapLayerRef &ref = it.next();
72+
if ( layersToRemove.contains( &ref ) )
73+
it.remove();
74+
}
75+
}
76+
4277
inline QStringList _qgis_listQPointerToIDs( const QgsWeakMapLayerPointerList &layers )
4378
{
4479
QStringList lst;

‎tests/src/core/testqgsmaplayer.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <qgsapplication.h>
2727
#include <qgsproviderregistry.h>
2828
#include "qgsvectorlayerref.h"
29+
#include "qgsmaplayerlistutils.h"
2930

3031
class TestSignalReceiver : public QObject
3132
{
@@ -70,6 +71,7 @@ class TestQgsMapLayer : public QObject
7071
void isInScaleRange();
7172

7273
void layerRef();
74+
void layerRefListUtils();
7375

7476

7577
private:
@@ -228,5 +230,34 @@ void TestQgsMapLayer::layerRef()
228230
QVERIFY( !ref5.resolveWeakly( QgsProject::instance() ) );
229231
}
230232

233+
void TestQgsMapLayer::layerRefListUtils()
234+
{
235+
// conversion utils
236+
QgsVectorLayer *vlA = new QgsVectorLayer( "Point", "a", "memory" );
237+
QgsVectorLayer *vlB = new QgsVectorLayer( "Point", "b", "memory" );
238+
239+
QList<QgsMapLayer *> listRawSource;
240+
listRawSource << vlA << vlB;
241+
242+
QList< QgsMapLayerRef > refs = _qgis_listRawToRef( listRawSource );
243+
QCOMPARE( &refs.at( 0 ), vlA );
244+
QCOMPARE( &refs.at( 1 ), vlB );
245+
246+
QList<QgsMapLayer *> raw = _qgis_listRefToRaw( refs );
247+
QCOMPARE( raw, QList< QgsMapLayer *>() << vlA << vlB );
248+
249+
//remove layers
250+
QgsVectorLayer *vlC = new QgsVectorLayer( "Point", "c", "memory" );
251+
QgsVectorLayer *vlD = new QgsVectorLayer( "Point", "d", "memory" );
252+
refs << QgsMapLayerRef( vlC ) << QgsMapLayerRef( vlD );
253+
254+
_qgis_removeLayers( refs, QList< QgsMapLayer *>() << vlB << vlD );
255+
QCOMPARE( refs.size(), 2 );
256+
QCOMPARE( &refs.at( 0 ), vlA );
257+
QCOMPARE( &refs.at( 1 ), vlC );
258+
259+
260+
}
261+
231262
QGSTEST_MAIN( TestQgsMapLayer )
232263
#include "testqgsmaplayer.moc"

0 commit comments

Comments
 (0)
Please sign in to comment.