@@ -108,27 +108,31 @@ void QgsMergeAttributesDialog::createTableWidgetContents()
108
108
mTableWidget ->setRowCount ( mFeatureList .size () + 2 );
109
109
110
110
// create combo boxes and insert attribute names
111
- const QgsFields& fields = mVectorLayer ->fields ();
111
+ mFields = mVectorLayer ->fields ();
112
112
QSet<int > pkAttrList = mVectorLayer ->pkAttributeList ().toSet ();
113
113
114
114
int col = 0 ;
115
- for ( int idx = 0 ; idx < fields.count (); ++idx )
115
+ mHiddenAttributes .clear ();
116
+ for ( int idx = 0 ; idx < mFields .count (); ++idx )
116
117
{
117
118
if ( mVectorLayer ->editFormConfig ()->widgetType ( idx ) == " Hidden" ||
118
119
mVectorLayer ->editFormConfig ()->widgetType ( idx ) == " Immutable" )
120
+ {
121
+ mHiddenAttributes .insert ( idx );
119
122
continue ;
123
+ }
120
124
121
125
mTableWidget ->setColumnCount ( col + 1 );
122
126
123
- QComboBox *cb = createMergeComboBox ( fields[ idx] .type () );
127
+ QComboBox *cb = createMergeComboBox ( mFields . at ( idx ) .type () );
124
128
if ( pkAttrList.contains ( idx ) )
125
129
{
126
130
cb->setCurrentIndex ( cb->findData ( " skip" ) );
127
131
}
128
132
mTableWidget ->setCellWidget ( 0 , col, cb );
129
133
130
- QTableWidgetItem *item = new QTableWidgetItem ( fields[ idx] .name () );
131
- item->setData ( Qt::UserRole , idx );
134
+ QTableWidgetItem *item = new QTableWidgetItem ( mFields . at ( idx ) .name () );
135
+ item->setData ( FieldIndex , idx );
132
136
mTableWidget ->setHorizontalHeaderItem ( col++, item );
133
137
}
134
138
@@ -144,12 +148,13 @@ void QgsMergeAttributesDialog::createTableWidgetContents()
144
148
145
149
for ( int j = 0 ; j < mTableWidget ->columnCount (); j++ )
146
150
{
147
- int idx = mTableWidget ->horizontalHeaderItem ( j )->data ( Qt::UserRole ).toInt ();
151
+ int idx = mTableWidget ->horizontalHeaderItem ( j )->data ( FieldIndex ).toInt ();
148
152
149
153
QTableWidgetItem* attributeValItem = new QTableWidgetItem ( attrs.at ( idx ).toString () );
150
154
attributeValItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
151
155
mTableWidget ->setItem ( i + 1 , j, attributeValItem );
152
- mTableWidget ->setCellWidget ( i + 1 , j, QgsAttributeEditor::createAttributeEditor ( mTableWidget , nullptr , mVectorLayer , idx, attrs.at ( idx ) ) );
156
+ QWidget* attributeWidget = QgsAttributeEditor::createAttributeEditor ( mTableWidget , nullptr , mVectorLayer , idx, attrs.at ( idx ) );
157
+ mTableWidget ->setCellWidget ( i + 1 , j, attributeWidget );
153
158
}
154
159
}
155
160
@@ -307,21 +312,21 @@ void QgsMergeAttributesDialog::refreshMergedValue( int col )
307
312
308
313
QVariant QgsMergeAttributesDialog::featureAttribute ( QgsFeatureId featureId, int col )
309
314
{
310
- int idx = mTableWidget ->horizontalHeaderItem ( col )->data ( Qt::UserRole ).toInt ();
315
+ int fieldIdx = mTableWidget ->horizontalHeaderItem ( col )->data ( FieldIndex ).toInt ();
311
316
312
317
int i;
313
318
for ( i = 0 ; i < mFeatureList .size () && mFeatureList .at ( i ).id () != featureId; i++ )
314
319
;
315
320
316
321
QVariant value;
317
322
if ( i < mFeatureList .size () &&
318
- QgsAttributeEditor::retrieveValue ( mTableWidget ->cellWidget ( i + 1 , col ), mVectorLayer , idx , value ) )
323
+ QgsAttributeEditor::retrieveValue ( mTableWidget ->cellWidget ( i + 1 , col ), mVectorLayer , fieldIdx , value ) )
319
324
{
320
325
return value;
321
326
}
322
327
else
323
328
{
324
- return QVariant ( mVectorLayer ->fields ().at ( col ).type () );
329
+ return QVariant ( mVectorLayer ->fields ().at ( fieldIdx ).type () );
325
330
}
326
331
}
327
332
@@ -508,30 +513,40 @@ QgsAttributes QgsMergeAttributesDialog::mergedAttributes() const
508
513
return QgsAttributes ();
509
514
}
510
515
511
- QgsAttributes results ( mTableWidget ->columnCount () );
512
- for ( int i = 0 ; i < mTableWidget ->columnCount (); i++ )
516
+ int widgetIndex = 0 ;
517
+ QgsAttributes results ( mFields .count () );
518
+ for ( int fieldIdx = 0 ; fieldIdx < mFields .count (); ++fieldIdx )
513
519
{
514
- int idx = mTableWidget ->horizontalHeaderItem ( i )->data ( Qt::UserRole ).toInt ();
520
+ if ( mHiddenAttributes .contains ( fieldIdx ) )
521
+ {
522
+ // hidden attribute, set to default value
523
+ if ( mVectorLayer ->dataProvider () )
524
+ results[fieldIdx] = mVectorLayer ->dataProvider ()->defaultValue ( fieldIdx );
525
+ else
526
+ results[fieldIdx] = QVariant ();
527
+ continue ;
528
+ }
515
529
516
- QComboBox *comboBox = qobject_cast<QComboBox *>( mTableWidget ->cellWidget ( 0 , i ) );
530
+ QComboBox *comboBox = qobject_cast<QComboBox *>( mTableWidget ->cellWidget ( 0 , widgetIndex ) );
517
531
if ( !comboBox )
518
532
continue ;
519
533
520
- QTableWidgetItem *currentItem = mTableWidget ->item ( mFeatureList .size () + 1 , i );
534
+ QTableWidgetItem *currentItem = mTableWidget ->item ( mFeatureList .size () + 1 , widgetIndex );
521
535
if ( !currentItem )
522
536
continue ;
523
537
524
- if ( idx >= results.count () )
525
- results.resize ( idx + 1 ); // make sure the results vector is long enough (maybe not necessary)
538
+ if ( fieldIdx >= results.count () )
539
+ results.resize ( fieldIdx + 1 ); // make sure the results vector is long enough (maybe not necessary)
526
540
527
541
if ( comboBox->itemData ( comboBox->currentIndex () ).toString () != " skip" )
528
542
{
529
- results[idx ] = currentItem->data ( Qt::DisplayRole );
543
+ results[fieldIdx ] = currentItem->data ( Qt::DisplayRole );
530
544
}
531
545
else if ( mVectorLayer ->dataProvider () )
532
546
{
533
- results[idx ] = mVectorLayer ->dataProvider ()->defaultValue ( idx );
547
+ results[fieldIdx ] = mVectorLayer ->dataProvider ()->defaultValue ( fieldIdx );
534
548
}
549
+ widgetIndex++;
535
550
}
536
551
537
552
return results;
@@ -540,9 +555,16 @@ QgsAttributes QgsMergeAttributesDialog::mergedAttributes() const
540
555
QSet<int > QgsMergeAttributesDialog::skippedAttributeIndexes () const
541
556
{
542
557
QSet<int > skipped;
543
- for ( int i = 0 ; i < mTableWidget ->columnCount (); ++i )
558
+ int widgetIndex = 0 ;
559
+ for ( int i = 0 ; i < mFields .count (); ++i )
544
560
{
545
- QComboBox *comboBox = qobject_cast<QComboBox *>( mTableWidget ->cellWidget ( 0 , i ) );
561
+ if ( mHiddenAttributes .contains ( i ) )
562
+ {
563
+ skipped << i;
564
+ continue ;
565
+ }
566
+
567
+ QComboBox *comboBox = qobject_cast<QComboBox *>( mTableWidget ->cellWidget ( 0 , widgetIndex ) );
546
568
if ( !comboBox )
547
569
{
548
570
// something went wrong, better skip this attribute
@@ -554,6 +576,7 @@ QSet<int> QgsMergeAttributesDialog::skippedAttributeIndexes() const
554
576
{
555
577
skipped << i;
556
578
}
579
+ widgetIndex++;
557
580
}
558
581
559
582
return skipped;
0 commit comments