Skip to content

Commit

Permalink
Allow existing relationships to be edited, if supported by format
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jan 16, 2023
1 parent 4245f33 commit ad1b6a5
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 2 deletions.
34 changes: 34 additions & 0 deletions src/app/browser/qgsinbuiltdataitemproviders.cpp
Expand Up @@ -2295,7 +2295,41 @@ void QgsRelationshipItemGuiProvider::populateContextMenu( QgsDataItem *item, QMe
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::UpdateRelationship ) )
{
QAction *editRelationshipAction = new QAction( tr( "Edit Relationship…" ), menu );

QPointer< QgsDataItem > itemWeakPointer( item );

connect( editRelationshipAction, &QAction::triggered, this, [ = ]
{
std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( connectionUri, {} ) ) };

QgsDbRelationDialog dialog( conn.release(), QgisApp::instance() );
dialog.setWindowTitle( tr( "Edit Relationship" ) );
dialog.setRelationship( relation );
if ( dialog.exec() )
{
QgsWeakRelation relation = dialog.relationship();
std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( connectionUri, {} ) ) };
try
{
conn->updateRelationship( relation );
notify( QObject::tr( "Relationship Updated" ), QObject::tr( "Relationship '%1' was updated successfully." ).arg( relation.name() ), context, Qgis::MessageLevel::Success );
if ( itemWeakPointer )
{
itemWeakPointer->refresh();
}
}
catch ( QgsProviderConnectionException &ex )
{
notify( QObject::tr( "Relationship Update Error" ), QObject::tr( "Error updating relationship '%1': %2" ).arg( relation.name(), ex.what() ), context, Qgis::MessageLevel::Critical );
}
}
} );

menu->addAction( editRelationshipAction );
}
if ( conn && conn->capabilities().testFlag( QgsAbstractDatabaseProviderConnection::Capability::DeleteRelationship ) )
{
QAction *deleteRelationshipAction = new QAction( tr( "Delete Relationship…" ), menu );
Expand Down
23 changes: 21 additions & 2 deletions src/gui/qgsdbrelationshipwidget.cpp
Expand Up @@ -16,6 +16,7 @@
#include "qgsdbrelationshipwidget.h"
#include "qgsgui.h"
#include "qgsdatabasetablemodel.h"
#include "qgsproviderregistry.h"
#include <QDialogButtonBox>
#include <QPushButton>
#include <QSortFilterProxyModel>
Expand Down Expand Up @@ -111,12 +112,26 @@ QgsDbRelationWidget::QgsDbRelationWidget( QgsAbstractDatabaseProviderConnection

void QgsDbRelationWidget::setRelationship( const QgsWeakRelation &relationship )
{
mNameEdit->setText( relationship.name() );
mRelation = relationship;
mNameEdit->setText( mRelation.name() );
mStrengthCombo->setCurrentIndex( mStrengthCombo->findData( QVariant::fromValue( mRelation.strength() ) ) );

QVariantMap parts = QgsProviderRegistry::instance()->decodeUri( mConnection->providerKey(), mRelation.referencedLayerSource() );
mLeftTableCombo->setCurrentText( parts.value( QStringLiteral( "layerName" ) ).toString() );
parts = QgsProviderRegistry::instance()->decodeUri( mConnection->providerKey(), mRelation.referencingLayerSource() );
mRightTableCombo->setCurrentText( parts.value( QStringLiteral( "layerName" ) ).toString() );

mCardinalityCombo->setCurrentIndex( mCardinalityCombo->findData( QVariant::fromValue( mRelation.cardinality() ) ) );
mLeftFieldsCombo->setCurrentText( mRelation.referencedLayerFields().value( 0 ) );
mRightFieldsCombo->setCurrentText( mRelation.referencingLayerFields().value( 0 ) );
mForwardLabelLineEdit->setText( mRelation.forwardPathLabel() );
mBackwardLabelLineEdit->setText( mRelation.backwardPathLabel() );
mRelatedTableTypeCombo->setCurrentText( mRelation.relatedTableType() );
}

QgsWeakRelation QgsDbRelationWidget::relationship() const
{
QgsWeakRelation result( mNameEdit->text(),
QgsWeakRelation result( mRelation.id().isEmpty() ? mNameEdit->text() : mRelation.id(),
mNameEdit->text(),
mStrengthCombo->currentData().value< Qgis::RelationshipStrength >(),
QString(),
Expand All @@ -134,6 +149,10 @@ QgsWeakRelation QgsDbRelationWidget::relationship() const
result.setForwardPathLabel( mForwardLabelLineEdit->text() );
result.setBackwardPathLabel( mBackwardLabelLineEdit->text() );

result.setMappingTable( mRelation.mappingTable() );
result.setMappingReferencedLayerFields( mRelation.mappingReferencedLayerFields() );
result.setMappingReferencingLayerFields( mRelation.mappingReferencingLayerFields() );

if ( mRelatedTableTypeCombo->currentIndex() >= 0 )
result.setRelatedTableType( mRelatedTableTypeCombo->currentText() );
return result;
Expand Down
1 change: 1 addition & 0 deletions src/gui/qgsdbrelationshipwidget.h
Expand Up @@ -82,6 +82,7 @@ class GUI_EXPORT QgsDbRelationWidget : public QWidget, private Ui_QgsDbRelations
QgsAbstractDatabaseProviderConnection *mConnection = nullptr;
QgsDatabaseTableModel *mTableModel = nullptr;
QSortFilterProxyModel *mProxyModel = nullptr;
QgsWeakRelation mRelation;

};

Expand Down

0 comments on commit ad1b6a5

Please sign in to comment.