Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix identify on map in relation reference widget
Fixes #22071 - Relation reference widget wrong feature when "on map identification"
  • Loading branch information
elpaso authored and nyalldawson committed May 30, 2019
1 parent 909b789 commit 831b52a
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 4 deletions.
Expand Up @@ -72,7 +72,7 @@ determines if the foreign key is shown in a combox box or a read-only line edit

bool allowMapIdentification();
%Docstring
determines if the widge offers the possibility to select the related feature on the map (using a dedicated map tool)
determines if the widget offers the possibility to select the related feature on the map (using a dedicated map tool)
%End
void setAllowMapIdentification( bool allowMapIdentification );

Expand Down
5 changes: 3 additions & 2 deletions src/gui/editorwidgets/qgsrelationreferencewidget.cpp
Expand Up @@ -40,7 +40,8 @@
#include "qgsmaptoolidentifyfeature.h"
#include "qgsfeatureiterator.h"
#include "qgsfeaturelistcombobox.h"

#include "qgsexpressioncontextutils.h"
#include "qgsfeaturefiltermodel.h"

QgsRelationReferenceWidget::QgsRelationReferenceWidget( QWidget *parent )
: QWidget( parent )
Expand Down Expand Up @@ -744,7 +745,7 @@ void QgsRelationReferenceWidget::featureIdentified( const QgsFeature &feature )
}
else
{
mComboBox->setCurrentIndex( mComboBox->findData( feature.id(), QgsAttributeTableModel::FeatureIdRole ) );
mComboBox->setCurrentIndex( mComboBox->findData( feature.attribute( mReferencedFieldIdx ), QgsFeatureFilterModel::Role::IdentifierValueRole ) );
mFeature = feature;
}

Expand Down
2 changes: 1 addition & 1 deletion src/gui/editorwidgets/qgsrelationreferencewidget.h
Expand Up @@ -99,7 +99,7 @@ class GUI_EXPORT QgsRelationReferenceWidget : public QWidget
bool readOnlySelector() { return mReadOnlySelector; }
void setReadOnlySelector( bool readOnly );

//! determines if the widge offers the possibility to select the related feature on the map (using a dedicated map tool)
//! determines if the widget offers the possibility to select the related feature on the map (using a dedicated map tool)
bool allowMapIdentification() { return mAllowMapIdentification; }
void setAllowMapIdentification( bool allowMapIdentification );

Expand Down
34 changes: 34 additions & 0 deletions tests/src/gui/testqgsrelationreferencewidget.cpp
Expand Up @@ -47,6 +47,7 @@ class TestQgsRelationReferenceWidget : public QObject
void testChainFilterDeleteForeignKey();
void testInvalidRelation();
void testSetGetForeignKey();
void testIdentifyOnMap();

private:
std::unique_ptr<QgsVectorLayer> mLayer1;
Expand Down Expand Up @@ -340,5 +341,38 @@ void TestQgsRelationReferenceWidget::testSetGetForeignKey()
QCOMPARE( spy.count(), 3 );
}


// Test issue https://issues.qgis.org/issues/22071
// Relation reference widget wrong feature when "on map identification"
void TestQgsRelationReferenceWidget::testIdentifyOnMap()
{
QWidget parentWidget;
QgsRelationReferenceWidget w( &parentWidget );
QVERIFY( mLayer1->startEditing() );
w.setRelation( *mRelation, true );
w.setAllowMapIdentification( true );
w.init();
QEventLoop loop;
// Populate model (I tried to listen to signals but the module reload() runs twice
// (the first load triggers a second one which does the population of the combo)
// and I haven't fin a way to properly wait for it.
QTimer::singleShot( 300, [&] { loop.quit(); } );
loop.exec();
QgsFeature feature;
mLayer2->getFeatures( QStringLiteral( R"(pk = %1)" ).arg( 11 ) ).nextFeature( feature );
QVERIFY( feature.isValid() );
QCOMPARE( feature.attribute( QStringLiteral( "pk" ) ).toInt(), 11 );
w.featureIdentified( feature );
QCOMPARE( w.mComboBox->currentData( Qt::DisplayRole ).toInt(), 11 );

mLayer2->getFeatures( QStringLiteral( R"(pk = %1)" ).arg( 10 ) ).nextFeature( feature );
QVERIFY( feature.isValid() );
QCOMPARE( feature.attribute( QStringLiteral( "pk" ) ).toInt(), 10 );
w.featureIdentified( feature );
QCOMPARE( w.mComboBox->currentData( Qt::DisplayRole ).toInt(), 10 );

mLayer1->rollBack();
}

QGSTEST_MAIN( TestQgsRelationReferenceWidget )
#include "testqgsrelationreferencewidget.moc"

0 comments on commit 831b52a

Please sign in to comment.