mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
fieldIsEditable looks for joined feature to exist if no upsertOnEdit
This commit is contained in:
parent
484ee53899
commit
2ab88ad501
@ -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
|
||||
|
@ -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 );
|
||||
}
|
||||
|
@ -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 );
|
||||
|
||||
};
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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 )
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user