From c358aea04df7a26ed2acc03671c5685bb83453b6 Mon Sep 17 00:00:00 2001 From: Radim Blazek Date: Thu, 15 Oct 2015 11:58:42 +0200 Subject: [PATCH] [GRASS] create new cat on attribute change if it does not exist --- src/providers/grass/qgsgrassprovider.cpp | 52 ++++++++++++++++++------ src/providers/grass/qgsgrassprovider.h | 2 + 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/providers/grass/qgsgrassprovider.cpp b/src/providers/grass/qgsgrassprovider.cpp index b9f1864886e..edbd2e9be42 100644 --- a/src/providers/grass/qgsgrassprovider.cpp +++ b/src/providers/grass/qgsgrassprovider.cpp @@ -1254,16 +1254,7 @@ void QgsGrassProvider::onFeatureAdded( QgsFeatureId fid ) } if ( newCat == 0 ) { - QgsDebugMsg( QString( "get new cat for cidxFieldIndex() = %1" ).arg( mLayer->cidxFieldIndex() ) ); - if ( mLayer->cidxFieldIndex() == -1 ) - { - // No features with this field yet in map - newCat = 1; - } - else - { - newCat = cidxGetMaxCat( mLayer->cidxFieldIndex() ) + 1; - } + newCat = getNewCat(); } QgsDebugMsg( QString( "newCat = %1" ).arg( newCat ) ); Vect_cat_set( mCats, mLayerField, newCat ); @@ -1714,8 +1705,31 @@ void QgsGrassProvider::onAttributeValueChanged( QgsFeatureId fid, int idx, const } else { - QgsDebugMsg( "no cat -> add new cat to line" ); - // TODO + int newCat = getNewCat(); + QgsDebugMsg( QString( "no cat -> add new cat %1 to line" ).arg( newCat ) ); + int type = readLine( mPoints, mCats, realLine ); + if ( type <= 0 ) + { + QgsDebugMsg( "cannot read line" ); + } + else + { + Vect_cat_set( mCats, mLayerField, newCat ); + mLayer->map()->lockReadWrite(); + int newLid = rewriteLine( realLine, type, mPoints, mCats ); + Q_UNUSED( newLid ) + + // TODO: - store the new cat somewhere for cats mapping + QString error; + // it does insert new record if it doesn't exist + mLayer->changeAttributeValue( newCat, field, value, error ); + if ( !error.isEmpty() ) + { + QgsGrass::warning( error ); + } + + mLayer->map()->unlockReadWrite(); + } } } } @@ -1877,6 +1891,20 @@ int QgsGrassProvider::cidxGetMaxCat( int idx ) return cat; } +int QgsGrassProvider::getNewCat() +{ + QgsDebugMsg( QString( "get new cat for cidxFieldIndex() = %1" ).arg( mLayer->cidxFieldIndex() ) ); + if ( mLayer->cidxFieldIndex() == -1 ) + { + // No features with this field yet in map + return 1; + } + else + { + return cidxGetMaxCat( mLayer->cidxFieldIndex() ) + 1; + } +} + QgsGrassVectorMapLayer * QgsGrassProvider::openLayer() const { return mLayer->map()->openLayer( mLayerField ); diff --git a/src/providers/grass/qgsgrassprovider.h b/src/providers/grass/qgsgrassprovider.h index f98b38f4abc..57474dfecee 100644 --- a/src/providers/grass/qgsgrassprovider.h +++ b/src/providers/grass/qgsgrassprovider.h @@ -410,6 +410,8 @@ class GRASS_LIB_EXPORT QgsGrassProvider : public QgsVectorDataProvider bool openLayer(); // update topo symbol of new features void setAddedFeaturesSymbol(); + // get new, not yet used cat + int getNewCat(); QgsGrassObject mGrassObject; // field part of layer or -1 if no field specified