Skip to content

Commit 5c5f2ed

Browse files
committedNov 1, 2018
Add method to get QgsLayerItem::LayerType from a map layer
1 parent f65c845 commit 5c5f2ed

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed
 

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,13 @@ Item that represents a layer that can be opened with one of the providers
433433
QgsMapLayer::LayerType mapLayerType() const;
434434
%Docstring
435435
Returns QgsMapLayer.LayerType
436+
%End
437+
438+
static LayerType typeFromMapLayer( QgsMapLayer *layer );
439+
%Docstring
440+
Returns the layer item type corresponding to a :py:class:`QgsMapLayer` ``layer``.
441+
442+
.. versionadded:: 3.6
436443
%End
437444

438445
QString uri() const;

‎src/core/qgsdataitem.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include "qgssettings.h"
4646
#include "qgsanimatedicon.h"
4747
#include "qgsproject.h"
48+
#include "qgsvectorlayer.h"
4849

4950
// use GDAL VSI mechanism
5051
#define CPL_SUPRESS_CPLUSPLUS //#spellok
@@ -636,6 +637,43 @@ QgsMapLayer::LayerType QgsLayerItem::mapLayerType() const
636637
return QgsMapLayer::VectorLayer; // no warnings
637638
}
638639

640+
QgsLayerItem::LayerType QgsLayerItem::typeFromMapLayer( QgsMapLayer *layer )
641+
{
642+
switch ( layer->type() )
643+
{
644+
case QgsMapLayer::VectorLayer:
645+
{
646+
switch ( qobject_cast< QgsVectorLayer * >( layer )->geometryType() )
647+
{
648+
case QgsWkbTypes::PointGeometry:
649+
return Point;
650+
651+
case QgsWkbTypes::LineGeometry:
652+
return Line;
653+
654+
case QgsWkbTypes::PolygonGeometry:
655+
return Polygon;
656+
657+
case QgsWkbTypes::NullGeometry:
658+
return TableLayer;
659+
660+
case QgsWkbTypes::UnknownGeometry:
661+
return Vector;
662+
}
663+
664+
return Vector; // no warnings
665+
}
666+
667+
case QgsMapLayer::RasterLayer:
668+
return Raster;
669+
case QgsMapLayer::PluginLayer:
670+
return Plugin;
671+
case QgsMapLayer::MeshLayer:
672+
return Mesh;
673+
}
674+
return Vector; // no warnings
675+
}
676+
639677
QString QgsLayerItem::layerTypeAsString( QgsLayerItem::LayerType layerType )
640678
{
641679
static int enumIdx = staticMetaObject.indexOfEnumerator( "LayerType" );

‎src/core/qgsdataitem.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,12 @@ class CORE_EXPORT QgsLayerItem : public QgsDataItem
463463
//! Returns QgsMapLayer::LayerType
464464
QgsMapLayer::LayerType mapLayerType() const;
465465

466+
/**
467+
* Returns the layer item type corresponding to a QgsMapLayer \a layer.
468+
* \since QGIS 3.6
469+
*/
470+
static LayerType typeFromMapLayer( QgsMapLayer *layer );
471+
466472
//! Returns layer uri or empty string if layer cannot be created
467473
QString uri() const { return mUri; }
468474

‎tests/src/core/testqgsdataitem.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
//qgis includes...
2222
#include "qgsdataitem.h"
2323
#include "qgsvectorlayer.h"
24+
#include "qgsrasterlayer.h"
25+
#include "qgsmeshlayer.h"
2426
#include "qgsapplication.h"
2527
#include "qgslogger.h"
2628
#include "qgssettings.h"
@@ -44,10 +46,12 @@ class TestQgsDataItem : public QObject
4446

4547
void testValid();
4648
void testDirItemChildren();
49+
void testLayerItemType();
4750

4851
private:
4952
QgsDirectoryItem *mDirItem = nullptr;
5053
QString mScanItemsSetting;
54+
QString mTestDataDir;
5155
bool isValidDirItem( QgsDirectoryItem *item );
5256
};
5357

@@ -63,6 +67,9 @@ void TestQgsDataItem::initTestCase()
6367
QgsApplication::initQgis();
6468
QgsApplication::showSettings();
6569

70+
QString dataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt
71+
mTestDataDir = dataDir + '/';
72+
6673
// Set up the QgsSettings environment
6774
QCoreApplication::setOrganizationName( QStringLiteral( "QGIS" ) );
6875
QCoreApplication::setOrganizationDomain( QStringLiteral( "qgis.org" ) );
@@ -176,5 +183,44 @@ void TestQgsDataItem::testDirItemChildren()
176183
}
177184
}
178185

186+
void TestQgsDataItem::testLayerItemType()
187+
{
188+
std::unique_ptr< QgsMapLayer > layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "polys.shp",
189+
QString(), QStringLiteral( "ogr" ) );
190+
QVERIFY( layer->isValid() );
191+
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Polygon );
192+
193+
layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "points.shp",
194+
QString(), QStringLiteral( "ogr" ) );
195+
QVERIFY( layer->isValid() );
196+
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Point );
197+
198+
layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "lines.shp",
199+
QString(), QStringLiteral( "ogr" ) );
200+
QVERIFY( layer->isValid() );
201+
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Line );
202+
203+
layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "nonspatial.dbf",
204+
QString(), QStringLiteral( "ogr" ) );
205+
QVERIFY( layer->isValid() );
206+
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::TableLayer );
207+
208+
layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "invalid.dbf",
209+
QString(), QStringLiteral( "ogr" ) );
210+
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Vector );
211+
212+
layer = qgis::make_unique< QgsRasterLayer >( mTestDataDir + "rgb256x256.png",
213+
QString(), QStringLiteral( "gdal" ) );
214+
QVERIFY( layer->isValid() );
215+
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Raster );
216+
217+
layer = qgis::make_unique< QgsMeshLayer >( mTestDataDir + "mesh/quad_and_triangle.2dm",
218+
QString(), QStringLiteral( "mdal" ) );
219+
QVERIFY( layer->isValid() );
220+
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Mesh );
221+
222+
223+
}
224+
179225
QGSTEST_MAIN( TestQgsDataItem )
180226
#include "testqgsdataitem.moc"

0 commit comments

Comments
 (0)
Please sign in to comment.