bool QgsMemoryProvider::addAttributes( const QList<QgsField> &attributes ) { for ( QList<QgsField>::const_iterator it = attributes.begin(); it != attributes.end(); ++it ) { // Why are attributes restricted to int,double and string only? switch ( it->type() ) { case QVariant::Int: case QVariant::Double: case QVariant::String: case QVariant::Date: case QVariant::LongLong: break; default: QgsDebugMsg( "Field type not supported: " + it->typeName() ); continue; } // add new field as a last one mFields.append( *it ); for ( QgsFeatureMap::iterator fit = mFeatures.begin(); fit != mFeatures.end(); ++fit ) { QgsFeature& f = fit.value(); f.attributes().append( QVariant() ); } } return true; }
void QgsVectorLayerUndoCommandChangeGeometry::undo() { if ( FID_IS_NEW( mFid ) ) { // modify added features QgsFeatureMap::iterator it = mBuffer->mAddedFeatures.find( mFid ); Q_ASSERT( it != mBuffer->mAddedFeatures.end() ); it.value().setGeometry( mOldGeom ); emit mBuffer->geometryChanged( mFid, mOldGeom ); } else { // existing feature if ( mOldGeom.isNull() ) { mBuffer->mChangedGeometries.remove( mFid ); QgsFeature f; if ( layer()->getFeatures( QgsFeatureRequest().setFilterFid( mFid ).setNoAttributes() ).nextFeature( f ) && f.hasGeometry() ) { emit mBuffer->geometryChanged( mFid, f.geometry() ); } } else { mBuffer->mChangedGeometries[mFid] = mOldGeom; emit mBuffer->geometryChanged( mFid, mOldGeom ); } } }
void QgsMemoryProvider::updateExtent() { if ( mFeatures.count() == 0 ) { mExtent = QgsRectangle(); } else { mExtent = mFeatures.begin().value().geometry()->boundingBox(); for ( QgsFeatureMap::iterator it = mFeatures.begin(); it != mFeatures.end(); ++it ) mExtent.unionRect( it.value().geometry()->boundingBox() ); } }
bool QgsMemoryProvider::changeAttributeValues( const QgsChangedAttributesMap & attr_map ) { for ( QgsChangedAttributesMap::const_iterator it = attr_map.begin(); it != attr_map.end(); ++it ) { QgsFeatureMap::iterator fit = mFeatures.find( it.key() ); if ( fit == mFeatures.end() ) continue; const QgsAttributeMap& attrs = it.value(); for ( QgsAttributeMap::const_iterator it2 = attrs.begin(); it2 != attrs.end(); ++it2 ) fit->changeAttribute( it2.key(), it2.value() ); } return TRUE; }
void QgsVectorLayerUndoCommandChangeGeometry::redo() { if ( FID_IS_NEW( mFid ) ) { // modify added features QgsFeatureMap::iterator it = mBuffer->mAddedFeatures.find( mFid ); Q_ASSERT( it != mBuffer->mAddedFeatures.end() ); it.value().setGeometry( mNewGeom ); } else { mBuffer->mChangedGeometries[ mFid ] = mNewGeom; } emit mBuffer->geometryChanged( mFid, mNewGeom ); }
void QgsVectorLayerEditBuffer::handleAttributeAdded( int index ) { // go through the changed attributes map and adapt indices for ( int i = 0; i < mChangedAttributeValues.size(); ++i ) { updateAttributeMapIndex( mChangedAttributeValues[i], index, + 1 ); } // go through added features and adapt attributes QgsFeatureMap::iterator featureIt = mAddedFeatures.begin(); for ( ; featureIt != mAddedFeatures.end(); ++featureIt ) { QgsAttributes& attrs = featureIt->attributes(); attrs.insert( index, QVariant() ); } }
void QgsVectorLayerUndoCommandDeleteAttribute::undo() { if ( mProviderField ) { mBuffer->mDeletedAttributeIds.removeOne( mOriginIndex ); } else { // newly added attribute mBuffer->mAddedAttributes.insert( mOriginIndex, mOldField ); } mBuffer->updateLayerFields(); mBuffer->handleAttributeAdded( mFieldIndex ); // update changed attributes + new features if ( !mOldName.isEmpty() ) { mBuffer->mRenamedAttributes[ mFieldIndex ] = mOldName; mBuffer->updateLayerFields(); } // set previously used attributes of new features for ( QgsFeatureMap::iterator it = mBuffer->mAddedFeatures.begin(); it != mBuffer->mAddedFeatures.end(); ++it ) { QgsFeature& f = it.value(); f.setAttribute( mFieldIndex, mDeletedValues.value( f.id() ) ); } // set previously used changed attributes for ( QMap<QgsFeatureId, QVariant>::const_iterator it = mDeletedValues.constBegin(); it != mDeletedValues.constEnd(); ++it ) { if ( !FID_IS_NEW( it.key() ) ) { QgsAttributeMap& attrs = mBuffer->mChangedAttributeValues[it.key()]; // also adds record if nonexistant attrs.insert( mFieldIndex, it.value() ); } } QgsEditFormConfig formConfig = mBuffer->L->editFormConfig(); formConfig.setWidgetConfig( mFieldName, mOldEditorWidgetConfig ); mBuffer->L->setEditFormConfig( formConfig ); emit mBuffer->attributeAdded( mFieldIndex ); }
bool QgsMemoryProvider::deleteAttributes( const QgsAttributeIds& attributes ) { QList<int> attrIdx = attributes.toList(); qSort( attrIdx.begin(), attrIdx.end(), qGreater<int>() ); // delete attributes one-by-one with decreasing index for ( QList<int>::const_iterator it = attrIdx.constBegin(); it != attrIdx.constEnd(); ++it ) { int idx = *it; mFields.remove( idx ); for ( QgsFeatureMap::iterator fit = mFeatures.begin(); fit != mFeatures.end(); ++fit ) { QgsFeature& f = fit.value(); f.attributes().remove( idx ); } } return true; }
void QgsVectorLayerUndoCommandChangeAttribute::redo() { if ( FID_IS_NEW( mFid ) ) { // updated added feature QgsFeatureMap::iterator it = mBuffer->mAddedFeatures.find( mFid ); Q_ASSERT( it != mBuffer->mAddedFeatures.end() ); it.value().setAttribute( mFieldIndex, mNewValue ); } else { // changed attribute of existing feature if ( !mBuffer->mChangedAttributeValues.contains( mFid ) ) { mBuffer->mChangedAttributeValues.insert( mFid, QgsAttributeMap() ); } mBuffer->mChangedAttributeValues[mFid].insert( mFieldIndex, mNewValue ); } emit mBuffer->attributeValueChanged( mFid, mFieldIndex, mNewValue ); }
void QgsVectorLayerEditBuffer::handleAttributeDeleted( int index ) { // go through the changed attributes map and adapt indices for ( int i = 0; i < mChangedAttributeValues.size(); ++i ) { QgsAttributeMap& attrMap = mChangedAttributeValues[i]; // remove the attribute if ( attrMap.contains( index ) ) attrMap.remove( index ); // update attribute indices updateAttributeMapIndex( attrMap, index, -1 ); } // go through added features and adapt attributes QgsFeatureMap::iterator featureIt = mAddedFeatures.begin(); for ( ; featureIt != mAddedFeatures.end(); ++featureIt ) { QgsAttributes& attrs = featureIt->attributes(); attrs.remove( index ); } }
void QgsVectorLayerUndoCommandChangeAttribute::undo() { QVariant original = mOldValue; if ( FID_IS_NEW( mFid ) ) { // added feature QgsFeatureMap::iterator it = mBuffer->mAddedFeatures.find( mFid ); Q_ASSERT( it != mBuffer->mAddedFeatures.end() ); it.value().setAttribute( mFieldIndex, mOldValue ); } else if ( mFirstChange ) { // existing feature mBuffer->mChangedAttributeValues[mFid].remove( mFieldIndex ); if ( mBuffer->mChangedAttributeValues[mFid].isEmpty() ) mBuffer->mChangedAttributeValues.remove( mFid ); if ( !mOldValue.isValid() ) { // get old value from provider QgsFeature tmp; QgsFeatureRequest request; request.setFilterFid( mFid ); request.setFlags( QgsFeatureRequest::NoGeometry ); request.setSubsetOfAttributes( QgsAttributeList() << mFieldIndex ); QgsFeatureIterator fi = layer()->getFeatures( request ); if ( fi.nextFeature( tmp ) ) original = tmp.attribute( mFieldIndex ); } } else { mBuffer->mChangedAttributeValues[mFid][mFieldIndex] = mOldValue; } emit mBuffer->attributeValueChanged( mFid, mFieldIndex, original ); }
bool QgsMemoryProvider::changeGeometryValues( QgsGeometryMap & geometry_map ) { for ( QgsGeometryMap::const_iterator it = geometry_map.begin(); it != geometry_map.end(); ++it ) { QgsFeatureMap::iterator fit = mFeatures.find( it.key() ); if ( fit == mFeatures.end() ) continue; // update spatial index if ( mSpatialIndex ) mSpatialIndex->deleteFeature( *fit ); fit->setGeometry( it.value() ); // update spatial index if ( mSpatialIndex ) mSpatialIndex->insertFeature( *fit ); } updateExtent(); return TRUE; }