void QgsVectorLayerProperties::loadRows() { QObject::disconnect( tblAttributes, SIGNAL( cellChanged( int, int ) ), this, SLOT( on_tblAttributes_cellChanged( int, int ) ) ); const QgsFieldMap &fields = layer->pendingFields(); tblAttributes->clear(); tblAttributes->setColumnCount( attrColCount ); tblAttributes->setRowCount( fields.size() ); tblAttributes->setHorizontalHeaderItem( attrIdCol, new QTableWidgetItem( tr( "Id" ) ) ); tblAttributes->setHorizontalHeaderItem( attrNameCol, new QTableWidgetItem( tr( "Name" ) ) ); tblAttributes->setHorizontalHeaderItem( attrTypeCol, new QTableWidgetItem( tr( "Type" ) ) ); tblAttributes->setHorizontalHeaderItem( attrLengthCol, new QTableWidgetItem( tr( "Length" ) ) ); tblAttributes->setHorizontalHeaderItem( attrPrecCol, new QTableWidgetItem( tr( "Precision" ) ) ); tblAttributes->setHorizontalHeaderItem( attrCommentCol, new QTableWidgetItem( tr( "Comment" ) ) ); tblAttributes->setHorizontalHeaderItem( attrEditTypeCol, new QTableWidgetItem( tr( "Edit widget" ) ) ); tblAttributes->setHorizontalHeaderItem( attrAliasCol, new QTableWidgetItem( tr( "Alias" ) ) ); tblAttributes->horizontalHeader()->setResizeMode( 1, QHeaderView::Stretch ); tblAttributes->horizontalHeader()->setResizeMode( 7, QHeaderView::Stretch ); tblAttributes->setSelectionBehavior( QAbstractItemView::SelectRows ); tblAttributes->setSelectionMode( QAbstractItemView::ExtendedSelection ); tblAttributes->verticalHeader()->hide(); int row = 0; for ( QgsFieldMap::const_iterator it = fields.begin(); it != fields.end(); it++, row++ ) setRow( row, it.key(), it.value() ); tblAttributes->resizeColumnsToContents(); QObject::connect( tblAttributes, SIGNAL( cellChanged( int, int ) ), this, SLOT( on_tblAttributes_cellChanged( int, int ) ) ); }
void QgsVectorLayerProperties::loadRows() { const QgsFieldMap &fields = layer->pendingFields(); tblAttributes->clear(); tblAttributes->setColumnCount( 8 ); tblAttributes->setRowCount( fields.size() ); tblAttributes->setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "id" ) ) ); tblAttributes->setHorizontalHeaderItem( 1, new QTableWidgetItem( tr( "name" ) ) ); tblAttributes->setHorizontalHeaderItem( 2, new QTableWidgetItem( tr( "type" ) ) ); tblAttributes->setHorizontalHeaderItem( 3, new QTableWidgetItem( tr( "length" ) ) ); tblAttributes->setHorizontalHeaderItem( 4, new QTableWidgetItem( tr( "precision" ) ) ); tblAttributes->setHorizontalHeaderItem( 5, new QTableWidgetItem( tr( "comment" ) ) ); tblAttributes->setHorizontalHeaderItem( 6, new QTableWidgetItem( tr( "edit widget" ) ) ); tblAttributes->setHorizontalHeaderItem( 7, new QTableWidgetItem( tr( "values" ) ) ); tblAttributes->setSelectionBehavior( QAbstractItemView::SelectRows ); tblAttributes->setSelectionMode( QAbstractItemView::MultiSelection ); int row = 0; for ( QgsFieldMap::const_iterator it = fields.begin(); it != fields.end(); it++, row++ ) setRow( row, it.key(), it.value() ); tblAttributes->resizeColumnsToContents(); }
bool QgsZonalStatisticsDialog::prefixIsValid( const QString& prefix ) const { QgsVectorLayer* vl = polygonLayer(); if ( !vl ) { return false; } QgsVectorDataProvider* dp = vl->dataProvider(); if ( !dp ) { return false; } QgsFieldMap providerFieldMap = dp->fields(); QgsFieldMap::const_iterator it = providerFieldMap.constBegin(); QString currentFieldName; for ( ; it != providerFieldMap.constEnd(); ++it ) { currentFieldName = it.value().name(); if ( currentFieldName == ( prefix + "mean" ) || currentFieldName == ( prefix + "sum" ) || currentFieldName == ( prefix + "count" ) ) { return false; } } return true; }
void RgLineVectorLayerSettingsWidget::on_mcbLayers_selectItem() { mcbDirection->clear(); mcbSpeed->clear(); mcbDirection->insertItem( 0, tr( "Always use default" ) ); mcbSpeed->insertItem( 0, tr( "Always use default" ) ); QgsVectorLayer* vl = selectedLayer(); if ( !vl ) return; QgsVectorDataProvider* provider = vl->dataProvider(); if ( !provider ) return; const QgsFieldMap& fields = provider->fields(); QgsFieldMap::const_iterator it; for ( it = fields.constBegin(); it != fields.constEnd(); ++it ) { QgsField currentField = it.value(); QVariant currentType = currentField.type(); if ( currentType == QVariant::Int || currentType == QVariant::String ) { mcbDirection->insertItem( 1, currentField.name() ); } if ( currentType == QVariant::Int || currentType == QVariant::Double ) { mcbSpeed->insertItem( 1, currentField.name() ); } } } // RgDSettingsDlg::on_mcbLayers_selectItem()
void QgsLabelingGui::populateDataDefinedCombos( QgsPalLayerSettings& s ) { QList<QComboBox*> comboList; comboList << mSizeAttributeComboBox; comboList << mColorAttributeComboBox; comboList << mBoldAttributeComboBox; comboList << mItalicAttributeComboBox; comboList << mUnderlineAttributeComboBox; comboList << mStrikeoutAttributeComboBox; comboList << mFontFamilyAttributeComboBox; comboList << mBufferSizeAttributeComboBox; comboList << mBufferColorAttributeComboBox; comboList << mXCoordinateComboBox; comboList << mYCoordinateComboBox; comboList << mHorizontalAlignmentComboBox; comboList << mVerticalAlignmentComboBox; comboList << mLabelDistanceComboBox; comboList << mRotationComboBox; QList<QComboBox*>::iterator comboIt = comboList.begin(); for ( ; comboIt != comboList.end(); ++comboIt ) { ( *comboIt )->addItem( "", QVariant() ); } const QgsFieldMap& fields = mLayer->dataProvider()->fields(); for ( QgsFieldMap::const_iterator it = fields.constBegin(); it != fields.constEnd(); it++ ) { for ( comboIt = comboList.begin(); comboIt != comboList.end(); ++comboIt ) { ( *comboIt )->addItem( it.value().name(), it.key() ); } } //set current combo boxes to already existing indices setCurrentComboValue( mSizeAttributeComboBox, s, QgsPalLayerSettings::Size ); setCurrentComboValue( mColorAttributeComboBox, s, QgsPalLayerSettings::Color ); setCurrentComboValue( mBoldAttributeComboBox, s, QgsPalLayerSettings::Bold ); setCurrentComboValue( mItalicAttributeComboBox, s, QgsPalLayerSettings::Italic ); setCurrentComboValue( mUnderlineAttributeComboBox, s, QgsPalLayerSettings::Underline ); setCurrentComboValue( mStrikeoutAttributeComboBox, s, QgsPalLayerSettings::Strikeout ); setCurrentComboValue( mFontFamilyAttributeComboBox, s, QgsPalLayerSettings::Family ); setCurrentComboValue( mBufferSizeAttributeComboBox, s , QgsPalLayerSettings::BufferSize ); setCurrentComboValue( mBufferColorAttributeComboBox, s, QgsPalLayerSettings::BufferColor ); setCurrentComboValue( mXCoordinateComboBox, s, QgsPalLayerSettings::PositionX ); setCurrentComboValue( mYCoordinateComboBox, s, QgsPalLayerSettings::PositionY ); setCurrentComboValue( mHorizontalAlignmentComboBox, s, QgsPalLayerSettings::Hali ); setCurrentComboValue( mVerticalAlignmentComboBox, s, QgsPalLayerSettings::Vali ); setCurrentComboValue( mLabelDistanceComboBox, s, QgsPalLayerSettings::LabelDistance ); setCurrentComboValue( mRotationComboBox, s, QgsPalLayerSettings::Rotation ); }
QgsDelAttrDialog::QgsDelAttrDialog( const QgsVectorLayer* vl ): QDialog() { setupUi( this ); if ( vl ) { listBox2->clear(); const QgsFieldMap layerAttributes = vl->pendingFields(); QgsFieldMap::const_iterator attIt = layerAttributes.constBegin(); for ( ; attIt != layerAttributes.constEnd(); ++attIt ) { QListWidgetItem* item = new QListWidgetItem( attIt.value().name(), listBox2 ); item->setData( Qt::UserRole, attIt.key() ); } } }
void QgsFieldCalculator::populateFields() { if ( !mVectorLayer ) return; const QgsFieldMap fieldMap = mVectorLayer->pendingFields(); QgsFieldMap::const_iterator fieldIt = fieldMap.constBegin(); for ( ; fieldIt != fieldMap.constEnd(); ++fieldIt ) { QString fieldName = fieldIt.value().name(); //insert into field list and field combo box mFieldMap.insert( fieldName, fieldIt.key() ); mExistingFieldComboBox->addItem( fieldName ); } }
QgsVectorFieldSymbolLayerWidget::QgsVectorFieldSymbolLayerWidget( const QgsVectorLayer* vl, QWidget* parent ): QgsSymbolLayerV2Widget( parent, vl ), mLayer( 0 ) { setupUi( this ); if ( mVectorLayer ) { const QgsFieldMap& fm = mVectorLayer->pendingFields(); QgsFieldMap::const_iterator fieldIt = fm.constBegin(); mXAttributeComboBox->addItem( "" ); mYAttributeComboBox->addItem( "" ); for ( ; fieldIt != fm.constEnd(); ++fieldIt ) { QString fieldName = fieldIt.value().name(); mXAttributeComboBox->addItem( fieldName ); mYAttributeComboBox->addItem( fieldName ); } } }
QMap<int, QString> QgsComposerAttributeTable::getHeaderLabels() const { QMap<int, QString> header; if ( mVectorLayer ) { QgsFieldMap vectorFields = mVectorLayer->pendingFields(); QgsFieldMap::const_iterator fieldIt = vectorFields.constBegin(); for ( ; fieldIt != vectorFields.constEnd(); ++fieldIt ) { if ( mDisplayAttributes.size() > 0 && !mDisplayAttributes.contains( fieldIt.key() ) ) { continue; } header.insert( fieldIt.key(), attributeDisplayName( fieldIt.key(), fieldIt.value().name() ) ); } } return header; }
void QgsFieldCalculator::accept() { // Set up QgsDistanceArea each time we (re-)calculate QgsDistanceArea myDa; myDa.setSourceCrs( mVectorLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ); myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); QString calcString = builder->expressionText(); QgsExpression exp( calcString ); if ( !mVectorLayer || !mVectorLayer->isEditable() ) return; if ( ! exp.prepare( mVectorLayer->pendingFields() ) ) { QMessageBox::critical( 0, tr( "Evaluation error" ), exp.evalErrorString() ); return; } mVectorLayer->beginEditCommand( "Field calculator" ); //update existing field if ( mUpdateExistingGroupBox->isChecked() || !mNewFieldGroupBox->isEnabled() ) { QMap<QString, int>::const_iterator fieldIt = mFieldMap.find( mExistingFieldComboBox->currentText() ); if ( fieldIt != mFieldMap.end() ) { mAttributeId = fieldIt.value(); } } else { //create new field QgsField newField( mOutputFieldNameLineEdit->text(), ( QVariant::Type ) mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole ).toInt(), mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole + 1 ).toString(), mOutputFieldWidthSpinBox->value(), mOutputFieldPrecisionSpinBox->value() ); if ( !mVectorLayer->addAttribute( newField ) ) { QMessageBox::critical( 0, tr( "Provider error" ), tr( "Could not add the new field to the provider." ) ); mVectorLayer->destroyEditCommand(); return; } //get index of the new field const QgsFieldMap fieldList = mVectorLayer->pendingFields(); QgsFieldMap::const_iterator it = fieldList.constBegin(); for ( ; it != fieldList.constEnd(); ++it ) { if ( it.value().name() == mOutputFieldNameLineEdit->text() ) { mAttributeId = it.key(); break; } } } if ( mAttributeId == -1 ) { mVectorLayer->destroyEditCommand(); return; } //go through all the features and change the new attribute QgsFeature feature; bool calculationSuccess = true; QString error; bool onlySelected = mOnlyUpdateSelectedCheckBox->isChecked(); QgsFeatureIds selectedIds = mVectorLayer->selectedFeaturesIds(); // block layerModified signals (that would trigger table update) mVectorLayer->blockSignals( true ); bool useGeometry = exp.needsGeometry(); int rownum = 1; mVectorLayer->select( mVectorLayer->pendingAllAttributesList(), QgsRectangle(), useGeometry, false ); while ( mVectorLayer->nextFeature( feature ) ) { if ( onlySelected ) { if ( !selectedIds.contains( feature.id() ) ) { continue; } } exp.setCurrentRowNumber( rownum ); exp.setGeomCalculator( myDa ); QVariant value = exp.evaluate( &feature ); if ( exp.hasEvalError() ) { calculationSuccess = false; error = exp.evalErrorString(); break; } else { mVectorLayer->changeAttributeValue( feature.id(), mAttributeId, value, false ); } rownum++; } // stop blocking layerModified signals and make sure that one layerModified signal is emitted mVectorLayer->blockSignals( false ); mVectorLayer->setModified( true, false ); if ( !calculationSuccess ) { QMessageBox::critical( 0, tr( "Error" ), tr( "An error occured while evaluating the calculation string:\n%1" ).arg( error ) ); mVectorLayer->destroyEditCommand(); return; } mVectorLayer->endEditCommand(); QDialog::accept(); }
QgsPointDisplacementRendererWidget::QgsPointDisplacementRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ): \ QgsRendererV2Widget( layer, style ), mEmbeddedRendererWidget( 0 ) { if ( !layer ) { return; } //the renderer only applies to point vector layers if ( layer->wkbType() != QGis::WKBPoint && layer->wkbType() != QGis::WKBPoint25D ) { //setup blank dialog mRenderer = 0; setupBlankUi( layer->name() ); return; } setupUi( this ); if ( renderer && renderer->type() == "pointDisplacement" ) { mRenderer = dynamic_cast<QgsPointDisplacementRenderer*>( renderer->clone() ); } else { mRenderer = new QgsPointDisplacementRenderer(); } blockAllSignals( true ); //insert attributes into combo box if ( layer ) { const QgsFieldMap layerAttributes = layer->pendingFields(); QgsFieldMap::const_iterator it = layerAttributes.constBegin(); for ( ; it != layerAttributes.constEnd(); ++it ) { mLabelFieldComboBox->addItem( it.value().name() ); } mLabelFieldComboBox->addItem( tr( "None" ) ); QString currentLabelAttribute = mRenderer->labelAttributeName(); if ( !currentLabelAttribute.isEmpty() ) { mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( currentLabelAttribute ) ); } else { mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( tr( "None" ) ) ); } } //insert possible renderer types QStringList rendererList = QgsRendererV2Registry::instance()->renderersList(); QStringList::const_iterator it = rendererList.constBegin(); for ( ; it != rendererList.constEnd(); ++it ) { if ( *it != "pointDisplacement" ) { QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( *it ); mRendererComboBox->addItem( m->icon(), m->visibleName(), *it ); } } mCircleWidthSpinBox->setValue( mRenderer->circleWidth() ); mCircleColorButton->setColor( mRenderer->circleColor() ); mLabelColorButton->setColor( mRenderer->labelColor() ); mCircleModificationSpinBox->setValue( mRenderer->circleRadiusAddition() ); mDistanceSpinBox->setValue( mRenderer->tolerance() ); //scale dependent labelling mMaxScaleDenominatorEdit->setText( QString::number( mRenderer->maxLabelScaleDenominator() ) ); mMaxScaleDenominatorEdit->setValidator( new QDoubleValidator( mMaxScaleDenominatorEdit ) ); if ( mRenderer->maxLabelScaleDenominator() > 0 ) { mScaleDependentLabelsCheckBox->setCheckState( Qt::Checked ); } else { mScaleDependentLabelsCheckBox->setCheckState( Qt::Unchecked ); mMaxScaleDenominatorEdit->setEnabled( false ); } blockAllSignals( false ); //set the appropriate renderer dialog if ( mRenderer && mRenderer->embeddedRenderer() ) { QString rendererName = mRenderer->embeddedRenderer()->type(); int rendererIndex = mRendererComboBox->findData( rendererName ); if ( rendererIndex != -1 ) { mRendererComboBox->setCurrentIndex( rendererIndex ); on_mRendererComboBox_currentIndexChanged( rendererIndex ); } } updateCenterIcon(); }
QDomDocument QgsWFSServer::describeFeatureType() { QgsDebugMsg( "Entering." ); QDomDocument doc; //xsd:schema QDomElement schemaElement = doc.createElement( "schema"/*xsd:schema*/ ); schemaElement.setAttribute( "xmlns", "http://www.w3.org/2001/XMLSchema" ); schemaElement.setAttribute( "xmlns:xsd", "http://www.w3.org/2001/XMLSchema" ); schemaElement.setAttribute( "xmlns:ogc", "http://www.opengis.net/ogc" ); schemaElement.setAttribute( "xmlns:gml", "http://www.opengis.net/gml" ); schemaElement.setAttribute( "xmlns:qgs", "http://www.qgis.org/gml" ); schemaElement.setAttribute( "targetNamespace", "http://www.qgis.org/gml" ); doc.appendChild( schemaElement ); //xsd:import QDomElement importElement = doc.createElement( "import"/*xsd:import*/ ); importElement.setAttribute( "namespace", "http://www.opengis.net/gml" ); importElement.setAttribute( "schemaLocation", "http://schemas.opengis.net/gml/2.1.2/feature.xsd" ); schemaElement.appendChild( importElement ); //read TYPENAME QString typeName; QMap<QString, QString>::const_iterator type_name_it = mParameterMap.find( "TYPENAME" ); if ( type_name_it != mParameterMap.end() ) { typeName = type_name_it.value(); } else { return doc; } QStringList wfsLayersId = mConfigParser->wfsLayers(); QMap< QString, QMap< int, QString > > aliasInfo = mConfigParser->layerAliasInfo(); QMap< QString, QSet<QString> > hiddenAttributes = mConfigParser->hiddenAttributes(); QList<QgsMapLayer*> layerList; QgsMapLayer* currentLayer = 0; layerList = mConfigParser->mapLayerFromStyle( typeName, "" ); currentLayer = layerList.at( 0 ); QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( currentLayer ); if ( layer && wfsLayersId.contains( layer->id() ) ) { //is there alias info for this vector layer? QMap< int, QString > layerAliasInfo; QMap< QString, QMap< int, QString > >::const_iterator aliasIt = aliasInfo.find( currentLayer->id() ); if ( aliasIt != aliasInfo.constEnd() ) { layerAliasInfo = aliasIt.value(); } //hidden attributes for this layer QSet<QString> layerHiddenAttributes; QMap< QString, QSet<QString> >::const_iterator hiddenIt = hiddenAttributes.find( currentLayer->id() ); if ( hiddenIt != hiddenAttributes.constEnd() ) { layerHiddenAttributes = hiddenIt.value(); } //do a select with searchRect and go through all the features QgsVectorDataProvider* provider = layer->dataProvider(); if ( !provider ) { return doc; } typeName = typeName.replace( QString( " " ), QString( "_" ) ); //xsd:element QDomElement elementElem = doc.createElement( "element"/*xsd:element*/ ); elementElem.setAttribute( "name", typeName ); elementElem.setAttribute( "type", "qgs:" + typeName + "Type" ); elementElem.setAttribute( "substitutionGroup", "gml:_Feature" ); schemaElement.appendChild( elementElem ); //xsd:complexType QDomElement complexTypeElem = doc.createElement( "complexType"/*xsd:complexType*/ ); complexTypeElem.setAttribute( "name", typeName + "Type" ); schemaElement.appendChild( complexTypeElem ); //xsd:complexType QDomElement complexContentElem = doc.createElement( "complexContent"/*xsd:complexContent*/ ); complexTypeElem.appendChild( complexContentElem ); //xsd:extension QDomElement extensionElem = doc.createElement( "extension"/*xsd:extension*/ ); extensionElem.setAttribute( "base", "gml:AbstractFeatureType" ); complexContentElem.appendChild( extensionElem ); //xsd:sequence QDomElement sequenceElem = doc.createElement( "sequence"/*xsd:sequence*/ ); extensionElem.appendChild( sequenceElem ); //xsd:element QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ ); geomElem.setAttribute( "name", "geometry" ); geomElem.setAttribute( "type", "gml:GeometryPropertyType" ); geomElem.setAttribute( "minOccurs", "0" ); geomElem.setAttribute( "maxOccurs", "1" ); sequenceElem.appendChild( geomElem ); const QgsFieldMap& fields = provider->fields(); for ( QgsFieldMap::const_iterator it = fields.begin(); it != fields.end(); ++it ) { QString attributeName = it.value().name(); //skip attribute if it has edit type 'hidden' if ( layerHiddenAttributes.contains( attributeName ) ) { continue; } //xsd:element QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ ); geomElem.setAttribute( "name", attributeName ); if ( it.value().type() == 2 ) geomElem.setAttribute( "type", "integer" ); else if ( it.value().type() == 6 ) geomElem.setAttribute( "type", "double" ); else geomElem.setAttribute( "type", "string" ); sequenceElem.appendChild( geomElem ); //check if the attribute name should be replaced with an alias QMap<int, QString>::const_iterator aliasIt = layerAliasInfo.find( it.key() ); if ( aliasIt != layerAliasInfo.constEnd() ) { geomElem.setAttribute( "alias", aliasIt.value() ); } } } return doc; }
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 ); } }
void QgsFieldCalculator::accept() { if ( mVectorLayer && mVectorLayer->isEditable() ) { QString calcString = mExpressionTextEdit->toPlainText(); //create QgsExpression QgsExpression exp( calcString ); if ( exp.hasParserError() ) { //expression not valid QMessageBox::critical( 0, tr( "Syntax error" ), tr( QString( "Invalid expression syntax. The error message of the parser is: '" + exp.parserErrorString() + "'" ).toLocal8Bit().data() ) ); return; } if ( ! exp.prepare( mVectorLayer->pendingFields() ) ) { QMessageBox::critical( 0, tr( "Evaluation error" ), exp.evalErrorString() ); return; } mVectorLayer->beginEditCommand( "Field calculator" ); //update existing field if ( mUpdateExistingFieldCheckBox->checkState() == Qt::Checked ) { QMap<QString, int>::const_iterator fieldIt = mFieldMap.find( mExistingFieldComboBox->currentText() ); if ( fieldIt != mFieldMap.end() ) { mAttributeId = fieldIt.value(); } } //create new field else { //create new field QgsField newField( mOutputFieldNameLineEdit->text(), ( QVariant::Type ) mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole ).toInt(), mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole + 1 ).toString(), mOuputFieldWidthSpinBox->value(), mOutputFieldPrecisionSpinBox->value() ); if ( !mVectorLayer->addAttribute( newField ) ) { QMessageBox::critical( 0, tr( "Provider error" ), tr( "Could not add the new field to the provider." ) ); mVectorLayer->destroyEditCommand(); return; } //get index of the new field const QgsFieldMap fieldList = mVectorLayer->pendingFields(); QgsFieldMap::const_iterator it = fieldList.constBegin(); for ( ; it != fieldList.constEnd(); ++it ) { if ( it.value().name() == mOutputFieldNameLineEdit->text() ) { mAttributeId = it.key(); break; } } } if ( mAttributeId == -1 ) { mVectorLayer->destroyEditCommand(); return; } //go through all the features and change the new attribute QgsFeature feature; bool calculationSuccess = true; QString error; bool onlySelected = ( mOnlyUpdateSelectedCheckBox->checkState() == Qt::Checked ); QgsFeatureIds selectedIds = mVectorLayer->selectedFeaturesIds(); // block layerModified signals (that would trigger table update) mVectorLayer->blockSignals( true ); bool useGeometry = exp.needsGeometry(); int rownum = 1; mVectorLayer->select( mVectorLayer->pendingAllAttributesList(), QgsRectangle(), useGeometry, false ); while ( mVectorLayer->nextFeature( feature ) ) { if ( onlySelected ) { if ( !selectedIds.contains( feature.id() ) ) { continue; } } exp.setCurrentRowNumber( rownum ); QVariant value = exp.evaluate( &feature ); if ( exp.hasEvalError() ) { calculationSuccess = false; error = exp.evalErrorString(); break; } else { mVectorLayer->changeAttributeValue( feature.id(), mAttributeId, value, false ); } rownum++; } // stop blocking layerModified signals and make sure that one layerModified signal is emitted mVectorLayer->blockSignals( false ); mVectorLayer->setModified( true, false ); if ( !calculationSuccess ) { QMessageBox::critical( 0, tr( "Error" ), tr( "An error occured while evaluating the calculation string:\n%1" ).arg( error ) ); mVectorLayer->destroyEditCommand(); return; } mVectorLayer->endEditCommand(); } QDialog::accept(); }
void QgsOfflineEditing::copyVectorLayer( QgsVectorLayer* layer, sqlite3* db, const QString& offlineDbPath ) { if ( layer == NULL ) { return; } QString tableName = layer->name(); // create table QString sql = QString( "CREATE TABLE '%1' (" ).arg( tableName ); QString delim = ""; const QgsFieldMap& fields = layer->dataProvider()->fields(); for ( QgsFieldMap::const_iterator it = fields.begin(); it != fields.end() ; ++it ) { QString dataType = ""; QVariant::Type type = it.value().type(); if ( type == QVariant::Int ) { dataType = "INTEGER"; } else if ( type == QVariant::Double ) { dataType = "REAL"; } else if ( type == QVariant::String ) { dataType = "TEXT"; } else { showWarning( tr( "Unknown data type %1" ).arg( type ) ); } sql += delim + QString( "'%1' %2" ).arg( it.value().name() ).arg( dataType ); delim = ","; } sql += ")"; // add geometry column QString geomType = ""; switch ( layer->wkbType() ) { case QGis::WKBPoint: geomType = "POINT"; break; case QGis::WKBMultiPoint: geomType = "MULTIPOINT"; break; case QGis::WKBLineString: geomType = "LINESTRING"; break; case QGis::WKBMultiLineString: geomType = "MULTILINESTRING"; break; case QGis::WKBPolygon: geomType = "POLYGON"; break; case QGis::WKBMultiPolygon: geomType = "MULTIPOLYGON"; break; default: showWarning( tr( "QGIS wkbType %1 not supported" ).arg( layer->wkbType() ) ); break; }; QString sqlAddGeom = QString( "SELECT AddGeometryColumn('%1', 'Geometry', %2, '%3', 2)" ) .arg( tableName ) .arg( layer->crs().authid().startsWith( "EPSG:", Qt::CaseInsensitive ) ? layer->crs().authid().mid( 5 ).toLong() : 0 ) .arg( geomType ); // create spatial index QString sqlCreateIndex = QString( "SELECT CreateSpatialIndex('%1', 'Geometry')" ).arg( tableName ); int rc = sqlExec( db, sql ); if ( rc == SQLITE_OK ) { rc = sqlExec( db, sqlAddGeom ); if ( rc == SQLITE_OK ) { rc = sqlExec( db, sqlCreateIndex ); } } if ( rc == SQLITE_OK ) { // add new layer QgsVectorLayer* newLayer = new QgsVectorLayer( QString( "dbname='%1' table='%2'(Geometry) sql=" ) .arg( offlineDbPath ).arg( tableName ), tableName + " (offline)", "spatialite" ); if ( newLayer->isValid() ) { // mark as offline layer newLayer->setCustomProperty( CUSTOM_PROPERTY_IS_OFFLINE_EDITABLE, true ); // store original layer source newLayer->setCustomProperty( CUSTOM_PROPERTY_REMOTE_SOURCE, layer->source() ); newLayer->setCustomProperty( CUSTOM_PROPERTY_REMOTE_PROVIDER, layer->providerType() ); // copy style bool hasLabels = layer->hasLabelsEnabled(); if ( !hasLabels ) { // NOTE: copy symbology before adding the layer so it is displayed correctly copySymbology( layer, newLayer ); } // register this layer with the central layers registry QgsMapLayerRegistry::instance()->addMapLayer( newLayer ); if ( hasLabels ) { // NOTE: copy symbology of layers with labels enabled after adding to project, as it will crash otherwise (WORKAROUND) copySymbology( layer, newLayer ); } // TODO: layer order // copy features newLayer->startEditing(); QgsFeature f; // NOTE: force feature recount for PostGIS layer, else only visible features are counted, before iterating over all features (WORKAROUND) layer->setSubsetString( "" ); layer->select( layer->pendingAllAttributesList(), QgsRectangle(), true, false ); mProgressDialog->setupProgressBar( tr( "%v / %m features copied" ), layer->featureCount() ); int featureCount = 1; QList<int> remoteFeatureIds; while ( layer->nextFeature( f ) ) { remoteFeatureIds << f.id(); // NOTE: Spatialite provider ignores position of geometry column // fill gap in QgsAttributeMap if geometry column is not last (WORKAROUND) int column = 0; QgsAttributeMap newAttrMap; QgsAttributeMap attrMap = f.attributeMap(); for ( QgsAttributeMap::const_iterator it = attrMap.begin(); it != attrMap.end(); ++it ) { newAttrMap.insert( column++, it.value() ); } f.setAttributeMap( newAttrMap ); newLayer->addFeature( f, false ); mProgressDialog->setProgressValue( featureCount++ ); } if ( newLayer->commitChanges() ) { mProgressDialog->setupProgressBar( tr( "%v / %m features processed" ), layer->featureCount() ); featureCount = 1; // update feature id lookup int layerId = getOrCreateLayerId( db, newLayer->id() ); QList<int> offlineFeatureIds; newLayer->select( QgsAttributeList(), QgsRectangle(), false, false ); while ( newLayer->nextFeature( f ) ) { offlineFeatureIds << f.id(); } // NOTE: insert fids in this loop, as the db is locked during newLayer->nextFeature() sqlExec( db, "BEGIN" ); for ( int i = 0; i < remoteFeatureIds.size(); i++ ) { addFidLookup( db, layerId, offlineFeatureIds.at( i ), remoteFeatureIds.at( i ) ); mProgressDialog->setProgressValue( featureCount++ ); } sqlExec( db, "COMMIT" ); } else { showWarning( newLayer->commitErrors().join( "\n" ) ); } // remove remote layer QgsMapLayerRegistry::instance()->removeMapLayer( layer->id() ); } } }