Skip to content

Commit

Permalink
Merge pull request #43785 from elpaso/bugfix-gh43061-save-action-disa…
Browse files Browse the repository at this point in the history
…bled-on-embedded-relation-form-when-transaction

Enable save icon for embedded relations in same transaction group
  • Loading branch information
elpaso committed Jul 11, 2021
2 parents 91370a9 + 3a24495 commit df60454
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
37 changes: 36 additions & 1 deletion src/app/qgsattributetabledialog.cpp
Expand Up @@ -57,6 +57,7 @@
#include "qgisapp.h"
#include "qgsorganizetablecolumnsdialog.h"
#include "qgsvectorlayereditbuffer.h"
#include "qgstransactiongroup.h"

QgsExpressionContext QgsAttributeTableDialog::createExpressionContext() const
{
Expand Down Expand Up @@ -231,6 +232,21 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *layer, QgsAttr
connect( mLayer, &QgsVectorLayer::readOnlyChanged, this, &QgsAttributeTableDialog::editingToggled );
connect( mLayer, &QgsVectorLayer::layerModified, this, &QgsAttributeTableDialog::updateLayerModifiedActions );

// When transaction group is enabled, collect related layers and connect modified actions to enable save action
const auto relations { QgsProject::instance()->relationManager()->referencedRelations( mLayer ) };
const auto transactionGroups = QgsProject::instance()->transactionGroups();
for ( const auto &relation : std::as_const( relations ) )
{
for ( auto it = transactionGroups.constBegin(); it != transactionGroups.constEnd(); ++it )
{
if ( relation.isValid() && it.value()->layers().contains( { mLayer, relation.referencingLayer() } ) )
{
mReferencingLayers.push_back( relation.referencingLayer() );
connect( relation.referencingLayer(), &QgsVectorLayer::layerModified, this, &QgsAttributeTableDialog::updateLayerModifiedActions );
}
}
}

// connect table info to window
connect( mMainView, &QgsDualView::filterChanged, this, &QgsAttributeTableDialog::updateTitle );
connect( mMainView, &QgsDualView::filterExpressionSet, this, &QgsAttributeTableDialog::formFilterSet );
Expand Down Expand Up @@ -606,6 +622,13 @@ void QgsAttributeTableDialog::mActionOpenFieldCalculator_triggered()
void QgsAttributeTableDialog::mActionSaveEdits_triggered()
{
QgisApp::instance()->saveEdits( mLayer, true, true );
for ( const auto &referencingLayer : std::as_const( mReferencingLayers ) )
{
if ( referencingLayer )
{
QgisApp::instance()->saveEdits( referencingLayer, true, true );
}
}
}

void QgsAttributeTableDialog::mActionReload_triggered()
Expand Down Expand Up @@ -1057,7 +1080,19 @@ void QgsAttributeTableDialog::toggleDockMode( bool docked )

void QgsAttributeTableDialog::updateLayerModifiedActions()
{
mActionSaveEdits->setEnabled( mActionToggleEditing->isEnabled() && mLayer->isEditable() && mLayer->isModified() );
bool saveEnabled { mActionToggleEditing->isEnabled() &&mLayer->isEditable() &&mLayer->isModified() };
if ( ! saveEnabled && mActionToggleEditing->isEnabled() )
{
for ( const auto &referencingLayer : std::as_const( mReferencingLayers ) )
{
if ( referencingLayer && referencingLayer->isEditable() && referencingLayer->isModified() )
{
saveEnabled = true;
break;
}
}
}
mActionSaveEdits->setEnabled( saveEnabled );
}

//
Expand Down
2 changes: 2 additions & 0 deletions src/app/qgsattributetabledialog.h
Expand Up @@ -228,6 +228,8 @@ class APP_EXPORT QgsAttributeTableDialog : public QDialog, private Ui::QgsAttrib
void updateMultiEditButtonState();
void deleteFeature( QgsFeatureId fid );

QList< QPointer< QgsVectorLayer> > mReferencingLayers;

friend class TestQgsAttributeTable;
};

Expand Down

0 comments on commit df60454

Please sign in to comment.