diff --git a/src/app/browser/qgsinbuiltdataitemproviders.cpp b/src/app/browser/qgsinbuiltdataitemproviders.cpp index ce142b89c6e..d53ef5fee37 100644 --- a/src/app/browser/qgsinbuiltdataitemproviders.cpp +++ b/src/app/browser/qgsinbuiltdataitemproviders.cpp @@ -57,6 +57,8 @@ #include "qgsogrproviderutils.h" #include "qgsprojectutils.h" #include "qgsvariantutils.h" +#include "qgsfielddomainwidget.h" +#include "qgsgeopackagedataitems.h" #include #include @@ -1600,6 +1602,83 @@ QString QgsFieldDomainItemGuiProvider::name() return QStringLiteral( "field_domain_item" ); } +void QgsFieldDomainItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *menu, const QList &, QgsDataItemGuiContext context ) +{ + if ( qobject_cast< QgsFieldDomainsItem * >( item ) + || qobject_cast< QgsGeoPackageCollectionItem * >( item ) ) + { + QString providerKey; + QString connectionUri; + + if ( QgsFieldDomainsItem *fieldDomainsItem = qobject_cast< QgsFieldDomainsItem * >( item ) ) + { + providerKey = fieldDomainsItem->providerKey(); + connectionUri = fieldDomainsItem->connectionUri(); + } + else if ( QgsGeoPackageCollectionItem *gpkgItem = qobject_cast< QgsGeoPackageCollectionItem * >( item ) ) + { + providerKey = QStringLiteral( "ogr" ); + connectionUri = gpkgItem->path().remove( QStringLiteral( "gpkg:/" ) ); + } + + // Check if domain creation is supported + QgsProviderMetadata *md { QgsProviderRegistry::instance()->providerMetadata( providerKey ) }; + if ( md ) + { + std::unique_ptr conn { static_cast( md->createConnection( connectionUri, {} ) ) }; + + if ( conn && conn->capabilities().testFlag( QgsAbstractDatabaseProviderConnection::Capability::AddFieldDomain ) ) + { + QMenu *createFieldDomainMenu = new QMenu( tr( "New Field Domain" ), menu ); + menu->addMenu( createFieldDomainMenu ); + + QAction *rangeDomainAction = new QAction( QObject::tr( "New Range Domain…" ) ); + createFieldDomainMenu->addAction( rangeDomainAction ); + QAction *codedDomainAction = new QAction( QObject::tr( "New Coded Values Domain…" ) ); + createFieldDomainMenu->addAction( codedDomainAction ); + QAction *globDomainAction = new QAction( QObject::tr( "New Glob Domain…" ) ); + createFieldDomainMenu->addAction( globDomainAction ); + QPointer< QgsDataItem > itemWeakPointer( item ); + + auto createDomain = [context, itemWeakPointer, md, connectionUri]( Qgis::FieldDomainType type ) + { + QgsFieldDomainDialog dialog( type, QgisApp::instance() ); + if ( dialog.exec() ) + { + std::unique_ptr< QgsFieldDomain > newDomain( dialog.createFieldDomain() ); + std::unique_ptr conn { static_cast( md->createConnection( connectionUri, {} ) ) }; + try + { + conn->addFieldDomain( *newDomain, QString() ); + notify( QObject::tr( "New Field Domain Created" ), QObject::tr( "Field domain '%1' was created successfully." ).arg( newDomain->name() ), context, Qgis::MessageLevel::Success ); + if ( itemWeakPointer ) + { + itemWeakPointer->refresh(); + } + } + catch ( QgsProviderConnectionException &ex ) + { + notify( QObject::tr( "Field Domain Creation Error" ), QObject::tr( "Error creating new field domain '%1': %2" ).arg( newDomain->name(), ex.what() ), context, Qgis::MessageLevel::Critical ); + } + } + }; + connect( rangeDomainAction, &QAction::triggered, this, [ = ] + { + createDomain( Qgis::FieldDomainType::Range ); + } ); + connect( codedDomainAction, &QAction::triggered, this, [ = ] + { + createDomain( Qgis::FieldDomainType::Coded ); + } ); + connect( globDomainAction, &QAction::triggered, this, [ = ] + { + createDomain( Qgis::FieldDomainType::Glob ); + } ); + } + } + } +} + QWidget *QgsFieldDomainItemGuiProvider::createParamWidget( QgsDataItem *item, QgsDataItemGuiContext ) { if ( QgsFieldDomainItem *fieldDomainItem = qobject_cast< QgsFieldDomainItem * >( item ) ) diff --git a/src/app/browser/qgsinbuiltdataitemproviders.h b/src/app/browser/qgsinbuiltdataitemproviders.h index b147ac3c1d6..29950cd5a23 100644 --- a/src/app/browser/qgsinbuiltdataitemproviders.h +++ b/src/app/browser/qgsinbuiltdataitemproviders.h @@ -223,6 +223,8 @@ class QgsFieldDomainItemGuiProvider : public QObject, public QgsDataItemGuiProvi QgsFieldDomainItemGuiProvider() = default; QString name() override; + void populateContextMenu( QgsDataItem *item, QMenu *menu, + const QList &selectedItems, QgsDataItemGuiContext context ) override; QWidget *createParamWidget( QgsDataItem *item, QgsDataItemGuiContext context ) override; };