fieldIsEditable looks for joined feature to exist if no upsertOnEdit

This commit is contained in:
Julien Cabieces 2019-08-20 09:21:19 +02:00 committed by Nyall Dawson
parent 484ee53899
commit 2ab88ad501
5 changed files with 32 additions and 30 deletions

View File

@ -277,13 +277,11 @@ The following operations will be performed to convert the input features:
%End
static bool fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, QgsFeatureId fid = -1 );
static bool fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, const QgsFeature &feature );
%Docstring
:return: true if the field at index:param fieldIndex: from:param layer: is editable,
false if the field is readonly
:param fid: feature id value, -1 if it's a new feature
:return: true if the:param feature: field at index:param fieldIndex: from:param layer:
is editable, false if the field is readonly
.. versionadded:: 3.10
%End

View File

@ -903,27 +903,33 @@ QgsAttributeMap QgsVectorLayerUtils::QgsFeatureData::attributes() const
return mAttributes;
}
bool _fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, QgsFeatureId fid )
bool _fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, const QgsFeature &feature )
{
return layer->isEditable() &&
!layer->editFormConfig().readOnly( fieldIndex ) &&
( ( layer->dataProvider() && layer->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues ) || FID_IS_NEW( fid ) );
( ( layer->dataProvider() && layer->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues ) || FID_IS_NEW( feature.id() ) );
}
bool QgsVectorLayerUtils::fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, QgsFeatureId fid )
bool QgsVectorLayerUtils::fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, const QgsFeature &feature )
{
bool editable = false;
if ( layer->fields().fieldOrigin( fieldIndex ) == QgsFields::OriginJoin )
{
int srcFieldIndex;
const QgsVectorLayerJoinInfo *info = layer->joinBuffer()->joinForFieldIndex( fieldIndex, layer->fields(), srcFieldIndex );
if ( info && info->isEditable() )
editable = _fieldIsEditable( info->joinLayer(), srcFieldIndex, fid );
if ( !info || !info->isEditable() )
return false;
// check that joined feature exist, else it is not editable
if ( !info->hasUpsertOnEdit() )
{
const QgsFeature joinedFeature = layer->joinBuffer()->joinedFeatureOf( info, feature );
if ( !joinedFeature.isValid() )
return false;
}
return _fieldIsEditable( info->joinLayer(), srcFieldIndex, feature );
}
else
editable = _fieldIsEditable( layer, fieldIndex, fid );
return editable;
return _fieldIsEditable( layer, fieldIndex, feature );
}

View File

@ -285,13 +285,12 @@ class CORE_EXPORT QgsVectorLayerUtils
/**
* \return true if the field at index \param fieldIndex from \param layer is editable,
* false if the field is readonly
* \param fid feature id value, -1 if it's a new feature
* \return true if the \param feature field at index \param fieldIndex from \param layer
* is editable, false if the field is readonly
*
* \since QGIS 3.10
*/
static bool fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, QgsFeatureId fid = -1 );
static bool fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, const QgsFeature &feature );
};

View File

@ -2390,16 +2390,7 @@ void QgsAttributeForm::updateJoinedFields( const QgsEditorWidgetWrapper &eww )
bool QgsAttributeForm::fieldIsEditable( int fieldIndex ) const
{
if ( mLayer->fields().fieldOrigin( fieldIndex ) == QgsFields::OriginJoin )
{
int srcFieldIndex;
const QgsVectorLayerJoinInfo *info = mLayer->joinBuffer()->joinForFieldIndex( fieldIndex, mLayer->fields(), srcFieldIndex );
if ( info && !info->hasUpsertOnEdit() && mMode == QgsAttributeEditorContext::AddFeatureMode )
return false;
}
return QgsVectorLayerUtils::fieldIsEditable( mLayer, fieldIndex, mFeature.id() );
return QgsVectorLayerUtils::fieldIsEditable( mLayer, fieldIndex, mFeature );
}
void QgsAttributeForm::updateIcon( QgsEditorWidgetWrapper *eww )

View File

@ -157,6 +157,7 @@ void QgsAttributeFormEditorWidget::initialize( const QVariant &initialValue, boo
setIsMixed( mixedValues );
mMultiEditButton->setIsChanged( false );
mIsChanged = false;
updateWidgets();
}
QVariant QgsAttributeFormEditorWidget::currentValue() const
@ -230,7 +231,14 @@ void QgsAttributeFormEditorWidget::updateWidgets()
bool hasMultiEditButton = ( editPage()->layout()->indexOf( mMultiEditButton ) >= 0 );
const int fieldIndex = mEditorWidget->fieldIdx();
bool fieldReadOnly = !QgsVectorLayerUtils::fieldIsEditable( layer(), fieldIndex );
bool fieldReadOnly = false;
QgsFeature feature;
auto it = layer()->getSelectedFeatures();
while ( it.nextFeature( feature ) )
{
fieldReadOnly |= !QgsVectorLayerUtils::fieldIsEditable( layer(), fieldIndex, feature );
}
if ( hasMultiEditButton )
{