Skip to content

Commit

Permalink
Merge pull request #34514 from elpaso/bugfix-gh34404-crash-on-apply-d…
Browse files Browse the repository at this point in the history
…efault-value-3_10

[backport] Fix crash when switching "apply default value on update"
  • Loading branch information
elpaso committed Feb 21, 2020
2 parents 282bc33 + 2e939e0 commit 0d82078
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 26 deletions.
62 changes: 36 additions & 26 deletions src/gui/qgsattributeform.cpp
Expand Up @@ -446,6 +446,10 @@ bool QgsAttributeForm::saveEdits()

bool QgsAttributeForm::updateDefaultValues( const int originIdx )
{

// Synchronize
updateDefaultValueDependencies();

if ( !mDefaultValueDependencies.contains( originIdx ) )
return false;

Expand Down Expand Up @@ -1544,32 +1548,7 @@ void QgsAttributeForm::init()
}
}

//create defaultValueDependencies
for ( QgsWidgetWrapper *ww : qgis::as_const( mWidgets ) )
{
QgsEditorWidgetWrapper *eww = qobject_cast<QgsEditorWidgetWrapper *>( ww );
if ( eww )
{
QgsExpression exp( eww->field().defaultValueDefinition().expression() );
const QSet<QString> referencedColumns = exp.referencedColumns();
for ( const QString &referencedColumn : referencedColumns )
{
if ( referencedColumn == QgsFeatureRequest::ALL_ATTRIBUTES )
{
const QList<int> allAttributeIds( mLayer->fields().allAttributesList() );

for ( const int id : allAttributeIds )
{
mDefaultValueDependencies.insertMulti( id, eww );
}
}
else
{
mDefaultValueDependencies.insertMulti( mLayer->fields().lookupField( referencedColumn ), eww );
}
}
}
}
updateDefaultValueDependencies();

if ( !mButtonBox )
{
Expand Down Expand Up @@ -2401,6 +2380,37 @@ bool QgsAttributeForm::fieldIsEditable( int fieldIndex ) const
return QgsVectorLayerUtils::fieldIsEditable( mLayer, fieldIndex, mFeature );
}

void QgsAttributeForm::updateDefaultValueDependencies()
{
mDefaultValueDependencies.clear();
//create defaultValueDependencies
for ( QgsWidgetWrapper *ww : qgis::as_const( mWidgets ) )
{
QgsEditorWidgetWrapper *eww = qobject_cast<QgsEditorWidgetWrapper *>( ww );
if ( eww )
{
QgsExpression exp( eww->field().defaultValueDefinition().expression() );
const QSet<QString> referencedColumns = exp.referencedColumns();
for ( const QString &referencedColumn : referencedColumns )
{
if ( referencedColumn == QgsFeatureRequest::ALL_ATTRIBUTES )
{
const QList<int> allAttributeIds( mLayer->fields().allAttributesList() );

for ( const int id : allAttributeIds )
{
mDefaultValueDependencies.insertMulti( id, eww );
}
}
else
{
mDefaultValueDependencies.insertMulti( mLayer->fields().lookupField( referencedColumn ), eww );
}
}
}
}
}

void QgsAttributeForm::updateIcon( QgsEditorWidgetWrapper *eww )
{
if ( !eww->widget() || !mIconMap[eww->widget()] )
Expand Down
2 changes: 2 additions & 0 deletions src/gui/qgsattributeform.h
Expand Up @@ -325,6 +325,8 @@ class GUI_EXPORT QgsAttributeForm : public QWidget

bool fieldIsEditable( const QgsVectorLayer &layer, int fieldIndex, QgsFeatureId fid ) const;

void updateDefaultValueDependencies();

struct WidgetInfo
{
QWidget *widget = nullptr;
Expand Down

0 comments on commit 0d82078

Please sign in to comment.