21#include "qgsogrproviderutils.h"
23#include "qgsgeopackagedataitems.h"
39 :
QgsLayerItem( parent, name, filePath.isEmpty() ? details.uri() : filePath, details.uri(), layerTypeFromSublayer( details ), details.providerKey() )
55 if ( mDetails.
driverName() == QLatin1String(
"SQLite" ) )
58 path() + QStringLiteral(
"/columns/ " ),
59 QStringLiteral( R
"(dbname="%1")" ).arg( parent()->path().replace( '"', QLatin1String( R
"(\")" ) ) ),
60 QStringLiteral( "spatialite" ), QString(),
name() ) );
62 else if ( mDetails.
providerKey() == QLatin1String(
"ogr" ) )
67 path() + QStringLiteral(
"/columns/ " ),
69 QStringLiteral(
"ogr" ), QString(),
name() ) );
74 QString relationError;
75 QList< QgsWeakRelation > relations;
78 relations = conn->relationships( QString(), mDetails.
name() );
82 relationError = ex.
what();
85 if ( !relations.empty() || !relationError.isEmpty() )
87 std::unique_ptr< QgsRelationshipsItem > relationsItem = std::make_unique< QgsRelationshipsItem >(
this,
mPath +
"/relations", conn->uri(), QStringLiteral(
"ogr" ), QString(), mDetails.
name() );
89 relationsItem->setSortKey( QString( QChar( 0x11FFFF ) ) );
90 children.append( relationsItem.release() );
111 if ( mDetails.
providerKey() == QLatin1String(
"ogr" ) )
116 parts.insert( QStringLiteral(
"path" ),
path() );
126 switch ( sublayer.
type() )
177 return mDetails.
name();
187 mIconName = QStringLiteral(
"mIconDbSchema.svg" );
192 mSublayers.append( sublayer );
203 res.reserve( mSublayers.size() );
218 , mSublayers( sublayers )
227 mIconName = QStringLiteral(
"/mIconZip.svg" );
233 QList< QgsProviderSublayerDetails> sublayers;
235 || mSublayers.empty() )
241 sublayers = mSublayers;
250 children.reserve( sublayers.size() );
251 QMap< QStringList, QgsFileDataCollectionGroupItem * > groupItems;
256 if ( !sublayer.
path().isEmpty() )
258 QStringList currentPath;
259 QStringList remainingPaths = sublayer.
path();
262 while ( !remainingPaths.empty() )
264 currentPath << remainingPaths.takeAt( 0 );
266 auto it = groupItems.constFind( currentPath );
267 if ( it == groupItems.constEnd() )
271 groupItems.insert( currentPath, newGroupItem );
276 groupItem = newGroupItem;
280 groupItem = it.value();
299 mCachedCapabilities = conn->capabilities();
300 mCachedCapabilities2 = conn->capabilities2();
301 mHasCachedCapabilities =
true;
306 QStringList fieldDomains;
309 fieldDomains = conn->fieldDomainNames();
313 domainError = ex.
what();
316 if ( !fieldDomains.empty() || !domainError.isEmpty() )
318 std::unique_ptr< QgsFieldDomainsItem > domainsItem = std::make_unique< QgsFieldDomainsItem >(
this,
mPath +
"/domains", conn->uri(), QStringLiteral(
"ogr" ) );
320 domainsItem->setSortKey( QString( QChar( 0x10FFFF ) ) );
321 children.append( domainsItem.release() );
326 QString relationError;
327 QList< QgsWeakRelation > relations;
330 relations = conn->relationships();
334 relationError = ex.
what();
337 if ( !relations.empty() || !relationError.isEmpty() )
339 std::unique_ptr< QgsRelationshipsItem > relationsItem = std::make_unique< QgsRelationshipsItem >(
this,
mPath +
"/relations", conn->uri(), QStringLiteral(
"ogr" ) );
341 relationsItem->setSortKey( QString( QChar( 0x11FFFF ) ) );
342 children.append( relationsItem.release() );
358 if ( mHasCachedCapabilities )
361 if ( mHasCachedDropSupport )
362 return mCachedSupportsDrop;
367 mHasCachedDropSupport =
true;
368 if ( !QFileInfo(
path() ).isWritable() )
370 mCachedSupportsDrop =
false;
371 return mCachedSupportsDrop;
374 GDALDriverH hDriver = GDALIdentifyDriverEx(
path().toUtf8().constData(), GDAL_OF_VECTOR,
nullptr,
nullptr );
377 mCachedSupportsDrop =
false;
378 return mCachedSupportsDrop;
382 const QString driverName = GDALGetDriverShortName( hDriver );
383 if ( driverName == QLatin1String(
"PDF" )
384 || driverName == QLatin1String(
"DXF" ) )
386 mCachedSupportsDrop =
false;
387 return mCachedSupportsDrop;
391#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,4,0)
392 const bool isSingleTableDriver = GDALGetMetadataItem( hDriver, GDAL_DCAP_MULTIPLE_VECTOR_LAYERS,
nullptr ) ==
nullptr;
394 const QFileInfo pathInfo(
path() );
395 const QString suffix = pathInfo.suffix().toLower();
399 if ( isSingleTableDriver )
401 mCachedSupportsDrop =
false;
402 return mCachedSupportsDrop;
406 mCachedSupportsDrop =
true;
407 return mCachedSupportsDrop;
414 collectionUri.
layerType = QStringLiteral(
"collection" );
416 return { collectionUri };
422 if ( OGRGetDriverCount() == 0 )
427 CPLPushErrorHandler( CPLQuietErrorHandler );
429 GDALDriverH hDriver = GDALIdentifyDriverEx(
path().toUtf8().constData(), GDAL_OF_VECTOR,
nullptr,
nullptr );
430 CPLPopErrorHandler();
434 QgsDebugMsgLevel( QStringLiteral(
"GDALIdentifyDriverEx error # %1 : %2 on %3" ).arg( CPLGetLastErrorNo() ).arg( CPLGetLastErrorMsg() ).arg(
path() ), 2 );
438 const QString driverName = GDALGetDriverShortName( hDriver );
439 if ( driverName == QLatin1String(
"PDF" )
440 || driverName == QLatin1String(
"DXF" ) )
448 if ( driverName == QLatin1String(
"SQLite" ) )
464 parts.insert( QStringLiteral(
"path" ),
path() );
473 mHasCachedCapabilities =
true;
481 if ( mHasCachedCapabilities )
482 return mCachedCapabilities;
487 mCachedCapabilities = conn->capabilities();
488 mCachedCapabilities2 = conn->capabilities2();
489 mHasCachedCapabilities =
true;
491 return mCachedCapabilities;
496 if ( mHasCachedCapabilities )
497 return mCachedCapabilities2;
502 mCachedCapabilities = conn->capabilities();
503 mCachedCapabilities2 = conn->capabilities2();
504 mHasCachedCapabilities =
true;
506 return mCachedCapabilities2;
515 return QStringLiteral(
"files" );
525 if ( path.isEmpty() )
528 const QFileInfo info( path );
529 QString suffix = info.suffix().toLower();
530 const QString
name = info.fileName();
533 if ( suffix.compare( QLatin1String(
"gpkg" ), Qt::CaseInsensitive ) == 0 )
536 QgsGeoPackageCollectionItem *item =
new QgsGeoPackageCollectionItem( parentItem,
name, path );
540 else if ( suffix == QLatin1String(
"txt" ) )
548 else if ( suffix == QLatin1String(
"map" ) || suffix == QLatin1String(
"dat" ) )
550 if ( QFile::exists( QDir( info.path() ).filePath( info.baseName() +
".tab" ) ) || QFile::exists( QDir( info.path() ).filePath( info.baseName() +
".TAB" ) ) )
554 else if ( suffix == QLatin1String(
"dbf" ) || suffix == QLatin1String(
"shx" ) )
556 if ( QFile::exists( QDir( info.path() ).filePath( info.baseName() +
".shp" ) ) || QFile::exists( QDir( info.path() ).filePath( info.baseName() +
".SHP" ) ) )
565 else if ( path.endsWith( QLatin1String(
".shp.zip" ), Qt::CaseInsensitive ) &&
566 GDALIdentifyDriverEx( path.toUtf8().constData(), GDAL_OF_VECTOR,
nullptr,
nullptr ) )
568 suffix = QStringLiteral(
"shp.zip" );
577 Qgis::SublayerQueryFlags queryFlags = Qgis::SublayerQueryFlags();
580 if ( ( settings.
value( QStringLiteral(
"qgis/scanItemsInBrowser2" ),
581 "extension" ).toString() == QLatin1String(
"extension" ) ) ||
582 ( parentItem && settings.
value( QStringLiteral(
"qgis/scanItemsFastScanUris" ),
583 QStringList() ).toStringList().contains( parentItem->
path() ) ) )
590 if ( sublayers.size() == 1
599 else if ( !sublayers.empty() )
613 QFileInfo info( path );
614 QString suffix = info.suffix().toLower();
616 QStringList dirExtensions = QgsOgrProviderUtils::directoryExtensions();
617 return dirExtensions.contains( suffix );
@ NotPopulated
Children not yet created.
@ Populated
Children created.
@ Fertile
Can create children. Even items without this capability may have children, but cannot create them,...
@ RefreshChildrenWhenItemIsRefreshed
When the item is refreshed, all its populated children will also be refreshed in turn (since QGIS 3....
@ ItemRepresentsFile
Item's path() directly represents a file on disk (since QGIS 3.22)
@ Fast
CreateChildren() is fast enough to be run in main thread when refreshing items, most root items (wms,...
@ FastScan
Indicates that the provider must scan for sublayers using the fastest possible approach – e....
@ ResolveGeometryType
Attempt to resolve the geometry type for vector sublayers.
BrowserLayerType
Browser item layer types.
@ Point
Vector point layer.
@ Plugin
Plugin based layer.
@ TiledScene
Tiled scene layer (since QGIS 3.34)
@ Polygon
Vector polygon layer.
@ Vector
Generic vector layer.
@ VectorTile
Vector tile layer.
@ TableLayer
Vector non-spatial layer.
@ PointCloud
Point cloud layer.
@ Group
Composite group layer. Added in QGIS 3.24.
@ Plugin
Plugin based layer.
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
The QgsAbstractDatabaseProviderConnection class provides common functionality for DB based connection...
Qgis::DatabaseProviderConnectionCapabilities2 capabilities2() const
Returns extended connection capabilities.
@ CreateVectorTable
Can CREATE a vector (or aspatial) table/layer.
@ RetrieveRelationships
Can retrieve relationships from the database (since QGIS 3.28)
@ ListFieldDomains
Can return a list of field domain names via fieldDomainNames() (since QGIS 3.26)
Capabilities capabilities() const
Returns connection capabilities.
A Collection: logical collection of layers or subcollections, e.g.
Base class for all items in the model.
QVector< QgsDataItem * > children() const
Qgis::BrowserItemCapabilities mCapabilities
QString name() const
Returns the name of the item (the displayed text for the item).
virtual void setState(Qgis::BrowserItemState state)
Set item state.
virtual void setCapabilities(Qgis::BrowserItemCapabilities capabilities)
Sets the capabilities for the data item.
virtual void addChildItem(QgsDataItem *child, bool refresh=false)
Inserts a new child item.
QgsDataItem * parent() const
Gets item parent.
virtual Qgis::BrowserItemCapabilities capabilities2() const
Returns the capabilities for the data item.
Class for storing the component parts of a RDBMS data source URI (e.g.
QString uri(bool expandAuthConfig=true) const
Returns the complete URI as a string.
void setDatabase(const QString &database)
Sets the URI database name.
A collection of field items with some internal logic to retrieve the fields and a the vector layer in...
QString name() override
Human-readable name of the provider name.
int capabilities() const override
Returns combination of flags from QgsDataProvider::DataCapabilities.
bool handlesDirectoryPath(const QString &path) override
Returns true if the provider will handle the directory at the specified path.
QgsDataItem * createDataItem(const QString &path, QgsDataItem *parentItem) override
Create a new instance of QgsDataItem (or nullptr) for given path and parent item.
A data collection item for grouping of the content in file based data collections (e....
QgsFileDataCollectionGroupItem(QgsDataItem *parent, const QString &groupName, const QString &path)
Constructor for QgsFileDataCollectionGroupItem.
void appendSublayer(const QgsProviderSublayerDetails &sublayer)
Adds a sublayer to the group.
QgsMimeDataUtils::UriList mimeUris() const override
Returns mime URIs for the data item, most data providers will only return a single URI but some data ...
bool hasDragEnabled() const override
Returns true if the item may be dragged.
A data collection item for file based data collections (e.g.
bool hasDragEnabled() const override
Returns true if the item may be dragged.
QVector< QgsDataItem * > createChildren() override
Create children.
QgsAbstractDatabaseProviderConnection::Capabilities databaseConnectionCapabilities() const
Returns the associated connection capabilities, if a databaseConnection() is available.
QgsMimeDataUtils::UriList mimeUris() const override
Returns mime URIs for the data item, most data providers will only return a single URI but some data ...
bool canAddVectorLayers() const
Returns true if the file is likely to support addition of vector layers.
QgsAbstractDatabaseProviderConnection * databaseConnection() const override
For data items that represent a DB connection or one of its children, this method returns a connectio...
QgsFileDataCollectionItem(QgsDataItem *parent, const QString &name, const QString &path, const QList< QgsProviderSublayerDetails > &sublayers)
Constructor for QgsFileDataCollectionItem.
Qgis::DatabaseProviderConnectionCapabilities2 databaseConnectionCapabilities2() const
Returns extended connection capabilities, if a databaseConnection() is available.
static QString vsiPrefixForPath(const QString &path)
Returns a the vsi prefix which corresponds to a file path, or an empty string if the path is not asso...
static QStringList multiLayerFileExtensions()
Returns a list of file extensions which potentially contain multiple layers representing GDAL raster ...
Item that represents a layer that can be opened with one of the providers.
QList< QgsMimeDataUtils::Uri > UriList
Custom exception class for provider connection related exceptions.
QList< QgsProviderSublayerDetails > querySublayers(const QString &uri, Qgis::SublayerQueryFlags flags=Qgis::SublayerQueryFlags(), QgsFeedback *feedback=nullptr) const
Queries the specified uri and returns a list of any valid sublayers found in the dataset which can be...
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
QgsProviderMetadata * providerMetadata(const QString &providerKey) const
Returns metadata of the provider or nullptr if not found.
Contains details about a sub layer available from a dataset.
QStringList path() const
Returns the path to the sublayer.
Qgis::LayerType type() const
Returns the layer type.
Qgis::WkbType wkbType() const
Returns the layer's WKB type, or QgsWkbTypes::Unknown if the WKB type is not application or unknown.
QString uri() const
Returns the layer's URI.
QgsMimeDataUtils::Uri toMimeUri() const
Converts the sublayer details to a QgsMimeDataUtils::Uri representing the sublayer.
QString driverName() const
Returns the layer's driver name.
QString providerKey() const
Returns the associated data provider key.
QString name() const
Returns the layer's name.
A generic data item for file based layers.
QString layerName() const override
QgsAbstractDatabaseProviderConnection * databaseConnection() const override
For data items that represent a DB connection or one of its children, this method returns a connectio...
QVector< QgsDataItem * > createChildren() override
Create children.
QgsProviderSublayerItem(QgsDataItem *parent, const QString &name, const QgsProviderSublayerDetails &details, const QString &filePath)
Constructor for QgsProviderSublayerItem.
QgsProviderSublayerDetails sublayerDetails() const
Returns the sublayer details for the item.
static bool sublayerDetailsAreIncomplete(const QList< QgsProviderSublayerDetails > &details, QgsProviderUtils::SublayerCompletenessFlags flags=QgsProviderUtils::SublayerCompletenessFlags())
Returns true if the sublayer details are incomplete, and require a more in-depth scan.
@ IgnoreUnknownGeometryType
Indicates that an unknown geometry type should not be considered as incomplete.
@ IgnoreUnknownFeatureCount
Indicates that an unknown feature count should not be considered as incomplete.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
static bool isXmlStyleFile(const QString &path)
Tests if the file at path is a QGIS style XML file.
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
#define QgsDebugMsgLevel(str, level)
QString filePath
Path to file, if uri is associated with a file.
QString uri
Identifier of the data source recognized by its providerKey.
QString layerType
Type of URI.