mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-14 00:07:35 -04: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
|
%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
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
@ -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 );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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 )
|
||||||
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user