void QgsVectorLayerUndoCommandDeleteFeature::redo() { if ( FID_IS_NEW( mFid ) ) { mBuffer->mAddedFeatures.remove( mFid ); } else { mBuffer->mDeletedFeatureIds.insert( mFid ); } emit mBuffer->featureDeleted( mFid ); }
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 ); }
QgsVectorLayerUndoCommandChangeGeometry::QgsVectorLayerUndoCommandChangeGeometry( QgsVectorLayerEditBuffer *buffer, QgsFeatureId fid, const QgsGeometry &newGeom ) : QgsVectorLayerUndoCommand( buffer ) , mFid( fid ) , mNewGeom( newGeom ) { if ( FID_IS_NEW( mFid ) ) { QgsFeatureMap::const_iterator it = mBuffer->mAddedFeatures.constFind( mFid ); Q_ASSERT( it != mBuffer->mAddedFeatures.constEnd() ); mOldGeom = ( it.value().geometry() ); } else { mOldGeom = mBuffer->mChangedGeometries.value( mFid, QgsGeometry() ); } }
bool QgsVectorLayerEditBuffer::changeAttributeValue( QgsFeatureId fid, int field, QVariant value ) { if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues ) ) return false; if ( FID_IS_NEW( fid ) ) { if ( !mAddedFeatures.contains( fid ) ) return false; } if ( field < 0 || field >= L->pendingFields().count() || L->pendingFields().fieldOrigin( field ) == QgsFields::OriginJoin ) return false; L->undoStack()->push( new QgsVectorLayerUndoCommandChangeAttribute( this, fid, field, value ) ); return true; }
QgsVectorLayerUndoCommandChangeGeometry::QgsVectorLayerUndoCommandChangeGeometry( QgsVectorLayerEditBuffer* buffer, QgsFeatureId fid, const QgsGeometry& newGeom ) : QgsVectorLayerUndoCommand( buffer ) , mFid( fid ) , mNewGeom( newGeom ) { if ( FID_IS_NEW( mFid ) ) { QgsFeatureMap::const_iterator it = mBuffer->mAddedFeatures.constFind( mFid ); Q_ASSERT( it != mBuffer->mAddedFeatures.constEnd() ); mOldGeom = ( it.value().geometry() ); } else { bool changedAlready = mBuffer->mChangedGeometries.contains( mFid ); QgsGeometry geom; bool cachedGeom = cache()->geometry( mFid, geom ); mOldGeom = ( changedAlready && cachedGeom ) ? geom : QgsGeometry(); } }
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 QgsVectorLayerEditBuffer::deleteFeature( QgsFeatureId fid ) { if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::DeleteFeatures ) ) return false; if ( FID_IS_NEW( fid ) ) { if ( !mAddedFeatures.contains( fid ) ) return false; } else // existing feature { if ( mDeletedFeatureIds.contains( fid ) ) return false; } L->undoStack()->push( new QgsVectorLayerUndoCommandDeleteFeature( this, fid ) ); return true; }
bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* geom ) { if ( !L->hasGeometryType() ) { return false; } if ( FID_IS_NEW( fid ) ) { if ( !mAddedFeatures.contains( fid ) ) return false; } else if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeGeometries ) ) return false; // TODO: check compatible geometry L->undoStack()->push( new QgsVectorLayerUndoCommandChangeGeometry( this, fid, geom ) ); 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 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 ); }
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 ); cache()->cacheGeometry( mFid, mOldGeom ); emit mBuffer->geometryChanged( mFid, mOldGeom ); } else { // existing feature if ( mOldGeom.isEmpty() ) { mBuffer->mChangedGeometries.remove( mFid ); QgsFeature f; if ( layer()->getFeatures( QgsFeatureRequest().setFilterFid( mFid ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) && f.hasGeometry() ) { cache()->cacheGeometry( mFid, f.geometry() ); emit mBuffer->geometryChanged( mFid, f.geometry() ); } } else { mBuffer->mChangedGeometries[mFid] = mOldGeom; cache()->cacheGeometry( mFid, mOldGeom ); emit mBuffer->geometryChanged( mFid, mOldGeom ); } } }
bool QgsDb2Provider::changeAttributeValues( const QgsChangedAttributesMap &attr_map ) { QgsDebugMsg( "Entering" ); if ( attr_map.isEmpty() ) return true; if ( mFidColName.isEmpty() ) return false; for ( QgsChangedAttributesMap::const_iterator it = attr_map.begin(); it != attr_map.end(); ++it ) { QgsFeatureId fid = it.key(); // skip added features if ( FID_IS_NEW( fid ) ) continue; const QgsAttributeMap& attrs = it.value(); if ( attrs.isEmpty() ) continue; QString statement = QString( "UPDATE %1.%2 SET " ).arg( mSchemaName, mTableName ); bool first = true; if ( !mDatabase.isOpen() ) { QString errMsg; mDatabase = getDatabase( mConnInfo, errMsg ); if ( !errMsg.isEmpty() ) { return false; } } QSqlQuery query = QSqlQuery( mDatabase ); query.setForwardOnly( true ); for ( QgsAttributeMap::const_iterator it2 = attrs.begin(); it2 != attrs.end(); ++it2 ) { QgsField fld = mAttributeFields.at( it2.key() ); if ( fld.typeName().endsWith( " identity", Qt::CaseInsensitive ) ) continue; // skip identity field if ( fld.name().isEmpty() ) continue; // invalid if ( !first ) statement += ','; else first = false; statement += QString( "%1=?" ).arg( fld.name() ); } if ( first ) return true; // no fields have been changed // set attribute filter statement += QString( " WHERE %1=%2" ).arg( mFidColName, FID_TO_STRING( fid ) ); // use prepared statement to prevent from sql injection if ( !query.prepare( statement ) ) { QgsDebugMsg( query.lastError().text() ); return false; } QgsDebugMsg( statement ); for ( QgsAttributeMap::const_iterator it2 = attrs.begin(); it2 != attrs.end(); ++it2 ) { QgsField fld = mAttributeFields.at( it2.key() ); if ( fld.name().isEmpty() ) continue; // invalid QVariant::Type type = fld.type(); if ( it2->isNull() || !it2->isValid() ) { // binding null values if ( type == QVariant::Date || type == QVariant::DateTime ) query.addBindValue( QVariant( QVariant::String ) ); else query.addBindValue( QVariant( type ) ); } else if ( type == QVariant::Int ) { // binding an INTEGER value query.addBindValue( it2->toInt() ); } else if ( type == QVariant::Double ) { // binding a DOUBLE value query.addBindValue( it2->toDouble() ); } else if ( type == QVariant::String ) { // binding a TEXT value query.addBindValue( it2->toString() ); } else if ( type == QVariant::DateTime ) { // binding a DATETIME value query.addBindValue( it2->toDateTime().toString( Qt::ISODate ) ); } else if ( type == QVariant::Date ) { // binding a DATE value query.addBindValue( it2->toDate().toString( Qt::ISODate ) ); } else if ( type == QVariant::Time ) { // binding a TIME value query.addBindValue( it2->toTime().toString( Qt::ISODate ) ); } else { query.addBindValue( *it2 ); } } if ( !query.exec() ) { QgsDebugMsg( query.lastError().text() ); return false; } } return true; }