Skip to content

Commit

Permalink
Add a "New Relationship" action to context menu for supported browser…
Browse files Browse the repository at this point in the history
… datasets

Supported for:
- ESRI FileGeodatabases on GDAL 3.6+
- GeoPackage and sqlite databases on GDAL 3.7+
  • Loading branch information
nyalldawson committed Jan 16, 2023
1 parent 923abcb commit d7cc1c7
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions src/app/browser/qgsinbuiltdataitemproviders.cpp
Expand Up @@ -60,6 +60,7 @@
#include "qgsmessageoutput.h"
#include "qgsrelationshipsitem.h"
#include "qgsprovidersqlquerybuilder.h"
#include "qgsdbrelationshipwidget.h"

#include <QFileInfo>
#include <QMenu>
Expand Down Expand Up @@ -1990,6 +1991,40 @@ void QgsFieldDomainItemGuiProvider::populateContextMenu( QgsDataItem *item, QMen
{
std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( connectionUri, {} ) ) };

if ( conn && conn->capabilities().testFlag( QgsAbstractDatabaseProviderConnection::Capability::AddRelationship ) )
{
QAction *createRelationshipAction = new QAction( tr( "New Relationship…" ), menu );

QPointer< QgsDataItem > itemWeakPointer( item );

connect( createRelationshipAction, &QAction::triggered, this, [ = ]
{
std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( connectionUri, {} ) ) };
QgsDbRelationDialog dialog( conn.release(), QgisApp::instance() );
dialog.setWindowTitle( tr( "New Relationship" ) );
if ( dialog.exec() )
{
QgsWeakRelation relation = dialog.relationship();
std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( connectionUri, {} ) ) };
try
{
conn->addRelationship( relation );
notify( QObject::tr( "New Relationship Created" ), QObject::tr( "Relationship '%1' was created successfully." ).arg( relation.name() ), context, Qgis::MessageLevel::Success );
if ( itemWeakPointer )
{
itemWeakPointer->refresh();
}
}
catch ( QgsProviderConnectionException &ex )
{
notify( QObject::tr( "Relationship Creation Error" ), QObject::tr( "Error creating new relationship '%1': %2" ).arg( relation.name(), ex.what() ), context, Qgis::MessageLevel::Critical );
}
}
} );

menu->addAction( createRelationshipAction );
}

if ( conn && conn->capabilities().testFlag( QgsAbstractDatabaseProviderConnection::Capability::AddFieldDomain ) )
{
QMenu *createFieldDomainMenu = new QMenu( tr( "New Field Domain" ), menu );
Expand Down

0 comments on commit d7cc1c7

Please sign in to comment.