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() )
 
  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;
 
 
  520  return QStringLiteral( 
"files" );
 
 
  530  if ( path.isEmpty() )
 
  533  const QFileInfo info( path );
 
  534  QString suffix = info.suffix().toLower();
 
  535  const QString 
name = info.fileName();
 
  538  if ( suffix.compare( QLatin1String( 
"gpkg" ), Qt::CaseInsensitive ) == 0 )
 
  541    QgsGeoPackageCollectionItem *item = 
new QgsGeoPackageCollectionItem( parentItem, 
name, path );
 
  545  else if ( suffix == QLatin1String( 
"txt" ) )
 
  553  else if ( suffix == QLatin1String( 
"map" ) || suffix == QLatin1String( 
"dat" ) )
 
  555    if ( QFile::exists( QDir( info.path() ).filePath( info.baseName() + 
".tab" ) ) || QFile::exists( QDir( info.path() ).filePath( info.baseName() + 
".TAB" ) ) )
 
  559  else if ( suffix == QLatin1String( 
"dbf" ) || suffix == QLatin1String( 
"shx" ) )
 
  561    if ( QFile::exists( QDir( info.path() ).filePath( info.baseName() + 
".shp" ) ) || QFile::exists( QDir( info.path() ).filePath( info.baseName() + 
".SHP" ) ) )
 
  570  else if ( path.endsWith( QLatin1String( 
".shp.zip" ), Qt::CaseInsensitive ) &&
 
  571            GDALIdentifyDriverEx( path.toUtf8().constData(), GDAL_OF_VECTOR, 
nullptr, 
nullptr ) )
 
  573    suffix = QStringLiteral( 
"shp.zip" );
 
  582  Qgis::SublayerQueryFlags queryFlags = Qgis::SublayerQueryFlags();
 
  585  if ( ( settings.
value( QStringLiteral( 
"qgis/scanItemsInBrowser2" ),
 
  586                         "extension" ).toString() == QLatin1String( 
"extension" ) ) ||
 
  587       ( parentItem && settings.
value( QStringLiteral( 
"qgis/scanItemsFastScanUris" ),
 
  588                                       QStringList() ).toStringList().contains( parentItem->
path() ) ) )
 
  595  if ( sublayers.size() == 1
 
  604  else if ( !sublayers.empty() )
 
 
  618  QFileInfo info( path );
 
  619  QString suffix = info.suffix().toLower();
 
  621  QStringList dirExtensions = QgsOgrProviderUtils::directoryExtensions();
 
  622  return dirExtensions.contains( suffix );
 
 
@ Files
Can provides items which corresponds to files.
@ Directories
Can provides items which corresponds to directories.
@ 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...
Qgis::DataItemProviderCapabilities capabilities() const override
Returns combination of flags from QgsDataProvider::DataCapabilities.
QString name() override
Human-readable name of the provider name.
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 ...
QList< QgsProviderSublayerDetails > sublayers() const
Returns the sublayers.
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.