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 %End
static bool fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, QgsFeatureId fid = -1 ); static bool fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, const QgsFeature &feature );
%Docstring %Docstring
:return: true if the field at index:param fieldIndex: from:param layer: is editable, :return: true if the:param feature: field at index:param fieldIndex: from:param layer:
false if the field is readonly is editable, false if the field is readonly
:param fid: feature id value, -1 if it's a new feature
.. versionadded:: 3.10 .. versionadded:: 3.10
%End %End

View File

@ -903,27 +903,33 @@ QgsAttributeMap QgsVectorLayerUtils::QgsFeatureData::attributes() const
return mAttributes; return mAttributes;
} }
bool _fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, QgsFeatureId fid ) bool _fieldIsEditable( const QgsVectorLayer *layer, int fieldIndex, const QgsFeature &feature )
{ {
return layer->isEditable() && return layer->isEditable() &&
!layer->editFormConfig().readOnly( fieldIndex ) && !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 ) if ( layer->fields().fieldOrigin( fieldIndex ) == QgsFields::OriginJoin )
{ {
int srcFieldIndex; int srcFieldIndex;
const QgsVectorLayerJoinInfo *info = layer->joinBuffer()->joinForFieldIndex( fieldIndex, layer->fields(), srcFieldIndex ); const QgsVectorLayerJoinInfo *info = layer->joinBuffer()->joinForFieldIndex( fieldIndex, layer->fields(), srcFieldIndex );
if ( info && info->isEditable() ) if ( !info || !info->isEditable() )
editable = _fieldIsEditable( info->joinLayer(), srcFieldIndex, fid ); 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 else
editable = _fieldIsEditable( layer, fieldIndex, fid ); return _fieldIsEditable( layer, fieldIndex, feature );
return editable;
} }

View File

@ -285,13 +285,12 @@ class CORE_EXPORT QgsVectorLayerUtils
/** /**
* \return true if the field at index \param fieldIndex from \param layer is editable, * \return true if the \param feature field at index \param fieldIndex from \param layer
* false if the field is readonly * is editable, false if the field is readonly
* \param fid feature id value, -1 if it's a new feature
* *
* \since QGIS 3.10 * \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 bool QgsAttributeForm::fieldIsEditable( int fieldIndex ) const
{ {
if ( mLayer->fields().fieldOrigin( fieldIndex ) == QgsFields::OriginJoin ) return QgsVectorLayerUtils::fieldIsEditable( mLayer, fieldIndex, mFeature );
{
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() );
} }
void QgsAttributeForm::updateIcon( QgsEditorWidgetWrapper *eww ) void QgsAttributeForm::updateIcon( QgsEditorWidgetWrapper *eww )

View File

@ -157,6 +157,7 @@ void QgsAttributeFormEditorWidget::initialize( const QVariant &initialValue, boo
setIsMixed( mixedValues ); setIsMixed( mixedValues );
mMultiEditButton->setIsChanged( false ); mMultiEditButton->setIsChanged( false );
mIsChanged = false; mIsChanged = false;
updateWidgets();
} }
QVariant QgsAttributeFormEditorWidget::currentValue() const QVariant QgsAttributeFormEditorWidget::currentValue() const
@ -230,7 +231,14 @@ void QgsAttributeFormEditorWidget::updateWidgets()
bool hasMultiEditButton = ( editPage()->layout()->indexOf( mMultiEditButton ) >= 0 ); bool hasMultiEditButton = ( editPage()->layout()->indexOf( mMultiEditButton ) >= 0 );
const int fieldIndex = mEditorWidget->fieldIdx(); 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 ) if ( hasMultiEditButton )
{ {