Skip to content

Commit

Permalink
Merge pull request #57377 from qgis/backport-56825-to-release-3_36
Browse files Browse the repository at this point in the history
[Backport release-3_36] Fix merge features with hidden fields
  • Loading branch information
elpaso committed May 10, 2024
2 parents dc2d01c + 6e97eb1 commit db6dfb7
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 9 deletions.
19 changes: 10 additions & 9 deletions src/app/qgsmergeattributesdialog.cpp
Expand Up @@ -171,6 +171,9 @@ void QgsMergeAttributesDialog::createTableWidgetContents()
if ( setup.type() == QLatin1String( "Hidden" ) || setup.type() == QLatin1String( "Immutable" ) )
{
mHiddenAttributes.insert( idx );
}
if ( setup.type() == QLatin1String( "Immutable" ) )
{
continue;
}

Expand All @@ -182,13 +185,18 @@ void QgsMergeAttributesDialog::createTableWidgetContents()
mTableWidget->setHorizontalHeaderItem( col, item );

QComboBox *cb = createMergeComboBox( mFields.at( idx ).type(), col );
if ( ! mVectorLayer->dataProvider()->pkAttributeIndexes().contains( mFields.fieldOriginIndex( idx ) ) &&
mFields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique )
if ( ( ! mVectorLayer->dataProvider()->pkAttributeIndexes().contains( mFields.fieldOriginIndex( idx ) ) &&
mFields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique ) || mHiddenAttributes.contains( idx ) )
{
cb->setCurrentIndex( cb->findData( "skip" ) );
}
mTableWidget->setCellWidget( 0, col, cb );

if ( mHiddenAttributes.contains( idx ) )
{
mTableWidget->setColumnHidden( idx, col );
}

col++;
}

Expand Down Expand Up @@ -768,13 +776,6 @@ QgsAttributes QgsMergeAttributesDialog::mergedAttributes() const
QgsAttributes results( mFields.count() );
for ( int fieldIdx = 0; fieldIdx < mFields.count(); ++fieldIdx )
{
if ( mHiddenAttributes.contains( fieldIdx ) )
{
//hidden attribute, set to default value
results[fieldIdx] = QVariant();
continue;
}

QComboBox *comboBox = qobject_cast<QComboBox *>( mTableWidget->cellWidget( 0, widgetIndex ) );
if ( !comboBox )
continue;
Expand Down
68 changes: 68 additions & 0 deletions tests/src/app/testqgsmergeattributesdialog.cpp
Expand Up @@ -150,6 +150,74 @@ class TestQgsMergeattributesDialog : public QgsTest
QVERIFY( !dialog.mergedAttributes().at( 0 ).isValid() );
QCOMPARE( dialog.mergedAttributes().at( 1 ), 22 );
}

void testWithHiddenField()
{
// Create test layer
QgsVectorFileWriter::SaveVectorOptions options;
QgsVectorLayer ml( "LineString", "test", "memory" );
QVERIFY( ml.isValid() );

QgsField notHiddenField( QStringLiteral( "not_hidden" ), QVariant::Int );
QgsField hiddenField( QStringLiteral( "hidden" ), QVariant::Int );
// hide the field
ml.setEditorWidgetSetup( 1, QgsEditorWidgetSetup( QStringLiteral( "Hidden" ), QVariantMap() ) );
QVERIFY( ml.dataProvider()->addAttributes( { notHiddenField, hiddenField } ) );
ml.updateFields();

// Create features
QgsFeature f1( ml.fields(), 1 );
f1.setAttributes( QVector<QVariant>() << 1 << 2 );
f1.setGeometry( QgsGeometry::fromWkt( "LINESTRING(0 0, 10 0)" ) );
QVERIFY( ml.dataProvider()->addFeature( f1 ) );
QCOMPARE( ml.featureCount(), 1 );

QgsFeature f2( ml.fields(), 2 );
f2.setAttributes( QVector<QVariant>() << 3 << 4 );
f2.setGeometry( QgsGeometry::fromWkt( "LINESTRING(10 0, 15 0)" ) );
QVERIFY( ml.dataProvider()->addFeature( f2 ) );
QCOMPARE( ml.featureCount(), 2 );

// Merge the attributes together
QgsMergeAttributesDialog dialog( QgsFeatureList() << f1 << f2, &ml, mQgisApp->mapCanvas() );
QVERIFY( QMetaObject::invokeMethod( &dialog, "mFromLargestPushButton_clicked" ) );
QCOMPARE( dialog.mergedAttributes(), QgsAttributes() << 1 << 2 );
}

void testWithHiddenFieldDefaultsToEmpty()
{
// Create test layer
QgsVectorFileWriter::SaveVectorOptions options;
QgsVectorLayer ml( "LineString", "test", "memory" );
QVERIFY( ml.isValid() );

QgsField notHiddenField( QStringLiteral( "not_hidden" ), QVariant::Int );
QgsField hiddenField( QStringLiteral( "hidden" ), QVariant::Int );
QVERIFY( ml.dataProvider()->addAttributes( { notHiddenField, hiddenField } ) );
ml.updateFields();

// hide the field
ml.setEditorWidgetSetup( 1, QgsEditorWidgetSetup( QStringLiteral( "Hidden" ), QVariantMap() ) );


// Create features
QgsFeature f1( ml.fields(), 1 );
f1.setAttributes( QVector<QVariant>() << 1 << 2 );
f1.setGeometry( QgsGeometry::fromWkt( "LINESTRING(0 0, 10 0)" ) );
QVERIFY( ml.dataProvider()->addFeature( f1 ) );
QCOMPARE( ml.featureCount(), 1 );

QgsFeature f2( ml.fields(), 2 );
f2.setAttributes( QVector<QVariant>() << 3 << 4 );
f2.setGeometry( QgsGeometry::fromWkt( "LINESTRING(10 0, 15 0)" ) );
QVERIFY( ml.dataProvider()->addFeature( f2 ) );
QCOMPARE( ml.featureCount(), 2 );

// Merge the attributes together
QgsMergeAttributesDialog dialog( QgsFeatureList() << f1 << f2, &ml, mQgisApp->mapCanvas() );
// QVariant gets turned into default value while saving the layer
QCOMPARE( dialog.mergedAttributes(), QgsAttributes() << 1 << QVariant() );
}
};

QGSTEST_MAIN( TestQgsMergeattributesDialog )
Expand Down

0 comments on commit db6dfb7

Please sign in to comment.