Skip to content

Commit

Permalink
Add method to get QgsLayerItem::LayerType from a map layer
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Nov 1, 2018
1 parent f65c845 commit 5c5f2ed
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 0 deletions.
7 changes: 7 additions & 0 deletions python/core/auto_generated/qgsdataitem.sip.in
Expand Up @@ -433,6 +433,13 @@ Item that represents a layer that can be opened with one of the providers
QgsMapLayer::LayerType mapLayerType() const;
%Docstring
Returns QgsMapLayer.LayerType
%End

static LayerType typeFromMapLayer( QgsMapLayer *layer );
%Docstring
Returns the layer item type corresponding to a :py:class:`QgsMapLayer` ``layer``.

.. versionadded:: 3.6
%End

QString uri() const;
Expand Down
38 changes: 38 additions & 0 deletions src/core/qgsdataitem.cpp
Expand Up @@ -45,6 +45,7 @@
#include "qgssettings.h"
#include "qgsanimatedicon.h"
#include "qgsproject.h"
#include "qgsvectorlayer.h"

// use GDAL VSI mechanism
#define CPL_SUPRESS_CPLUSPLUS //#spellok
Expand Down Expand Up @@ -636,6 +637,43 @@ QgsMapLayer::LayerType QgsLayerItem::mapLayerType() const
return QgsMapLayer::VectorLayer; // no warnings
}

QgsLayerItem::LayerType QgsLayerItem::typeFromMapLayer( QgsMapLayer *layer )
{
switch ( layer->type() )
{
case QgsMapLayer::VectorLayer:
{
switch ( qobject_cast< QgsVectorLayer * >( layer )->geometryType() )
{
case QgsWkbTypes::PointGeometry:
return Point;

case QgsWkbTypes::LineGeometry:
return Line;

case QgsWkbTypes::PolygonGeometry:
return Polygon;

case QgsWkbTypes::NullGeometry:
return TableLayer;

case QgsWkbTypes::UnknownGeometry:
return Vector;
}

return Vector; // no warnings
}

case QgsMapLayer::RasterLayer:
return Raster;
case QgsMapLayer::PluginLayer:
return Plugin;
case QgsMapLayer::MeshLayer:
return Mesh;
}
return Vector; // no warnings
}

QString QgsLayerItem::layerTypeAsString( QgsLayerItem::LayerType layerType )
{
static int enumIdx = staticMetaObject.indexOfEnumerator( "LayerType" );
Expand Down
6 changes: 6 additions & 0 deletions src/core/qgsdataitem.h
Expand Up @@ -463,6 +463,12 @@ class CORE_EXPORT QgsLayerItem : public QgsDataItem
//! Returns QgsMapLayer::LayerType
QgsMapLayer::LayerType mapLayerType() const;

/**
* Returns the layer item type corresponding to a QgsMapLayer \a layer.
* \since QGIS 3.6
*/
static LayerType typeFromMapLayer( QgsMapLayer *layer );

//! Returns layer uri or empty string if layer cannot be created
QString uri() const { return mUri; }

Expand Down
46 changes: 46 additions & 0 deletions tests/src/core/testqgsdataitem.cpp
Expand Up @@ -21,6 +21,8 @@
//qgis includes...
#include "qgsdataitem.h"
#include "qgsvectorlayer.h"
#include "qgsrasterlayer.h"
#include "qgsmeshlayer.h"
#include "qgsapplication.h"
#include "qgslogger.h"
#include "qgssettings.h"
Expand All @@ -44,10 +46,12 @@ class TestQgsDataItem : public QObject

void testValid();
void testDirItemChildren();
void testLayerItemType();

private:
QgsDirectoryItem *mDirItem = nullptr;
QString mScanItemsSetting;
QString mTestDataDir;
bool isValidDirItem( QgsDirectoryItem *item );
};

Expand All @@ -63,6 +67,9 @@ void TestQgsDataItem::initTestCase()
QgsApplication::initQgis();
QgsApplication::showSettings();

QString dataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt
mTestDataDir = dataDir + '/';

// Set up the QgsSettings environment
QCoreApplication::setOrganizationName( QStringLiteral( "QGIS" ) );
QCoreApplication::setOrganizationDomain( QStringLiteral( "qgis.org" ) );
Expand Down Expand Up @@ -176,5 +183,44 @@ void TestQgsDataItem::testDirItemChildren()
}
}

void TestQgsDataItem::testLayerItemType()
{
std::unique_ptr< QgsMapLayer > layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "polys.shp",
QString(), QStringLiteral( "ogr" ) );
QVERIFY( layer->isValid() );
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Polygon );

layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "points.shp",
QString(), QStringLiteral( "ogr" ) );
QVERIFY( layer->isValid() );
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Point );

layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "lines.shp",
QString(), QStringLiteral( "ogr" ) );
QVERIFY( layer->isValid() );
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Line );

layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "nonspatial.dbf",
QString(), QStringLiteral( "ogr" ) );
QVERIFY( layer->isValid() );
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::TableLayer );

layer = qgis::make_unique< QgsVectorLayer >( mTestDataDir + "invalid.dbf",
QString(), QStringLiteral( "ogr" ) );
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Vector );

layer = qgis::make_unique< QgsRasterLayer >( mTestDataDir + "rgb256x256.png",
QString(), QStringLiteral( "gdal" ) );
QVERIFY( layer->isValid() );
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Raster );

layer = qgis::make_unique< QgsMeshLayer >( mTestDataDir + "mesh/quad_and_triangle.2dm",
QString(), QStringLiteral( "mdal" ) );
QVERIFY( layer->isValid() );
QCOMPARE( QgsLayerItem::typeFromMapLayer( layer.get() ), QgsLayerItem::Mesh );


}

QGSTEST_MAIN( TestQgsDataItem )
#include "testqgsdataitem.moc"

0 comments on commit 5c5f2ed

Please sign in to comment.