Skip to content

Commit 18c1597

Browse files
author
Hugo Mercier
authored
Merge pull request #5043 from pblottiere/bugfix_refrel
Fixes relation reference widget by refreshing filter lists. Fixes #16400
2 parents f0d3677 + a2914ff commit 18c1597

File tree

2 files changed

+102
-47
lines changed

2 files changed

+102
-47
lines changed

src/gui/editorwidgets/qgsrelationreferencewidget.cpp

+17-3
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,20 @@ void QgsRelationReferenceWidget::setForeignKey( const QVariant &value )
280280
}
281281
else
282282
{
283+
QVariant nullValue = QgsApplication::nullRepresentation();
284+
285+
if ( mChainFilters && mFeature.isValid() && mFilterComboBoxes.count() >= mFilterFields.count() )
286+
{
287+
QgsFeature feature = mFeature;
288+
289+
for ( int i = 0; i < mFilterFields.size(); i++ )
290+
{
291+
QVariant v = feature.attribute( mFilterFields[i] );
292+
QString f = v.isNull() ? nullValue.toString() : v.toString();
293+
mFilterComboBoxes.at( i )->setCurrentIndex( mFilterComboBoxes.at( i )->findText( f ) );
294+
}
295+
}
296+
283297
int i = mComboBox->findData( mFeature.id(), QgsAttributeTableModel::FeatureIdRole );
284298
if ( i == -1 && mAllowNull )
285299
{
@@ -971,12 +985,12 @@ void QgsRelationReferenceWidget::disableChainedComboBoxes( const QComboBox *scb
971985
continue;
972986
}
973987

988+
cb->setCurrentIndex( 0 );
974989
if ( ccb->currentIndex() == 0 )
975990
{
976-
cb->setCurrentIndex( 0 );
977991
cb->setEnabled( false );
978992
}
979-
else
980-
ccb = cb;
993+
994+
ccb = cb;
981995
}
982996
}

tests/src/gui/testqgsrelationreferencewidget.cpp

+85-44
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ class TestQgsRelationReferenceWidget : public QObject
3939
void cleanup(); // will be called after every testfunction.
4040

4141
void testChainFilter();
42+
void testChainFilterRefreshed();
43+
44+
private:
45+
std::unique_ptr<QgsVectorLayer> mLayer1;
46+
std::unique_ptr<QgsVectorLayer> mLayer2;
47+
std::unique_ptr<QgsRelation> mRelation;
4248
};
4349

4450
void TestQgsRelationReferenceWidget::initTestCase()
@@ -55,79 +61,79 @@ void TestQgsRelationReferenceWidget::cleanupTestCase()
5561

5662
void TestQgsRelationReferenceWidget::init()
5763
{
58-
}
59-
60-
void TestQgsRelationReferenceWidget::cleanup()
61-
{
62-
}
63-
64-
void TestQgsRelationReferenceWidget::testChainFilter()
65-
{
66-
// create layers
67-
QgsVectorLayer vl1( QStringLiteral( "LineString?crs=epsg:3111&field=pk:int&field=fk:int" ), QStringLiteral( "vl1" ), QStringLiteral( "memory" ) );
68-
QgsVectorLayer vl2( QStringLiteral( "LineString?field=pk:int&field=material:string&field=diameter:int&field=raccord:string" ), QStringLiteral( "vl2" ), QStringLiteral( "memory" ) );
69-
QgsProject::instance()->addMapLayer( &vl1, false, false );
70-
QgsProject::instance()->addMapLayer( &vl2, false, false );
71-
72-
// create a relation between them
73-
QgsRelation relation;
74-
relation.setId( QStringLiteral( "vl1.vl2" ) );
75-
relation.setName( QStringLiteral( "vl1.vl2" ) );
76-
relation.setReferencingLayer( vl1.id() );
77-
relation.setReferencedLayer( vl2.id() );
78-
relation.addFieldPair( "fk", "pk" );
79-
QVERIFY( relation.isValid() );
80-
QgsProject::instance()->relationManager()->addRelation( relation );
64+
// create layer
65+
mLayer1.reset( new QgsVectorLayer( QStringLiteral( "LineString?crs=epsg:3111&field=pk:int&field=fk:int" ), QStringLiteral( "vl1" ), QStringLiteral( "memory" ) ) );
66+
QgsProject::instance()->addMapLayer( mLayer1.get(), false, false );
67+
68+
mLayer2.reset( new QgsVectorLayer( QStringLiteral( "LineString?field=pk:int&field=material:string&field=diameter:int&field=raccord:string" ), QStringLiteral( "vl2" ), QStringLiteral( "memory" ) ) );
69+
QgsProject::instance()->addMapLayer( mLayer2.get(), false, false );
70+
71+
// create relation
72+
mRelation.reset( new QgsRelation() );
73+
mRelation->setId( QStringLiteral( "vl1.vl2" ) );
74+
mRelation->setName( QStringLiteral( "vl1.vl2" ) );
75+
mRelation->setReferencingLayer( mLayer1->id() );
76+
mRelation->setReferencedLayer( mLayer2->id() );
77+
mRelation->addFieldPair( "fk", "pk" );
78+
QVERIFY( mRelation->isValid() );
79+
QgsProject::instance()->relationManager()->addRelation( *mRelation.get() );
8180

8281
// add features
83-
QgsFeature ft0( vl1.fields() );
82+
QgsFeature ft0( mLayer1->fields() );
8483
ft0.setAttribute( QStringLiteral( "pk" ), 0 );
8584
ft0.setAttribute( QStringLiteral( "fk" ), 0 );
86-
vl1.startEditing();
87-
vl1.addFeature( ft0 );
88-
vl1.commitChanges();
85+
mLayer1->startEditing();
86+
mLayer1->addFeature( ft0 );
87+
mLayer1->commitChanges();
8988

90-
QgsFeature ft1( vl1.fields() );
89+
QgsFeature ft1( mLayer1->fields() );
9190
ft1.setAttribute( QStringLiteral( "pk" ), 1 );
9291
ft1.setAttribute( QStringLiteral( "fk" ), 1 );
93-
vl1.startEditing();
94-
vl1.addFeature( ft1 );
95-
vl1.commitChanges();
92+
mLayer1->startEditing();
93+
mLayer1->addFeature( ft1 );
94+
mLayer1->commitChanges();
9695

97-
QgsFeature ft2( vl2.fields() );
96+
QgsFeature ft2( mLayer2->fields() );
9897
ft2.setAttribute( QStringLiteral( "pk" ), 10 );
9998
ft2.setAttribute( QStringLiteral( "material" ), "iron" );
10099
ft2.setAttribute( QStringLiteral( "diameter" ), 120 );
101100
ft2.setAttribute( QStringLiteral( "raccord" ), "brides" );
102-
vl2.startEditing();
103-
vl2.addFeature( ft2 );
104-
vl2.commitChanges();
101+
mLayer2->startEditing();
102+
mLayer2->addFeature( ft2 );
103+
mLayer2->commitChanges();
105104

106-
QgsFeature ft3( vl2.fields() );
105+
QgsFeature ft3( mLayer2->fields() );
107106
ft3.setAttribute( QStringLiteral( "pk" ), 11 );
108107
ft3.setAttribute( QStringLiteral( "material" ), "iron" );
109108
ft3.setAttribute( QStringLiteral( "diameter" ), 120 );
110109
ft3.setAttribute( QStringLiteral( "raccord" ), "sleeve" );
111-
vl2.startEditing();
112-
vl2.addFeature( ft3 );
113-
vl2.commitChanges();
110+
mLayer2->startEditing();
111+
mLayer2->addFeature( ft3 );
112+
mLayer2->commitChanges();
114113

115-
QgsFeature ft4( vl2.fields() );
114+
QgsFeature ft4( mLayer2->fields() );
116115
ft4.setAttribute( QStringLiteral( "pk" ), 12 );
117116
ft4.setAttribute( QStringLiteral( "material" ), "steel" );
118117
ft4.setAttribute( QStringLiteral( "diameter" ), 120 );
119118
ft4.setAttribute( QStringLiteral( "raccord" ), "collar" );
120-
vl2.startEditing();
121-
vl2.addFeature( ft4 );
122-
vl2.commitChanges();
119+
mLayer2->startEditing();
120+
mLayer2->addFeature( ft4 );
121+
mLayer2->commitChanges();
122+
}
123123

