mirror of
https://github.com/qgis/QGIS.git
synced 2025-12-30 00:29:39 -05:00
[feature] Allow creation of new field domains through right click
menu on gpkg items in browser Allows users to create new range, coded value or glob field domains
This commit is contained in:
parent
dfac7df6fa
commit
d06fb3dd11
@ -57,6 +57,8 @@
|
||||
#include "qgsogrproviderutils.h"
|
||||
#include "qgsprojectutils.h"
|
||||
#include "qgsvariantutils.h"
|
||||
#include "qgsfielddomainwidget.h"
|
||||
#include "qgsgeopackagedataitems.h"
|
||||
|
||||
#include <QFileInfo>
|
||||
#include <QMenu>
|
||||
@ -1600,6 +1602,83 @@ QString QgsFieldDomainItemGuiProvider::name()
|
||||
return QStringLiteral( "field_domain_item" );
|
||||
}
|
||||
|
||||
void QgsFieldDomainItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *menu, const QList<QgsDataItem *> &, 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<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( 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<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( 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 ) )
|
||||
|
||||
@ -223,6 +223,8 @@ class QgsFieldDomainItemGuiProvider : public QObject, public QgsDataItemGuiProvi
|
||||
QgsFieldDomainItemGuiProvider() = default;
|
||||
|
||||
QString name() override;
|
||||
void populateContextMenu( QgsDataItem *item, QMenu *menu,
|
||||
const QList<QgsDataItem *> &selectedItems, QgsDataItemGuiContext context ) override;
|
||||
QWidget *createParamWidget( QgsDataItem *item, QgsDataItemGuiContext context ) override;
|
||||
};
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user