void QgsOfflineEditing::committedFeaturesRemoved( const QString& qgisLayerId, const QgsFeatureIds& deletedFeatureIds ) { sqlite3* db = openLoggingDb(); if ( db == NULL ) { return; } // insert log int layerId = getOrCreateLayerId( db, qgisLayerId ); for ( QgsFeatureIds::const_iterator it = deletedFeatureIds.begin(); it != deletedFeatureIds.end(); ++it ) { if ( isAddedFeature( db, layerId, *it ) ) { // remove from added features log QString sql = QString( "DELETE FROM 'log_added_features' WHERE \"layer_id\" = %1 AND \"fid\" = %2" ).arg( layerId ).arg( *it ); sqlExec( db, sql ); } else { QString sql = QString( "INSERT INTO 'log_removed_features' VALUES ( %1, %2)" ) .arg( layerId ) .arg( *it ); sqlExec( db, sql ); } } sqlite3_close( db ); }
void QgsOfflineEditing::applyFeaturesRemoved( QgsVectorLayer* remoteLayer, sqlite3* db, int layerId ) { QString sql = QString( "SELECT \"fid\" FROM 'log_removed_features' WHERE \"layer_id\" = %1" ).arg( layerId ); QgsFeatureIds values = sqlQueryFeaturesRemoved( db, sql ); emit progressModeSet( QgsOfflineEditing::RemoveFeatures, values.size() ); int i = 1; for ( QgsFeatureIds::const_iterator it = values.begin(); it != values.end(); ++it ) { QgsFeatureId fid = remoteFid( db, layerId, *it ); remoteLayer->deleteFeature( fid ); emit progressUpdated( i++ ); } }
void QgsOfflineEditing::applyFeaturesRemoved( QgsVectorLayer* remoteLayer, sqlite3* db, int layerId ) { QString sql = QString( "SELECT \"fid\" FROM 'log_removed_features' WHERE \"layer_id\" = %1" ).arg( layerId ); QgsFeatureIds values = sqlQueryFeaturesRemoved( db, sql ); mProgressDialog->setupProgressBar( tr( "%v / %m features removed" ), values.size() ); int i = 1; for ( QgsFeatureIds::const_iterator it = values.begin(); it != values.end(); ++it ) { int fid = remoteFid( db, layerId, *it ); remoteLayer->deleteFeature( fid ); mProgressDialog->setProgressValue( i++ ); } }
bool QgsMemoryProvider::deleteFeatures( const QgsFeatureIds & id ) { for ( QgsFeatureIds::const_iterator it = id.begin(); it != id.end(); ++it ) { QgsFeatureMap::iterator fit = mFeatures.find( *it ); // check whether such feature exists if ( fit == mFeatures.end() ) continue; // update spatial index if ( mSpatialIndex ) mSpatialIndex->deleteFeature( *fit ); mFeatures.erase( fit ); } updateExtent(); return TRUE; }
bool QgsDb2Provider::deleteFeatures( const QgsFeatureIds & id ) { if ( mFidColName.isEmpty() ) return false; QString featureIds; for ( QgsFeatureIds::const_iterator it = id.begin(); it != id.end(); ++it ) { if ( featureIds.isEmpty() ) featureIds = FID_TO_STRING( *it ); else featureIds += ',' + FID_TO_STRING( *it ); } if ( !mDatabase.isOpen() ) { QString errMsg; mDatabase = getDatabase( mConnInfo, errMsg ); if ( !errMsg.isEmpty() ) { return false; } } QSqlQuery query = QSqlQuery( mDatabase ); query.setForwardOnly( true ); QString statement; statement = QString( "DELETE FROM %1.%2 WHERE %3 IN (%4)" ).arg( mSchemaName, mTableName, mFidColName, featureIds ); QgsDebugMsg( statement ); if ( !query.exec( statement ) ) { QgsDebugMsg( query.lastError().text() ); return false; } return true; }
void QgsAttributeTableDialog::updateRowSelection( int first, int last, int clickType ) { // clickType= 0:Single click, 1:Shift, 2:Ctrl, 3: Dragged click disconnect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); // Id must be mapped to table/view row QModelIndex index = mFilterModel->mapToSource( mFilterModel->index( first, 0 ) ); int fid = mModel->rowToId( index.row() ); bool wasSelected = mSelectedFeatures.contains( fid ); // new selection should be created if ( clickType == 0 ) // Single click { if ( mSelectedFeatures.size() == 1 && wasSelected ) // One item selected return; // Click over a selected item doesn't do anything mView->setCurrentIndex( mFilterModel->index( first, 0 ) ); mView->selectRow( first ); mSelectedFeatures.clear(); mSelectedFeatures.insert( fid ); mLayer->removeSelection(); mLayer->select( fid ); connect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); return; } else if ( clickType == 1 ) // Shift { QgsFeatureIds newSelection; for ( int i = first; i <= last; ++i ) { if ( i >= first ) { // Id must be mapped to table/view row index = mFilterModel->mapToSource( mFilterModel->index( i, 0 ) ); fid = mModel->rowToId( index.row() ); } newSelection.insert( fid ); } // Remove items in mSelectedFeatures if they aren't in mNewSelection QgsFeatureIds::Iterator it = mSelectedFeatures.begin(); while ( it != mSelectedFeatures.end() ) { if ( !newSelection.contains( *it ) ) { it = mSelectedFeatures.erase( it ); } else { ++it; } } // Append the other fids in range first-last to mSelectedFeatures QgsFeatureIds::Iterator itNew = newSelection.begin(); for ( ; itNew != newSelection.end(); ++itNew ) { if ( !mSelectedFeatures.contains( *itNew ) ) { mSelectedFeatures.insert( *itNew ); } } } else if ( clickType == 2 ) // Ctrl { // existing selection should be updated if ( wasSelected ) mSelectedFeatures.remove( fid ); else mSelectedFeatures.insert( fid ); } else if ( clickType == 3 ) // Dragged click { QgsFeatureIds newSelection; for ( int i = first; i <= last; ++i ) { if ( i >= first ) { // Id must be mapped to table/view row index = mFilterModel->mapToSource( mFilterModel->index( i, 0 ) ); fid = mModel->rowToId( index.row() ); } newSelection.insert( fid ); } // Remove items in mSelectedFeatures if they aren't in mNewSelection QgsFeatureIds::Iterator it = mSelectedFeatures.begin(); while ( it != mSelectedFeatures.end() ) { if ( !newSelection.contains( *it ) ) { it = mSelectedFeatures.erase( it ); } else { ++it; } } // Append the other fids in range first-last to mSelectedFeatures QgsFeatureIds::Iterator itNew = newSelection.begin(); for ( ; itNew != newSelection.end(); ++itNew ) { if ( !mSelectedFeatures.contains( *itNew ) ) { mSelectedFeatures.insert( *itNew ); } } } updateSelection(); mLayer->setSelectedFeatures( mSelectedFeatures ); connect( mLayer, SIGNAL( selectionChanged() ), this, SLOT( updateSelectionFromLayer() ) ); }