void QgsMergeAttributesDialog::createTableWidgetContents() { //get information about attributes from vector layer if ( !mVectorLayer ) { return; } //combo box row, attributes titles, feature values and current merge results mTableWidget->setRowCount( mFeatureList.size() + 2 ); //create combo boxes and insert attribute names mFields = mVectorLayer->fields(); int col = 0; mHiddenAttributes.clear(); for ( int idx = 0; idx < mFields.count(); ++idx ) { const QgsEditorWidgetSetup setup = QgsGui::editorWidgetRegistry()->findBest( mVectorLayer, mFields.at( idx ).name() ); if ( setup.type() == QLatin1String( "Hidden" ) || setup.type() == QLatin1String( "Immutable" ) ) { mHiddenAttributes.insert( idx ); continue; } mTableWidget->setColumnCount( col + 1 ); QComboBox *cb = createMergeComboBox( mFields.at( idx ).type() ); if ( mFields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique ) { cb->setCurrentIndex( cb->findData( "skip" ) ); } mTableWidget->setCellWidget( 0, col, cb ); QTableWidgetItem *item = new QTableWidgetItem( mFields.at( idx ).name() ); item->setData( FieldIndex, idx ); mTableWidget->setHorizontalHeaderItem( col++, item ); } //insert the attribute values QStringList verticalHeaderLabels; //the id column is in the verticalHeaderLabels << tr( "Id" ); for ( int i = 0; i < mFeatureList.size(); ++i ) { verticalHeaderLabels << FID_TO_STRING( mFeatureList[i].id() ); QgsAttributes attrs = mFeatureList.at( i ).attributes(); for ( int j = 0; j < mTableWidget->columnCount(); j++ ) { int idx = mTableWidget->horizontalHeaderItem( j )->data( FieldIndex ).toInt(); const QgsEditorWidgetSetup setup = mFields.at( idx ).editorWidgetSetup(); const QgsFieldFormatter *formatter = QgsApplication::fieldFormatterRegistry()->fieldFormatter( setup.type() ); QString stringVal = formatter->representValue( mVectorLayer, idx, setup.config(), QVariant(), attrs.at( idx ) ); QTableWidgetItem *attributeValItem = new QTableWidgetItem( stringVal ); attributeValItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); mTableWidget->setItem( i + 1, j, attributeValItem ); } } //merge verticalHeaderLabels << tr( "Merge" ); mTableWidget->setVerticalHeaderLabels( verticalHeaderLabels ); for ( int j = 0; j < mTableWidget->columnCount(); j++ ) { QTableWidgetItem *mergedItem = new QTableWidgetItem(); mergedItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable ); mTableWidget->setItem( mTableWidget->rowCount() - 1, j, mergedItem ); } //insert currently merged values for ( int i = 0; i < mTableWidget->columnCount(); ++i ) { refreshMergedValue( i ); } //initially set any fields with default values/default value clauses to that value for ( int j = 0; j < mTableWidget->columnCount(); j++ ) { int idx = mTableWidget->horizontalHeaderItem( j )->data( FieldIndex ).toInt(); bool setToManual = false; if ( !mVectorLayer->dataProvider()->defaultValueClause( idx ).isEmpty() ) { mTableWidget->item( mTableWidget->rowCount() - 1, j )->setData( Qt::DisplayRole, mVectorLayer->dataProvider()->defaultValueClause( idx ) ); setToManual = true; } else { QVariant v = mVectorLayer->dataProvider()->defaultValue( idx ); if ( v.isValid() ) { mTableWidget->item( mTableWidget->rowCount() - 1, j )->setData( Qt::DisplayRole, v ); setToManual = true; } } if ( setToManual ) { QComboBox *currentComboBox = qobject_cast<QComboBox *>( mTableWidget->cellWidget( 0, j ) ); if ( currentComboBox ) { currentComboBox->blockSignals( true ); currentComboBox->setCurrentIndex( currentComboBox->findData( "manual" ) ); currentComboBox->blockSignals( false ); } } } }
void QgsMergeAttributesDialog::createTableWidgetContents() { //get information about attributes from vector layer if ( !mVectorLayer ) { return; } //combo box row, attributes titles, feature values and current merge results mTableWidget->setRowCount( mFeatureList.size() + 2 ); //create combo boxes and insert attribute names mFields = mVectorLayer->fields(); QSet<int> pkAttrList = mVectorLayer->pkAttributeList().toSet(); int col = 0; mHiddenAttributes.clear(); for ( int idx = 0; idx < mFields.count(); ++idx ) { const QgsEditorWidgetSetup setup = QgsEditorWidgetRegistry::instance()->findBest( mVectorLayer, mFields.at( idx ).name() ); if ( setup.type() == "Hidden" || setup.type() == "Immutable" ) { mHiddenAttributes.insert( idx ); continue; } mTableWidget->setColumnCount( col + 1 ); QComboBox *cb = createMergeComboBox( mFields.at( idx ).type() ); if ( pkAttrList.contains( idx ) ) { cb->setCurrentIndex( cb->findData( "skip" ) ); } mTableWidget->setCellWidget( 0, col, cb ); QTableWidgetItem *item = new QTableWidgetItem( mFields.at( idx ).name() ); item->setData( FieldIndex, idx ); mTableWidget->setHorizontalHeaderItem( col++, item ); } //insert the attribute values QStringList verticalHeaderLabels; //the id column is in the verticalHeaderLabels << tr( "Id" ); QgsAttributeEditorContext context; for ( int i = 0; i < mFeatureList.size(); ++i ) { verticalHeaderLabels << FID_TO_STRING( mFeatureList[i].id() ); QgsAttributes attrs = mFeatureList.at( i ).attributes(); for ( int j = 0; j < mTableWidget->columnCount(); j++ ) { int idx = mTableWidget->horizontalHeaderItem( j )->data( FieldIndex ).toInt(); QTableWidgetItem* attributeValItem = new QTableWidgetItem( attrs.at( idx ).toString() ); attributeValItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); mTableWidget->setItem( i + 1, j, attributeValItem ); QgsEditorWidgetWrapper* eww = QgsEditorWidgetRegistry::instance()->create( mVectorLayer, idx, nullptr, mTableWidget, context ); if ( eww ) { eww->setValue( attrs.at( idx ) ); } mTableWidget->setCellWidget( i + 1, j, eww->widget() ); } } //merge verticalHeaderLabels << tr( "Merge" ); mTableWidget->setVerticalHeaderLabels( verticalHeaderLabels ); //insert currently merged values for ( int i = 0; i < mTableWidget->columnCount(); ++i ) { refreshMergedValue( i ); } }
void QgsMergeAttributesDialog::createTableWidgetContents() { //get information about attributes from vector layer if ( !mVectorLayer ) { return; } //combo box row, attributes titles, feature values and current merge results mTableWidget->setRowCount( mFeatureList.size() + 2 ); //create combo boxes and insert attribute names const QgsFields& fields = mVectorLayer->pendingFields(); QgsAttributeList pkAttrList = mVectorLayer->pendingPkAttributesList(); int col = 0; for ( int idx = 0; idx < fields.count(); ++idx ) { if ( mVectorLayer->editType( idx ) == QgsVectorLayer::Hidden || mVectorLayer->editType( idx ) == QgsVectorLayer::Immutable ) continue; mTableWidget->setColumnCount( col + 1 ); QComboBox *cb = createMergeComboBox( fields[idx].type() ); if ( pkAttrList.contains( idx ) ) { cb->setCurrentIndex( cb->findText( tr( "Skip attribute" ) ) ); } mTableWidget->setCellWidget( 0, col, cb ); QTableWidgetItem *item = new QTableWidgetItem( fields[idx].name() ); item->setData( Qt::UserRole, idx ); mTableWidget->setHorizontalHeaderItem( col++, item ); } //insert the attribute values QStringList verticalHeaderLabels; //the id column is in the verticalHeaderLabels << tr( "Id" ); for ( int i = 0; i < mFeatureList.size(); ++i ) { verticalHeaderLabels << FID_TO_STRING( mFeatureList[i].id() ); const QgsAttributes &attrs = mFeatureList[i].attributes(); for ( int j = 0; j < mTableWidget->columnCount(); j++ ) { int idx = mTableWidget->horizontalHeaderItem( j )->data( Qt::UserRole ).toInt(); QTableWidgetItem* attributeValItem = new QTableWidgetItem( attrs[idx].toString() ); attributeValItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); mTableWidget->setItem( i + 1, j, attributeValItem ); mTableWidget->setCellWidget( i + 1, j, QgsAttributeEditor::createAttributeEditor( mTableWidget, NULL, mVectorLayer, idx, attrs[idx] ) ); } } //merge verticalHeaderLabels << tr( "Merge" ); mTableWidget->setVerticalHeaderLabels( verticalHeaderLabels ); //insert currently merged values for ( int i = 0; i < mTableWidget->columnCount(); ++i ) { refreshMergedValue( i ); } }
void QgsMergeAttributesDialog::createTableWidgetContents() { //get information about attributes from vector layer if ( !mVectorLayer ) { return; } //combo box row, attributes titles, feature values and current merge results mTableWidget->setRowCount( mFeatureList.size() + 2 ); //create combo boxes and insert attribute names const QgsFieldMap& fieldMap = mVectorLayer->pendingFields(); int col = 0; for ( QgsFieldMap::const_iterator fieldIt = fieldMap.constBegin(); fieldIt != fieldMap.constEnd(); ++fieldIt ) { if ( mVectorLayer->editType( fieldIt.key() ) == QgsVectorLayer::Hidden || mVectorLayer->editType( fieldIt.key() ) == QgsVectorLayer::Immutable ) continue; mTableWidget->setColumnCount( col + 1 ); mTableWidget->setCellWidget( 0, col, createMergeComboBox( fieldIt->type() ) ); QTableWidgetItem *item = new QTableWidgetItem( fieldIt.value().name() ); item->setData( Qt::UserRole, fieldIt.key() ); mTableWidget->setHorizontalHeaderItem( col++, item ); } //insert the attribute values QStringList verticalHeaderLabels; //the id column is in the verticalHeaderLabels << tr( "Id" ); for ( int i = 0; i < mFeatureList.size(); ++i ) { verticalHeaderLabels << QString::number( mFeatureList[i].id() ); const QgsAttributeMap &attrs = mFeatureList[i].attributeMap(); for ( int j = 0; j < mTableWidget->columnCount(); j++ ) { int idx = mTableWidget->horizontalHeaderItem( j )->data( Qt::UserRole ).toInt(); QTableWidgetItem* attributeValItem = new QTableWidgetItem( attrs[idx].toString() ); attributeValItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); mTableWidget->setItem( i + 1, j, attributeValItem ); mTableWidget->setCellWidget( i + 1, j, QgsAttributeEditor::createAttributeEditor( mTableWidget, NULL, mVectorLayer, idx, attrs[idx] ) ); } } //merge verticalHeaderLabels << tr( "Merge" ); mTableWidget->setVerticalHeaderLabels( verticalHeaderLabels ); //insert currently merged values for ( int i = 0; i < mTableWidget->columnCount(); ++i ) { refreshMergedValue( i ); } }