Fix renaming a virtual field leads to crash (fix #15669)

This commit is contained in:
Nyall Dawson 2016-10-09 08:56:50 +10:00
parent 3b9316dae9
commit 3a76708bcb
5 changed files with 68 additions and 2 deletions

View File

@ -27,6 +27,16 @@ class QgsExpressionFieldBuffer
*/
void removeExpression( int index );
/**
* Renames an expression field at a given index
*
* @param index The index of the expression to change
* @param name New name for field
*
* @note added in 3.0
*/
void renameExpression( int index, const QString& name );
/**
* Changes the expression at a given index
*

View File

@ -33,6 +33,11 @@ void QgsExpressionFieldBuffer::removeExpression( int index )
mExpressions.removeAt( index );
}
void QgsExpressionFieldBuffer::renameExpression( int index, const QString& name )
{
mExpressions[index].field.setName( name );
}
void QgsExpressionFieldBuffer::updateExpression( int index, const QString& exp )
{
mExpressions[index].cachedExpression = QgsExpression( exp );

View File

@ -61,6 +61,16 @@ class CORE_EXPORT QgsExpressionFieldBuffer
*/
void removeExpression( int index );
/**
* Renames an expression field at a given index
*
* @param index The index of the expression to change
* @param name New name for field
*
* @note added in 3.0
*/
void renameExpression( int index, const QString& name );
/**
* Changes the expression at a given index
*

View File

@ -2125,10 +2125,41 @@ void QgsVectorLayer::removeFieldAlias( int attIndex )
bool QgsVectorLayer::renameAttribute( int index, const QString& newName )
{
if ( !mEditBuffer || !mDataProvider )
if ( index < 0 || index >= fields().count() )
return false;
return mEditBuffer->renameAttribute( index, newName );
switch ( mFields.fieldOrigin( index ) )
{
case QgsFields::OriginExpression:
{
if ( mExpressionFieldBuffer )
{
int oi = mFields.fieldOriginIndex( index );
mExpressionFieldBuffer->renameExpression( oi, newName );
updateFields();
return true;
}
else
{
return false;
}
}
case QgsFields::OriginProvider:
case QgsFields::OriginEdit:
if ( !mEditBuffer || !mDataProvider )
return false;
return mEditBuffer->renameAttribute( index, newName );
case QgsFields::OriginJoin:
case QgsFields::OriginUnknown:
return false;
}
return false; // avoid warning
}
void QgsVectorLayer::setFieldAlias( int attIndex, const QString& aliasString )

View File

@ -1058,6 +1058,16 @@ class TestQgsVectorLayer(unittest.TestCase):
#layer.undoStack().redo()
#checkFieldNames(['fldint'])
def test_RenameExpressionField(self):
layer = createLayerWithOnePoint()
exp_field_idx = layer.addExpressionField('1+1', QgsField('math_is_hard', QVariant.Int))
#rename and check
self.assertTrue(layer.renameAttribute(exp_field_idx, 'renamed'))
self.assertEqual(layer.fields()[exp_field_idx].name(), 'renamed')
f = next(layer.getFeatures())
self.assertEqual(f.fields()[exp_field_idx].name(), 'renamed')
def test_fields(self):
layer = createLayerWithOnePoint()