void QgsAttributeTableModel::loadAttributes() { if ( !layer() ) { return; } bool ins = false, rm = false; QgsAttributeList attributes; const QgsFields& fields = layer()->pendingFields(); mWidgetFactories.clear(); mAttributeWidgetCaches.clear(); mWidgetConfigs.clear(); for ( int idx = 0; idx < fields.count(); ++idx ) { QgsEditorWidgetFactory* widgetFactory = QgsEditorWidgetRegistry::instance()->factory( layer()->editorWidgetV2( idx ) ); if ( !widgetFactory || !layer() ) continue; mWidgetFactories.append( widgetFactory ); mWidgetConfigs.append( layer()->editorWidgetV2Config( idx ) ); mAttributeWidgetCaches.append( widgetFactory->createCache( layer(), idx, mWidgetConfigs.last() ) ); attributes << idx; } if ( mFieldCount < attributes.size() ) { ins = true; beginInsertColumns( QModelIndex(), mFieldCount, attributes.size() - 1 ); } else if ( attributes.size() < mFieldCount ) { rm = true; beginRemoveColumns( QModelIndex(), attributes.size(), mFieldCount - 1 ); } mFieldCount = attributes.size(); mAttributes = attributes; if ( ins ) { endInsertColumns(); } else if ( rm ) { endRemoveColumns(); } }
void QgsAttributeTypeDialog::defaultExpressionChanged() { QString expression = mExpressionWidget->expression(); if ( expression.isEmpty() ) { mDefaultPreviewLabel->setText( QString() ); return; } QgsExpressionContext context = mLayer->createExpressionContext(); if ( !mPreviewFeature.isValid() ) { // get first feature QgsFeatureIterator it = mLayer->getFeatures( QgsFeatureRequest().setLimit( 1 ) ); it.nextFeature( mPreviewFeature ); } context.setFeature( mPreviewFeature ); QgsExpression exp = QgsExpression( expression ); exp.prepare( &context ); if ( exp.hasParserError() ) { mDefaultPreviewLabel->setText( "<i>" + exp.parserErrorString() + "</i>" ); return; } QVariant val = exp.evaluate( &context ); if ( exp.hasEvalError() ) { mDefaultPreviewLabel->setText( "<i>" + exp.evalErrorString() + "</i>" ); return; } QString previewText = val.toString(); QgsEditorWidgetFactory *factory = QgsEditorWidgetRegistry::instance()->factory( editorWidgetType() ); if ( factory ) { previewText = factory->representValue( mLayer, mFieldIdx, editorWidgetConfig(), QVariant(), val ); } mDefaultPreviewLabel->setText( "<i>" + previewText + "</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 ); } }
void QgsVectorLayerSaveAsDialog::on_mFormatComboBox_currentIndexChanged( int idx ) { Q_UNUSED( idx ); browseFilename->setEnabled( true ); leFilename->setEnabled( true ); if ( format() == "KML" ) { mEncodingComboBox->setCurrentIndex( mEncodingComboBox->findText( "UTF-8" ) ); mEncodingComboBox->setDisabled( true ); mAttributesSelection->setChecked( true ); } else if ( format() == "DXF" ) { mAttributesSelection->setChecked( true ); mAttributesSelection->setDisabled( true ); } else { mEncodingComboBox->setEnabled( true ); mAttributesSelection->setEnabled( true ); } if ( mLayer ) { mAttributeTable->setRowCount( mLayer->fields().count() ); bool foundFieldThatCanBeExportedAsDisplayedValue = false; for ( int i = 0; i < mLayer->fields().size(); ++i ) { QgsEditorWidgetFactory *factory; if ( mLayer->editFormConfig()->widgetType( i ) != "TextEdit" && ( factory = QgsEditorWidgetRegistry::instance()->factory( mLayer->editFormConfig()->widgetType( i ) ) ) ) { 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" ) ); mReplaceRawFieldValues->setVisible( false ); } mAttributeTableItemChangedSlotEnabled = false; for ( int i = 0; i < mLayer->fields().size(); ++i ) { const 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( 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 ) { QgsEditorWidgetFactory *factory; if ( mLayer->editFormConfig()->widgetType( i ) != "TextEdit" && ( factory = QgsEditorWidgetRegistry::instance()->factory( mLayer->editFormConfig()->widgetType( i ) ) ) ) { item = new QTableWidgetItem( tr( "Use %1" ).arg( factory->name() ) ); item->setFlags( Qt::ItemIsUserCheckable ); item->setCheckState( 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; mReplaceRawFieldValues->setEnabled( false ); 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 ); } }