Expose field domain management capabilities for non-gpkg supported datasets in browser

This commit is contained in:
Nyall Dawson 2022-06-22 12:34:27 +10:00
parent acdea9605c
commit fe363d134b
2 changed files with 31 additions and 1 deletions

View File

@ -1613,7 +1613,8 @@ QString QgsFieldDomainItemGuiProvider::name()
void QgsFieldDomainItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *menu, const QList<QgsDataItem *> &, QgsDataItemGuiContext context )
{
if ( qobject_cast< QgsFieldDomainsItem * >( item )
|| qobject_cast< QgsGeoPackageCollectionItem * >( item ) )
|| qobject_cast< QgsGeoPackageCollectionItem * >( item )
|| qobject_cast< QgsFileDataCollectionItem * >( item ) )
{
QString providerKey;
QString connectionUri;
@ -1628,6 +1629,11 @@ void QgsFieldDomainItemGuiProvider::populateContextMenu( QgsDataItem *item, QMen
providerKey = QStringLiteral( "ogr" );
connectionUri = gpkgItem->path().remove( QStringLiteral( "gpkg:/" ) );
}
else if ( QgsFileDataCollectionItem *fileItem = qobject_cast< QgsFileDataCollectionItem * >( item ) )
{
providerKey = QStringLiteral( "ogr" );
connectionUri = fileItem->path();
}
// Check if domain creation is supported
QgsProviderMetadata *md { QgsProviderRegistry::instance()->providerMetadata( providerKey ) };

View File

@ -25,6 +25,7 @@
#include "qgsgeopackagedataitems.h"
#include "qgsprovidersublayerdetails.h"
#include "qgsfieldsitem.h"
#include "qgsfielddomainsitem.h"
#include "qgsproviderutils.h"
#include "qgsmbtiles.h"
#include "qgsvectortiledataitems.h"
@ -197,6 +198,29 @@ QVector<QgsDataItem *> QgsFileDataCollectionItem::createChildren()
children.append( item );
}
std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn( databaseConnection() );
if ( conn && ( conn->capabilities() & QgsAbstractDatabaseProviderConnection::Capability::ListFieldDomains ) )
{
QString domainError;
QStringList fieldDomains;
try
{
fieldDomains = conn->fieldDomainNames();
}
catch ( QgsProviderConnectionException &ex )
{
domainError = ex.what();
}
if ( !fieldDomains.empty() || !domainError.isEmpty() )
{
std::unique_ptr< QgsFieldDomainsItem > domainsItem = std::make_unique< QgsFieldDomainsItem >( this, mPath + "/domains", conn->uri(), QStringLiteral( "ogr" ) );
// force this item to appear last by setting a maximum string value for the sort key
domainsItem->setSortKey( QString( QChar( 0x10FFFF ) ) );
children.append( domainsItem.release() );
}
}
return children;
}