Skip to content

Commit

Permalink
Expose relationship deletion in browser
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jan 16, 2023
1 parent e6b137f commit 6adb725
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
51 changes: 51 additions & 0 deletions src/app/browser/qgsinbuiltdataitemproviders.cpp
Expand Up @@ -2323,6 +2323,57 @@ QString QgsRelationshipItemGuiProvider::name()
return QStringLiteral( "relationship_item" );
}

void QgsRelationshipItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *menu, const QList<QgsDataItem *> &, QgsDataItemGuiContext context )
{
if ( QgsRelationshipItem *relationshipItem = qobject_cast< QgsRelationshipItem * >( item ) )
{
if ( QgsRelationshipsItem *relationshipsItem = qobject_cast< QgsRelationshipsItem * >( relationshipItem->parent() ) )
{
const QString providerKey = relationshipsItem->providerKey();
const QString connectionUri = relationshipsItem->connectionUri();
const QgsWeakRelation relation = relationshipItem->relation();

// Check if relationship mis supported
if ( QgsProviderMetadata *md = QgsProviderRegistry::instance()->providerMetadata( providerKey ) )
{
std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( connectionUri, {} ) ) };

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

QPointer< QgsDataItem > itemWeakPointer( item );

connect( deleteRelationshipAction, &QAction::triggered, this, [ = ]
{
if ( QMessageBox::question( nullptr, tr( "Delete Relationship" ),
tr( "Are you sure you want to delete the %1 relationship?" ).arg( relation.name() ),
QMessageBox::Yes | QMessageBox::No ) == QMessageBox::Yes )
{
std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( connectionUri, {} ) ) };
try
{
conn->deleteRelationship( relation );
notify( QObject::tr( "Relationship Deleted" ), QObject::tr( "Relationship '%1' was deleted successfully." ).arg( relation.name() ), context, Qgis::MessageLevel::Success );
if ( itemWeakPointer )
{
itemWeakPointer->parent()->refresh();
}
}
catch ( QgsProviderConnectionException &ex )
{
notify( QObject::tr( "Relationship Deletion Error" ), QObject::tr( "Error deleting relationship '%1': %2" ).arg( relation.name(), ex.what() ), context, Qgis::MessageLevel::Critical );
}
}
} );

menu->addAction( deleteRelationshipAction );
}
}
}
}
}

QWidget *QgsRelationshipItemGuiProvider::createParamWidget( QgsDataItem *item, QgsDataItemGuiContext )
{
if ( QgsRelationshipItem *relationshipItem = qobject_cast< QgsRelationshipItem * >( item ) )
Expand Down
2 changes: 2 additions & 0 deletions src/app/browser/qgsinbuiltdataitemproviders.h
Expand Up @@ -269,6 +269,8 @@ class QgsRelationshipItemGuiProvider : public QObject, public QgsDataItemGuiProv
QgsRelationshipItemGuiProvider() = default;

QString name() override;
void populateContextMenu( QgsDataItem *item, QMenu *menu,
const QList<QgsDataItem *> &selectedItems, QgsDataItemGuiContext context ) override;
QWidget *createParamWidget( QgsDataItem *item, QgsDataItemGuiContext context ) override;
};

Expand Down

0 comments on commit 6adb725

Please sign in to comment.