void QgsAttributeTableModel::loadAttributes() { if ( !layer() ) { return; } bool ins = false, rm = false; QgsAttributeList attributes; const QgsFields &fields = layer()->fields(); mWidgetFactories.clear(); mAttributeWidgetCaches.clear(); mWidgetConfigs.clear(); for ( int idx = 0; idx < fields.count(); ++idx ) { const QgsEditorWidgetSetup setup = QgsGui::editorWidgetRegistry()->findBest( layer(), fields[idx].name() ); QgsEditorWidgetFactory *widgetFactory = QgsGui::editorWidgetRegistry()->factory( setup.type() ); QgsFieldFormatter *fieldFormatter = QgsApplication::fieldFormatterRegistry()->fieldFormatter( setup.type() ); mWidgetFactories.append( widgetFactory ); mWidgetConfigs.append( setup.config() ); mAttributeWidgetCaches.append( fieldFormatter->createCache( layer(), idx, setup.config() ) ); mFieldFormatters.append( fieldFormatter ); attributes << idx; } if ( mFieldCount + mExtraColumns < attributes.size() + mExtraColumns ) { ins = true; beginInsertColumns( QModelIndex(), mFieldCount + mExtraColumns, attributes.size() - 1 ); } else if ( attributes.size() + mExtraColumns < mFieldCount + mExtraColumns ) { rm = true; beginRemoveColumns( QModelIndex(), attributes.size(), mFieldCount + mExtraColumns - 1 ); } mFieldCount = attributes.size(); mAttributes = attributes; for ( SortCache &cache : mSortCaches ) { if ( cache.sortFieldIndex >= mAttributes.count() ) cache.sortFieldIndex = -1; } if ( ins ) { endInsertColumns(); } else if ( rm ) { endRemoveColumns(); } }
void TestQgsField::editorWidgetSetup() { QgsField field; QgsEditorWidgetConfig config; config.insert( QStringLiteral( "a" ), "value_a" ); const QgsEditorWidgetSetup setup( QStringLiteral( "test" ), config ); field.setEditorWidgetSetup( setup ); QCOMPARE( field.editorWidgetSetup().type(), setup.type() ); QCOMPARE( field.editorWidgetSetup().config(), setup.config() ); }
QgsEditorWidgetWrapper* QgsEditorWidgetRegistry::create( QgsVectorLayer* vl, int fieldIdx, QWidget* editor, QWidget* parent, const QgsAttributeEditorContext &context ) { const QString fieldName = vl->fields().field( fieldIdx ).name(); const QgsEditorWidgetSetup setup = findBest( vl, fieldName ); return create( setup.type(), vl, fieldIdx, setup.config(), editor, parent, context ); }
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 ); } } } }