Skip to content

Commit 8246d96

Browse files
committedDec 8, 2015
Add GUI elements for N:M relation configuration
1 parent c56588e commit 8246d96

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed
 

‎src/app/qgsfieldsproperties.cpp

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ QgsFieldsProperties::QgsFieldsProperties( QgsVectorLayer *layer, QWidget* parent
113113
mRelationsList->setHorizontalHeaderItem( RelNameCol, new QTableWidgetItem( tr( "Name" ) ) );
114114
mRelationsList->setHorizontalHeaderItem( RelLayerCol, new QTableWidgetItem( tr( "Layer" ) ) );
115115
mRelationsList->setHorizontalHeaderItem( RelFieldCol, new QTableWidgetItem( tr( "Field" ) ) );
116+
mRelationsList->setHorizontalHeaderItem( RelNmCol, new QTableWidgetItem( tr( "Cardinality" ) ) );
116117
mRelationsList->verticalHeader()->hide();
118+
mRelationsList->horizontalHeader()->setStretchLastSection( true );
117119

118120
// Init function stuff
119121
mInitCodeSourceComboBox->addItem( tr( "" ) );
@@ -331,11 +333,11 @@ void QgsFieldsProperties::loadRelations()
331333
{
332334
mRelationsList->setRowCount( 0 );
333335

334-
QList<QgsRelation> relations = QgsProject::instance()->relationManager()->referencedRelations( mLayer );
336+
mRelations = QgsProject::instance()->relationManager()->referencedRelations( mLayer );
335337

336338
int idx = 0;
337339

338-
Q_FOREACH ( const QgsRelation& relation, relations )
340+
Q_FOREACH ( const QgsRelation& relation, mRelations )
339341
{
340342
mRelationsList->insertRow( idx );
341343

@@ -357,6 +359,29 @@ void QgsFieldsProperties::loadRelations()
357359
item->setFlags( Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable );
358360
mRelationsList->setItem( idx, RelIdCol, item );
359361

362+
QComboBox* nmCombo = new QComboBox( mRelationsList );
363+
nmCombo->addItem( tr( "Many to one relation" ) );
364+
Q_FOREACH ( const QgsRelation& nmrel, QgsProject::instance()->relationManager()->referencingRelations( relation.referencingLayer() ) )
365+
{
366+
if ( nmrel.fieldPairs().first().referencingField() != relation.fieldPairs().first().referencingField() )
367+
nmCombo->addItem( QString( "%1 (%2)" ).arg( nmrel.referencedLayer()->name() ).arg( nmrel.fieldPairs().first().referencedField() ), nmrel.id() );
368+
369+
QgsEditorWidgetConfig cfg = mLayer->editFormConfig()->widgetConfig( relation.id() );
370+
371+
QVariant nmrelcfg = cfg.value( "nm-rel" );
372+
373+
int idx = nmCombo->findData( nmrelcfg.toString() );
374+
375+
if ( idx != -1 )
376+
nmCombo->setCurrentIndex( idx );
377+
}
378+
379+
if ( nmCombo->count() == 1 )
380+
{
381+
nmCombo->setEnabled( false );
382+
}
383+
384+
mRelationsList->setCellWidget( idx, RelNmCol, nmCombo );
360385
++idx;
361386
}
362387
}
@@ -894,7 +919,9 @@ void QgsFieldsProperties::apply()
894919
}
895920
}
896921

897-
//tabs and groups
922+
923+
924+
// tabs and groups
898925
mLayer->clearAttributeEditorWidgets();
899926
for ( int t = 0; t < mDesignerTree->invisibleRootItem()->childCount(); t++ )
900927
{
@@ -917,8 +944,27 @@ void QgsFieldsProperties::apply()
917944

918945
mLayer->setExcludeAttributesWMS( excludeAttributesWMS );
919946
mLayer->setExcludeAttributesWFS( excludeAttributesWFS );
920-
}
921947

948+
// relations
949+
for ( int i = 0; i < mRelationsList->rowCount(); ++i )
950+
{
951+
QgsEditorWidgetConfig cfg;
952+
953+
QComboBox* cb = qobject_cast<QComboBox*>( mRelationsList->cellWidget( i, RelNmCol ) );
954+
QVariant otherRelation = cb->itemData( cb->currentIndex() );
955+
956+
if ( otherRelation.isValid() )
957+
{
958+
cfg["nm-rel"] = otherRelation.toString();
959+
}
960+
961+
DesignerTreeItemData itemData = mRelationsList->item( i, RelNameCol )->data( DesignerTreeRole ).value<DesignerTreeItemData>();
962+
963+
QString relationName = itemData.name();
964+
965+
mLayer->editFormConfig()->setWidgetConfig( relationName, cfg );
966+
}
967+
}
922968
/*
923969
* FieldConfig implementation
924970
*/

‎src/app/qgsfieldsproperties.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ class APP_EXPORT QgsFieldsProperties : public QWidget, private Ui_QgsFieldsPrope
166166
FieldConfig configForRow( int row );
167167
void setConfigForRow( int row, const FieldConfig& cfg );
168168

169+
QList<QgsRelation> mRelations;
170+
169171
QgsVectorLayer* mLayer;
170172
DesignerTree* mDesignerTree;
171173
DragList* mFieldsList;
@@ -198,6 +200,7 @@ class APP_EXPORT QgsFieldsProperties : public QWidget, private Ui_QgsFieldsPrope
198200
RelLayerCol,
199201
RelFieldCol,
200202
RelIdCol,
203+
RelNmCol,
201204
RelColCount
202205
};
203206

0 commit comments

Comments
 (0)
Please sign in to comment.