Skip to content

Commit 29b061c

Browse files
committed
[GRASS] prevent changing attributes of different layer
1 parent 86505e0 commit 29b061c

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

src/providers/grass/qgsgrassfeatureiterator.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,11 @@ int QgsGrassFeatureIterator::catFromFid( QgsFeatureId fid )
649649
return fid % 1000000000;
650650
}
651651

652+
QVariant QgsGrassFeatureIterator::nonEditableValue( int layerNumber )
653+
{
654+
return tr( "<not editable (layer %1)>" ).arg( layerNumber );
655+
}
656+
652657
void QgsGrassFeatureIterator::setFeatureAttributes( int cat, QgsFeature *feature, QgsGrassVectorMap::TopoSymbol symbol )
653658
{
654659
QgsDebugMsgLevel( QString( "setFeatureAttributes cat = %1" ).arg( cat ), 3 );
@@ -701,15 +706,14 @@ void QgsGrassFeatureIterator::setFeatureAttributes( int cat, QgsFeature *feature
701706
}
702707
else
703708
{
704-
// TODO: use real layer keyColumn(), but to get it the layer must be first opened and attributes loaded
705-
int keyColumn = 0;
706-
if ( *iter == keyColumn )
709+
// We are setting cat of different layer in cat column of this layer
710+
if ( *iter == mSource->mLayer->keyColumn() )
707711
{
708712
value = QVariant( cat );
709713
}
710714
else
711715
{
712-
value = tr( "<not editable (layer %1)>" ).arg( layerNumber );
716+
value = nonEditableValue( layerNumber );
713717
}
714718
}
715719
QgsDebugMsgLevel( QString( "iter = %1 value = %2" ).arg( *iter ).arg( value.toString() ), 3 );

src/providers/grass/qgsgrassfeatureiterator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ class GRASS_LIB_EXPORT QgsGrassFeatureIterator : public QObject, public QgsAbstr
9696
// Get GRASS cat from QGIS fid
9797
static int catFromFid( QgsFeatureId fid );
9898

99+
// get attribute value to be used in different layer when it is edited
100+
static QVariant nonEditableValue( int layerNumber );
101+
99102
public slots:
100103
/** Cancel iterator, iterator will be closed on next occasion, probably when next getFeature() gets called.
101104
* This function can be called directly from other threads (setting bool is atomic) */

src/providers/grass/qgsgrassprovider.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1709,8 +1709,33 @@ void QgsGrassProvider::onAttributeValueChanged( QgsFeatureId fid, int idx, const
17091709
{
17101710
QgsDebugMsg( QString( "fid = %1 idx = %2 value = %3" ).arg( fid ).arg( idx ).arg( value.toString() ) );
17111711

1712-
int oldLid = QgsGrassFeatureIterator::lidFromFid( fid );
1712+
int layerField = QgsGrassFeatureIterator::layerFromFid( fid );
17131713
int cat = QgsGrassFeatureIterator::catFromFid( fid );
1714+
QgsDebugMsg( QString( "layerField = %1" ).arg( layerField ) );
1715+
1716+
if ( !FID_IS_NEW( fid ) && layerField != mLayerField )
1717+
{
1718+
QgsDebugMsg( "changing attributes in different layer is not allowed" );
1719+
// reset the value
1720+
QgsChangedAttributesMap &changedAttributes = const_cast<QgsChangedAttributesMap &>( mEditBuffer->changedAttributeValues() );
1721+
if ( idx == mLayer->keyColumn() )
1722+
{
1723+
// should not happen because cat field is not editable
1724+
changedAttributes[fid][idx] = cat;
1725+
}
1726+
else
1727+
{
1728+
changedAttributes[fid][idx] = QgsGrassFeatureIterator::nonEditableValue( layerField );
1729+
}
1730+
// update table
1731+
// TODO: This would be too slow with buld update (field calculator for example), causing update
1732+
// of the whole table after each change. How to update single row?
1733+
//emit dataChanged();
1734+
return;
1735+
}
1736+
1737+
int oldLid = QgsGrassFeatureIterator::lidFromFid( fid );
1738+
17141739
int realLine = oldLid;
17151740
int realCat = cat;
17161741
if ( mLayer->map()->newLids().contains( oldLid ) ) // if it was changed already

0 commit comments

Comments
 (0)