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() ); }
QgsEditorWidgetSetup QgsEditorWidgetRegistry::findBest( const QgsVectorLayer *vl, const QString &fieldName ) const { QgsFields fields = vl->fields(); int index = fields.indexOf( fieldName ); if ( index > -1 ) { QgsEditorWidgetSetup setup = vl->fields().at( index ).editorWidgetSetup(); if ( !setup.isNull() ) return setup; } return mAutoConf.editorWidgetSetup( vl, fieldName ); }
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 ); } } } }
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 QgsVectorLayerSaveAsDialog::on_mFormatComboBox_currentIndexChanged( int idx ) { Q_UNUSED( idx ); browseFilename->setEnabled( true ); leFilename->setEnabled( true ); bool selectAllFields = true; bool fieldsAsDisplayedValues = false; const QString sFormat( format() ); if ( sFormat == "KML" ) { mAttributesSelection->setEnabled( true ); selectAllFields = false; } else if ( sFormat == "DXF" ) { mAttributesSelection->setEnabled( false ); selectAllFields = false; } else { mAttributesSelection->setEnabled( true ); fieldsAsDisplayedValues = ( sFormat == "CSV" || sFormat == "XLS" || sFormat == "XLSX" || sFormat == "ODS" ); } leLayername->setEnabled( sFormat == "KML" || sFormat == "GPKG" || sFormat == "XLSX" || sFormat == "ODS" || sFormat == "FileGDB" || sFormat == "SQLite" || sFormat == "SpatiaLite" ); if ( !leLayername->isEnabled() ) leLayername->setText( QString() ); else if ( leLayername->text().isEmpty() && !leFilename->text().isEmpty() ) { QString layerName = QFileInfo( leFilename->text() ).baseName(); leLayername->setText( layerName ) ; } if ( mLayer ) { mAttributeTable->setRowCount( mLayer->fields().count() ); bool foundFieldThatCanBeExportedAsDisplayedValue = false; for ( int i = 0; i < mLayer->fields().size(); ++i ) { const QgsEditorWidgetSetup setup = QgsEditorWidgetRegistry::instance()->findBest( mLayer, mLayer->fields()[i].name() ); if ( setup.type() != "TextEdit" && QgsEditorWidgetRegistry::instance()->factory( setup.type() ) ) { foundFieldThatCanBeExportedAsDisplayedValue = true; break; } } if ( foundFieldThatCanBeExportedAsDisplayedValue ) { mAttributeTable->setColumnCount( 3 ); mAttributeTable->setHorizontalHeaderLabels( QStringList() << tr( "Name" ) << tr( "Type" ) << tr( "Replace with displayed values" ) ); } else { mAttributeTable->setColumnCount( 2 ); mAttributeTable->setHorizontalHeaderLabels( QStringList() << tr( "Name" ) << tr( "Type" ) ); } mAttributeTableItemChangedSlotEnabled = false; for ( int i = 0; i < mLayer->fields().size(); ++i ) { QgsField fld = mLayer->fields().at( i ); Qt::ItemFlags flags = mLayer->providerType() != "oracle" || !fld.typeName().contains( "SDO_GEOMETRY" ) ? Qt::ItemIsEnabled : Qt::NoItemFlags; QTableWidgetItem *item; item = new QTableWidgetItem( fld.name() ); item->setFlags( flags | Qt::ItemIsUserCheckable ); item->setCheckState(( selectAllFields ) ? Qt::Checked : Qt::Unchecked ); mAttributeTable->setItem( i, COLUMN_IDX_NAME, item ); item = new QTableWidgetItem( fld.typeName() ); item->setFlags( flags ); mAttributeTable->setItem( i, COLUMN_IDX_TYPE, item ); if ( foundFieldThatCanBeExportedAsDisplayedValue ) { const QgsEditorWidgetSetup setup = QgsEditorWidgetRegistry::instance()->findBest( mLayer, mLayer->fields()[i].name() ); QgsEditorWidgetFactory *factory = nullptr; if ( flags == Qt::ItemIsEnabled && setup.type() != "TextEdit" && ( factory = QgsEditorWidgetRegistry::instance()->factory( setup.type() ) ) ) { item = new QTableWidgetItem( tr( "Use %1" ).arg( factory->name() ) ); item->setFlags(( selectAllFields ) ? ( Qt::ItemIsEnabled | Qt::ItemIsUserCheckable ) : Qt::ItemIsUserCheckable ); item->setCheckState(( selectAllFields && fieldsAsDisplayedValues ) ? Qt::Checked : Qt::Unchecked ); mAttributeTable->setItem( i, COLUMN_IDX_EXPORT_AS_DISPLAYED_VALUE, item ); } else { item = new QTableWidgetItem(); item->setFlags( Qt::NoItemFlags ); mAttributeTable->setItem( i, COLUMN_IDX_EXPORT_AS_DISPLAYED_VALUE, item ); } } } mAttributeTableItemChangedSlotEnabled = true; mReplaceRawFieldValuesStateChangedSlotEnabled = false; mReplaceRawFieldValues->setChecked( selectAllFields && fieldsAsDisplayedValues ); mReplaceRawFieldValuesStateChangedSlotEnabled = true; mReplaceRawFieldValues->setEnabled( selectAllFields ); mReplaceRawFieldValues->setVisible( foundFieldThatCanBeExportedAsDisplayedValue ); mAttributeTable->resizeColumnsToContents(); } QgsVectorFileWriter::MetaData driverMetaData; while ( mDatasourceOptionsGroupBox->layout()->count() ) { QLayoutItem* item = mDatasourceOptionsGroupBox->layout()->takeAt( 0 ); delete item->widget(); delete item; } while ( mLayerOptionsGroupBox->layout()->count() ) { QLayoutItem* item = mLayerOptionsGroupBox->layout()->takeAt( 0 ); delete item->widget(); delete item; } // workaround so the Q_FOREACH macro does not get confused by the ',' typedef QPair<QLabel*, QWidget*> LabelControlPair; if ( QgsVectorFileWriter::driverMetadata( format(), driverMetaData ) ) { if ( driverMetaData.driverOptions.size() != 0 ) { mDatasourceOptionsGroupBox->setVisible( true ); QList<QPair<QLabel*, QWidget*> > controls = createControls( driverMetaData.driverOptions ); QFormLayout* datasourceLayout = dynamic_cast<QFormLayout*>( mDatasourceOptionsGroupBox->layout() ); Q_FOREACH ( LabelControlPair control, controls ) { datasourceLayout->addRow( control.first, control.second ); } }