Fix pasting features - only a single insert operation, no unnecessary updates

This commit is contained in:
Ivan Ivanov 2020-07-15 15:03:47 +03:00
parent 66b9f035d4
commit 0772c78512
3 changed files with 22 additions and 3 deletions

View File

@ -52,7 +52,7 @@ void QgsFixAttributeDialog::init( QgsVectorLayer *layer, const QgsAttributeEdito
infoLayout->addWidget( mProgressBar ); infoLayout->addWidget( mProgressBar );
QgsFeature feature; QgsFeature feature;
mAttributeForm = new QgsAttributeForm( layer, *mCurrentFeature, context, this ); mAttributeForm = new QgsAttributeForm( layer, *mCurrentFeature, context, this );
mAttributeForm->setMode( QgsAttributeEditorContext::SingleEditMode ); mAttributeForm->setMode( QgsAttributeEditorContext::FixAttributeMode );
mAttributeForm->disconnectButtonBox(); mAttributeForm->disconnectButtonBox();
layout()->addWidget( mAttributeForm ); layout()->addWidget( mAttributeForm );

View File

@ -49,6 +49,7 @@ class GUI_EXPORT QgsAttributeEditorContext
SingleEditMode, //!< Single edit mode, for editing a single feature SingleEditMode, //!< Single edit mode, for editing a single feature
AddFeatureMode, /*!< Add feature mode, for setting attributes for a new feature. In this mode the dialog will be editable even with an invalid feature and AddFeatureMode, /*!< Add feature mode, for setting attributes for a new feature. In this mode the dialog will be editable even with an invalid feature and
will add a new feature when the form is accepted. */ will add a new feature when the form is accepted. */
FixAttributeMode, //!< Fix feature mode, for modifying the feature attributes without saving. The updated feature is available via `feature()` after `save()`
MultiEditMode, //!< Multi edit mode, for editing fields of multiple features at once MultiEditMode, //!< Multi edit mode, for editing fields of multiple features at once
SearchMode, //!< Form values are used for searching/filtering the layer SearchMode, //!< Form values are used for searching/filtering the layer
AggregateSearchMode, //!< Form is in aggregate search mode, show each widget in this mode \since QGIS 3.0 AggregateSearchMode, //!< Form is in aggregate search mode, show each widget in this mode \since QGIS 3.0

View File

@ -173,6 +173,10 @@ void QgsAttributeForm::setMode( QgsAttributeEditorContext::Mode mode )
w->setMode( QgsAttributeFormWidget::DefaultMode ); w->setMode( QgsAttributeFormWidget::DefaultMode );
break; break;
case QgsAttributeEditorContext::FixAttributeMode:
w->setMode( QgsAttributeFormWidget::DefaultMode );
break;
case QgsAttributeEditorContext::MultiEditMode: case QgsAttributeEditorContext::MultiEditMode:
w->setMode( QgsAttributeFormWidget::MultiEditMode ); w->setMode( QgsAttributeFormWidget::MultiEditMode );
break; break;
@ -216,6 +220,11 @@ void QgsAttributeForm::setMode( QgsAttributeEditorContext::Mode mode )
mSearchButtonBox->setVisible( false ); mSearchButtonBox->setVisible( false );
break; break;
case QgsAttributeEditorContext::FixAttributeMode:
synchronizeEnabledState();
mSearchButtonBox->setVisible( false );
break;
case QgsAttributeEditorContext::MultiEditMode: case QgsAttributeEditorContext::MultiEditMode:
resetMultiEdit( false ); resetMultiEdit( false );
synchronizeEnabledState(); synchronizeEnabledState();
@ -278,6 +287,7 @@ void QgsAttributeForm::setFeature( const QgsFeature &feature )
case QgsAttributeEditorContext::SingleEditMode: case QgsAttributeEditorContext::SingleEditMode:
case QgsAttributeEditorContext::IdentifyMode: case QgsAttributeEditorContext::IdentifyMode:
case QgsAttributeEditorContext::AddFeatureMode: case QgsAttributeEditorContext::AddFeatureMode:
case QgsAttributeEditorContext::FixAttributeMode:
{ {
resetValues(); resetValues();
@ -320,7 +330,7 @@ bool QgsAttributeForm::saveEdits()
// An add dialog should perform an action by default // An add dialog should perform an action by default
// and not only if attributes have "changed" // and not only if attributes have "changed"
if ( mMode == QgsAttributeEditorContext::AddFeatureMode ) if ( mMode == QgsAttributeEditorContext::AddFeatureMode || mMode == QgsAttributeEditorContext::FixAttributeMode )
doUpdate = true; doUpdate = true;
QgsAttributes src = mFeature.attributes(); QgsAttributes src = mFeature.attributes();
@ -379,7 +389,11 @@ bool QgsAttributeForm::saveEdits()
if ( doUpdate ) if ( doUpdate )
{ {
if ( mMode == QgsAttributeEditorContext::AddFeatureMode ) if ( mMode == QgsAttributeEditorContext::FixAttributeMode )
{
mFeature = updatedFeature;
}
else if ( mMode == QgsAttributeEditorContext::AddFeatureMode )
{ {
mFeature.setValid( true ); mFeature.setValid( true );
mLayer->beginEditCommand( mEditCommandMessage ); mLayer->beginEditCommand( mEditCommandMessage );
@ -735,6 +749,7 @@ bool QgsAttributeForm::save()
{ {
case QgsAttributeEditorContext::SingleEditMode: case QgsAttributeEditorContext::SingleEditMode:
case QgsAttributeEditorContext::IdentifyMode: case QgsAttributeEditorContext::IdentifyMode:
case QgsAttributeEditorContext::FixAttributeMode:
case QgsAttributeEditorContext::MultiEditMode: case QgsAttributeEditorContext::MultiEditMode:
if ( !mDirty ) if ( !mDirty )
return true; return true;
@ -761,6 +776,7 @@ bool QgsAttributeForm::save()
case QgsAttributeEditorContext::SingleEditMode: case QgsAttributeEditorContext::SingleEditMode:
case QgsAttributeEditorContext::IdentifyMode: case QgsAttributeEditorContext::IdentifyMode:
case QgsAttributeEditorContext::AddFeatureMode: case QgsAttributeEditorContext::AddFeatureMode:
case QgsAttributeEditorContext::FixAttributeMode:
case QgsAttributeEditorContext::SearchMode: case QgsAttributeEditorContext::SearchMode:
case QgsAttributeEditorContext::AggregateSearchMode: case QgsAttributeEditorContext::AggregateSearchMode:
success = saveEdits(); success = saveEdits();
@ -848,6 +864,7 @@ void QgsAttributeForm::onAttributeChanged( const QVariant &value, const QVariant
case QgsAttributeEditorContext::SingleEditMode: case QgsAttributeEditorContext::SingleEditMode:
case QgsAttributeEditorContext::IdentifyMode: case QgsAttributeEditorContext::IdentifyMode:
case QgsAttributeEditorContext::AddFeatureMode: case QgsAttributeEditorContext::AddFeatureMode:
case QgsAttributeEditorContext::FixAttributeMode:
{ {
Q_NOWARN_DEPRECATED_PUSH Q_NOWARN_DEPRECATED_PUSH
emit attributeChanged( eww->field().name(), value ); emit attributeChanged( eww->field().name(), value );
@ -2264,6 +2281,7 @@ void QgsAttributeForm::layerSelectionChanged()
case QgsAttributeEditorContext::SingleEditMode: case QgsAttributeEditorContext::SingleEditMode:
case QgsAttributeEditorContext::IdentifyMode: case QgsAttributeEditorContext::IdentifyMode:
case QgsAttributeEditorContext::AddFeatureMode: case QgsAttributeEditorContext::AddFeatureMode:
case QgsAttributeEditorContext::FixAttributeMode:
case QgsAttributeEditorContext::SearchMode: case QgsAttributeEditorContext::SearchMode:
case QgsAttributeEditorContext::AggregateSearchMode: case QgsAttributeEditorContext::AggregateSearchMode:
break; break;