124+
void TestQgsRelationReferenceWidget::cleanup()
125+
{
126+
}
127+
128+
void TestQgsRelationReferenceWidget::testChainFilter()
129+
{
124130
// init a relation reference widget
125131
QStringList filterFields = { "material", "diameter", "raccord" };
126132

127133
QgsRelationReferenceWidget w( new QWidget() );
128134
w.setChainFilters( true );
129135
w.setFilterFields( filterFields );
130-
w.setRelation( relation, true );
136+
w.setRelation( *mRelation, true );
131137
w.init();
132138

133139
// check default status for comboboxes
@@ -181,5 +187,40 @@ void TestQgsRelationReferenceWidget::testChainFilter()
181187
QCOMPARE( w.mComboBox->count(), 4 );
182188
}
183189

190+
void TestQgsRelationReferenceWidget::testChainFilterRefreshed()
191+
{
192+
// init a relation reference widget
193+
QStringList filterFields = { "material", "diameter", "raccord" };
194+
195+
QgsRelationReferenceWidget w( new QWidget() );
196+
w.setChainFilters( true );
197+
w.setFilterFields( filterFields );
198+
w.setRelation( *mRelation, true );
199+
w.init();
200+
201+
// check default status for comboboxes
202+
QList<QComboBox *> cbs = w.mFilterComboBoxes;
203+
QCOMPARE( cbs.count(), 3 );
204+
QCOMPARE( cbs[0]->currentText(), QString( "material" ) );
205+
QCOMPARE( cbs[1]->currentText(), QString( "diameter" ) );
206+
QCOMPARE( cbs[2]->currentText(), QString( "raccord" ) );
207+
208+
// update foreign key
209+
w.setForeignKey( QVariant( 12 ) );
210+
QCOMPARE( cbs[0]->currentText(), QString( "steel" ) );
211+
QCOMPARE( cbs[1]->currentText(), QString( "120" ) );
212+
QCOMPARE( cbs[2]->currentText(), QString( "collar" ) );
213+
214+
w.setForeignKey( QVariant( 10 ) );
215+
QCOMPARE( cbs[0]->currentText(), QString( "iron" ) );
216+
QCOMPARE( cbs[1]->currentText(), QString( "120" ) );
217+
QCOMPARE( cbs[2]->currentText(), QString( "brides" ) );
218+
219+
w.setForeignKey( QVariant( 11 ) );
220+
QCOMPARE( cbs[0]->currentText(), QString( "iron" ) );
221+
QCOMPARE( cbs[1]->currentText(), QString( "120" ) );
222+
QCOMPARE( cbs[2]->currentText(), QString( "sleeve" ) );
223+
}
224+
184225
QGSTEST_MAIN( TestQgsRelationReferenceWidget )
185226
#include "testqgsrelationreferencewidget.moc"

0 commit comments

Comments
 (0)