244 changes: 157 additions & 87 deletions src/app/qgsfieldcalculator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,23 @@ QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl )
mOutputFieldNameLineEdit->setMaxLength( 10 );
}

mUpdateExistingGroupBox->setEnabled( vl->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues );
mNewFieldGroupBox->setEnabled( vl->dataProvider()->capabilities() & QgsVectorDataProvider::AddAttributes );
if( !( vl->dataProvider()->capabilities() & QgsVectorDataProvider::AddAttributes ) )
{
mCreateVirtualFieldCheckbox->setChecked( true );
mCreateVirtualFieldCheckbox->setEnabled( false );
mOnlyVirtualFieldsInfoLabel->setVisible( true );
}
else
{
mOnlyVirtualFieldsInfoLabel->setVisible( false );
}

if ( !( vl->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues ) )
{
mUpdateExistingGroupBox->setEnabled( false );
mCreateVirtualFieldCheckbox->setChecked( true );
mCreateVirtualFieldCheckbox->setEnabled( false );
}

Q_ASSERT( mNewFieldGroupBox->isEnabled() || mUpdateExistingGroupBox->isEnabled() );

Expand All @@ -85,13 +100,21 @@ QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl )
mNewFieldGroupBox->setCheckable( false );
}

bool hasselection = vl->selectedFeaturesIds().size() > 0;
if ( ( mNewFieldGroupBox->isChecked() && mCreateVirtualFieldCheckbox->isChecked() ) || mVectorLayer->isEditable() )
{
mEditModeAutoTurnOnLabel->setVisible( false );
}

bool hasselection = vl->selectedFeatureCount() > 0;
mOnlyUpdateSelectedCheckBox->setChecked( hasselection );
mOnlyUpdateSelectedCheckBox->setEnabled( hasselection );
mOnlyUpdateSelectedCheckBox->setText( tr( "Only update %1 selected features" ).arg( vl->selectedFeaturesIds().size() ) );
mOnlyUpdateSelectedCheckBox->setText( tr( "Only update %1 selected features" ).arg( vl->selectedFeatureCount() ) );

builder->loadRecent( "fieldcalc" );

mEditModeAutoTurnOnLabel->setPixmap( style()->standardPixmap( QStyle::SP_MessageBoxInformation ) );
mOnlyVirtualFieldsInfoLabel->setPixmap( style()->standardPixmap( QStyle::SP_MessageBoxInformation ) );

QSettings settings;
restoreGeometry( settings.value( "/Windows/QgsFieldCalculator/geometry" ).toByteArray() );
}
Expand All @@ -118,7 +141,7 @@ void QgsFieldCalculator::accept()
QgsExpression exp( calcString );
exp.setGeomCalculator( myDa );

if ( !mVectorLayer || !mVectorLayer->isEditable() )
if ( !mVectorLayer )
return;

if ( ! exp.prepare( mVectorLayer->pendingFields() ) )
Expand All @@ -127,118 +150,124 @@ void QgsFieldCalculator::accept()
return;
}

QApplication::setOverrideCursor( Qt::WaitCursor );

mVectorLayer->beginEditCommand( "Field calculator" );

//update existing field
if ( mUpdateExistingGroupBox->isChecked() || !mNewFieldGroupBox->isEnabled() )
if ( mNewFieldGroupBox->isEnabled() && mCreateVirtualFieldCheckbox->isChecked() )
{
QMap<QString, int>::const_iterator fieldIt = mFieldMap.find( mExistingFieldComboBox->currentText() );
if ( fieldIt != mFieldMap.end() )
{
mAttributeId = fieldIt.value();
}
mVectorLayer->addExpressionField( calcString, fieldDefinition() );
}
else
{
//create new field
QgsField newField( mOutputFieldNameLineEdit->text(),
( QVariant::Type ) mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole ).toInt(),
mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole + 1 ).toString(),
mOutputFieldWidthSpinBox->value(),
mOutputFieldPrecisionSpinBox->value() );

if ( !mVectorLayer->addAttribute( newField ) )
if ( !mVectorLayer->isEditable() )
mVectorLayer->startEditing();

QApplication::setOverrideCursor( Qt::WaitCursor );

mVectorLayer->beginEditCommand( "Field calculator" );

//update existing field
if ( mUpdateExistingGroupBox->isChecked() || !mNewFieldGroupBox->isEnabled() )
{
QApplication::restoreOverrideCursor();
QMessageBox::critical( 0, tr( "Provider error" ), tr( "Could not add the new field to the provider." ) );
mVectorLayer->destroyEditCommand();
return;
QMap<QString, int>::const_iterator fieldIt = mFieldMap.find( mExistingFieldComboBox->currentText() );
if ( fieldIt != mFieldMap.end() )
{
mAttributeId = fieldIt.value();
}
}
else
{
//create new field
const QgsField newField = fieldDefinition();

//get index of the new field
const QgsFields& fields = mVectorLayer->pendingFields();
if ( !mVectorLayer->addAttribute( newField ) )
{
QApplication::restoreOverrideCursor();
QMessageBox::critical( 0, tr( "Provider error" ), tr( "Could not add the new field to the provider." ) );
mVectorLayer->destroyEditCommand();
return;
}

for ( int idx = 0; idx < fields.count(); ++idx )
{
if ( fields[idx].name() == mOutputFieldNameLineEdit->text() )
//get index of the new field
const QgsFields& fields = mVectorLayer->pendingFields();

for ( int idx = 0; idx < fields.count(); ++idx )
{
mAttributeId = idx;
break;
if ( fields[idx].name() == mOutputFieldNameLineEdit->text() )
{
mAttributeId = idx;
break;
}
}

if ( ! exp.prepare( mVectorLayer->pendingFields() ) )
{
QApplication::restoreOverrideCursor();
QMessageBox::critical( 0, tr( "Evaluation error" ), exp.evalErrorString() );
return;
}
}

if ( ! exp.prepare( mVectorLayer->pendingFields() ) )
if ( mAttributeId == -1 )
{
mVectorLayer->destroyEditCommand();
QApplication::restoreOverrideCursor();
QMessageBox::critical( 0, tr( "Evaluation error" ), exp.evalErrorString() );
return;
}
}

if ( mAttributeId == -1 )
{
mVectorLayer->destroyEditCommand();
QApplication::restoreOverrideCursor();
return;
}

//go through all the features and change the new attribute
QgsFeature feature;
bool calculationSuccess = true;
QString error;
//go through all the features and change the new attribute
QgsFeature feature;
bool calculationSuccess = true;
QString error;

bool onlySelected = mOnlyUpdateSelectedCheckBox->isChecked();
QgsFeatureIds selectedIds = mVectorLayer->selectedFeaturesIds();
bool onlySelected = mOnlyUpdateSelectedCheckBox->isChecked();
QgsFeatureIds selectedIds = mVectorLayer->selectedFeaturesIds();

bool useGeometry = exp.needsGeometry();
int rownum = 1;
bool useGeometry = exp.needsGeometry();
int rownum = 1;

const QgsField& field = mVectorLayer->pendingFields()[mAttributeId];
const QgsField& field = mVectorLayer->pendingFields()[mAttributeId];

bool newField = !mUpdateExistingGroupBox->isChecked();
QVariant emptyAttribute;
if ( newField )
emptyAttribute = QVariant( field.type() );
bool newField = !mUpdateExistingGroupBox->isChecked();
QVariant emptyAttribute;
if ( newField )
emptyAttribute = QVariant( field.type() );

QgsFeatureIterator fit = mVectorLayer->getFeatures( QgsFeatureRequest().setFlags( useGeometry ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) );
while ( fit.nextFeature( feature ) )
{
if ( onlySelected )
QgsFeatureIterator fit = mVectorLayer->getFeatures( QgsFeatureRequest().setFlags( useGeometry ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) );
while ( fit.nextFeature( feature ) )
{
if ( !selectedIds.contains( feature.id() ) )
if ( onlySelected )
{
continue;
if ( !selectedIds.contains( feature.id() ) )
{
continue;
}
}
}
exp.setCurrentRowNumber( rownum );
QVariant value = exp.evaluate( &feature );
field.convertCompatible( value );
if ( exp.hasEvalError() )
{
calculationSuccess = false;
error = exp.evalErrorString();
break;
}
else
{
mVectorLayer->changeAttributeValue( feature.id(), mAttributeId, value, newField ? emptyAttribute : feature.attributes().value( mAttributeId ) );
exp.setCurrentRowNumber( rownum );
QVariant value = exp.evaluate( &feature );
field.convertCompatible( value );
if ( exp.hasEvalError() )
{
calculationSuccess = false;
error = exp.evalErrorString();
break;
}
else
{
mVectorLayer->changeAttributeValue( feature.id(), mAttributeId, value, newField ? emptyAttribute : feature.attributes().value( mAttributeId ) );
}

rownum++;
}

rownum++;
}
QApplication::restoreOverrideCursor();

QApplication::restoreOverrideCursor();
if ( !calculationSuccess )
{
QMessageBox::critical( 0, tr( "Error" ), tr( "An error occured while evaluating the calculation string:\n%1" ).arg( error ) );
mVectorLayer->destroyEditCommand();
return;
}

if ( !calculationSuccess )
{
QMessageBox::critical( 0, tr( "Error" ), tr( "An error occured while evaluating the calculation string:\n%1" ).arg( error ) );
mVectorLayer->destroyEditCommand();
return;
mVectorLayer->endEditCommand();
}

mVectorLayer->endEditCommand();
QDialog::accept();
}

Expand Down Expand Up @@ -275,12 +304,53 @@ void QgsFieldCalculator::populateOutputFieldTypes()
void QgsFieldCalculator::on_mNewFieldGroupBox_toggled( bool on )
{
mUpdateExistingGroupBox->setChecked( !on );
if ( on && ! ( mVectorLayer->dataProvider()->capabilities() & QgsVectorDataProvider::AddAttributes ) )
{
mOnlyVirtualFieldsInfoLabel->setVisible( true );
}
else
{
mOnlyVirtualFieldsInfoLabel->setVisible( false );
}

if ( ( mNewFieldGroupBox->isChecked() && mCreateVirtualFieldCheckbox->isChecked() ) || mVectorLayer->isEditable() )
{
mEditModeAutoTurnOnLabel->setVisible( false );
}
else
{
mEditModeAutoTurnOnLabel->setVisible( true );
}
}

void QgsFieldCalculator::on_mUpdateExistingGroupBox_toggled( bool on )
{
mNewFieldGroupBox->setChecked( !on );
setOkButtonState();

if ( on )
{
mOnlyUpdateSelectedCheckBox->setEnabled( mVectorLayer->selectedFeatureCount() > 0 );
}
else
{
on_mCreateVirtualFieldCheckbox_stateChanged( mCreateVirtualFieldCheckbox->checkState() );
}
}

void QgsFieldCalculator::on_mCreateVirtualFieldCheckbox_stateChanged( int state )
{
mOnlyUpdateSelectedCheckBox->setChecked( false );
mOnlyUpdateSelectedCheckBox->setEnabled( state != Qt::Checked && mVectorLayer->selectedFeatureCount() > 0 );

if ( ( mNewFieldGroupBox->isChecked() && mCreateVirtualFieldCheckbox->isChecked() ) || mVectorLayer->isEditable() )
{
mEditModeAutoTurnOnLabel->setVisible( false );
}
else
{
mEditModeAutoTurnOnLabel->setVisible( true );
}
}


Expand Down
21 changes: 16 additions & 5 deletions src/app/qgsfieldcalculator.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,27 +36,38 @@ class APP_EXPORT QgsFieldCalculator: public QDialog, private Ui::QgsFieldCalcula

void on_mNewFieldGroupBox_toggled( bool on );
void on_mUpdateExistingGroupBox_toggled( bool on );
void on_mCreateVirtualFieldCheckbox_stateChanged( int state );
void on_mOutputFieldNameLineEdit_textChanged( const QString& text );
void on_mOutputFieldTypeComboBox_activated( int index );

void on_mButtonBox_helpRequested() { QgsContextHelp::run( metaObject()->className() ); }

private slots:
/**Sets the ok button enabled / disabled*/
/** Sets the ok button enabled / disabled*/
void setOkButtonState();

private:
//default constructor forbidden
//! default constructor forbidden
QgsFieldCalculator();
/**Inserts existing fields into the combo box*/
/** Inserts existing fields into the combo box*/
void populateFields();
/**Inserts the types supported by the provider into the combo box*/
/** Inserts the types supported by the provider into the combo box*/
void populateOutputFieldTypes();

QgsVectorLayer* mVectorLayer;
/**Key: field name, Value: field index*/
/** Key: field name, Value: field index*/
QMap<QString, int> mFieldMap;

/** Create a field based on the definitions */
inline QgsField fieldDefinition()
{
return QgsField( mOutputFieldNameLineEdit->text(),
( QVariant::Type ) mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole ).toInt(),
mOutputFieldTypeComboBox->itemData( mOutputFieldTypeComboBox->currentIndex(), Qt::UserRole + 1 ).toString(),
mOutputFieldWidthSpinBox->value(),
mOutputFieldPrecisionSpinBox->value() );
}

/**idx of changed attribute*/
int mAttributeId;

Expand Down
14 changes: 4 additions & 10 deletions src/app/qgsfieldsproperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -533,14 +533,8 @@ void QgsFieldsProperties::on_mAddAttributeButton_clicked()
QgsAddAttrDialog dialog( mLayer, this );
if ( dialog.exec() == QDialog::Accepted )
{
if ( dialog.mode() == QgsAddAttrDialog::VirtualField )
{
mLayer->addExpressionField( dialog.expression(), dialog.field() );
}
else
{
addAttribute( dialog.field() );
}
addAttribute( dialog.field() );

}
}

Expand Down Expand Up @@ -582,13 +576,13 @@ void QgsFieldsProperties::updateButtons()
if ( mLayer->isEditable() )
{
mDeleteAttributeButton->setEnabled( cap & QgsVectorDataProvider::DeleteAttributes );
mCalculateFieldButton->setEnabled( cap & ( QgsVectorDataProvider::ChangeAttributeValues | QgsVectorDataProvider::AddAttributes ) );
mAddAttributeButton->setEnabled( cap & QgsVectorDataProvider::AddAttributes );
mToggleEditingButton->setChecked( true );
}
else
{
mToggleEditingButton->setChecked( false );
mCalculateFieldButton->setEnabled( false );
mAddAttributeButton->setEnabled( false );

// Enable delete button if items are selected
mDeleteAttributeButton->setEnabled( mFieldsList->selectedItems().count() > 0 );
Expand Down
240 changes: 69 additions & 171 deletions src/ui/qgsaddattrdialogbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>487</width>
<height>416</height>
<width>225</width>
<height>190</height>
</rect>
</property>
<property name="windowTitle">
Expand All @@ -17,196 +17,97 @@
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="textLabel1">
<property name="text">
<string>N&amp;ame</string>
</property>
<property name="buddy">
<cstring>mNameEdit</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="mButtonVirtualField">
<property name="toolTip">
<string>&lt;i&gt;Virtual fields&lt;/i&gt; are calculated on the fly and cannot be directly modified and will not be saved to the data.</string>
<widget class="QLineEdit" name="mNameEdit"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="textLabel1_2">
<property name="text">
<string>Comment</string>
</property>
<property name="buddy">
<cstring>mCommentEdit</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="mCommentEdit"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="textLabel2">
<property name="text">
<string>Virtual Field</string>
<string>Type</string>
</property>
<property name="buddy">
<cstring>mTypeBox</cstring>
</property>
<attribute name="buttonGroup">
<string notr="true">mFieldModeButtonGroup</string>
</attribute>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="mButtonProviderField">
<property name="toolTip">
<string>&lt;i&gt;Permanent fields&lt;/i&gt; are saved in the data provider and it is possible to directly modify them.</string>
<item row="2" column="1">
<widget class="QComboBox" name="mTypeBox"/>
</item>
<item row="3" column="1">
<widget class="QLabel" name="mTypeName">
<property name="text">
<string>Type</string>
</property>
<property name="buddy">
<cstring>mTypeBox</cstring>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="mLengthLabel">
<property name="text">
<string>Permanent Field</string>
<string>Width</string>
</property>
<property name="checked">
<bool>true</bool>
<property name="buddy">
<cstring>mLength</cstring>
</property>
<attribute name="buttonGroup">
<string notr="true">mFieldModeButtonGroup</string>
</attribute>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QWidget" name="widget" native="true">
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="margin">
<number>0</number>
</property>
<item row="2" column="0">
<widget class="QLabel" name="mExpressionLabel">
<property name="toolTip">
<string>Define an expression which will be used to calculate this field.</string>
</property>
<property name="text">
<string>Expression</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="textLabel1">
<property name="text">
<string>N&amp;ame</string>
</property>
<property name="buddy">
<cstring>mNameEdit</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="mNameEdit"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="textLabel1_2">
<property name="text">
<string>Comment</string>
</property>
<property name="buddy">
<cstring>mCommentEdit</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="mCommentEdit"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="textLabel2">
<property name="text">
<string>Type</string>
</property>
<property name="buddy">
<cstring>mTypeBox</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="mTypeBox"/>
</item>
<item row="6" column="1">
<widget class="QLabel" name="mTypeName">
<property name="text">
<string>Type</string>
</property>
<property name="buddy">
<cstring>mTypeBox</cstring>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="mLengthLabel">
<property name="text">
<string>Width</string>
</property>
<property name="buddy">
<cstring>mLength</cstring>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QSpinBox" name="mLength"/>
</item>
<item row="8" column="0">
<widget class="QLabel" name="mPrecLabel">
<property name="text">
<string>Precision</string>
</property>
<property name="buddy">
<cstring>mPrec</cstring>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QSpinBox" name="mPrec"/>
</item>
<item row="2" column="1">
<widget class="QgsFieldExpressionWidget" name="mExpressionWidget" native="true"/>
</item>
</layout>
<item row="4" column="1">
<widget class="QSpinBox" name="mLength"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="mPrecLabel">
<property name="text">
<string>Precision</string>
</property>
<property name="buddy">
<cstring>mPrec</cstring>
</property>
</widget>
</item>
<item row="12" column="0" colspan="2">
<item row="5" column="1">
<widget class="QSpinBox" name="mPrec"/>
</item>
<item row="6" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QWidget" name="mLayerEditableInfo" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="mInfoIcon">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Layer is currently not in edit mode. To add a permanent field, editing mode will automatically be turned on.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>QgsFieldExpressionWidget</class>
<extends>QWidget</extends>
<header>qgsfieldexpressionwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>mNameEdit</tabstop>
<tabstop>mCommentEdit</tabstop>
<tabstop>mTypeBox</tabstop>
<tabstop>mLength</tabstop>
<tabstop>mPrec</tabstop>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources/>
Expand Down Expand Up @@ -244,7 +145,4 @@
</hints>
</connection>
</connections>
<buttongroups>
<buttongroup name="mFieldModeButtonGroup"/>
</buttongroups>
</ui>
110 changes: 76 additions & 34 deletions src/ui/qgsfieldcalculatorbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,6 @@
<string>Field calculator</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QCheckBox" name="mOnlyUpdateSelectedCheckBox">
<property name="text">
<string>Only update selected features</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="mNewFieldGroupBox">
<property name="sizePolicy">
Expand Down Expand Up @@ -49,7 +42,7 @@
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
<number>9</number>
</property>
<property name="rightMargin">
<number>3</number>
Expand All @@ -60,7 +53,7 @@
<property name="verticalSpacing">
<number>3</number>
</property>
<item row="0" column="0">
<item row="1" column="0">
<widget class="QLabel" name="mFieldNameLabel">
<property name="text">
<string>Output field name</string>
Expand All @@ -70,10 +63,10 @@
</property>
</widget>
</item>
<item row="0" column="1" colspan="3">
<item row="1" column="1" colspan="3">
<widget class="QLineEdit" name="mOutputFieldNameLineEdit"/>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QLabel" name="mOutputFieldTypeLabel">
<property name="text">
<string>Output field type</string>
Expand All @@ -83,10 +76,10 @@
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<item row="2" column="1" colspan="3">
<widget class="QComboBox" name="mOutputFieldTypeComboBox"/>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QLabel" name="mOutputFieldWidthLabel">
<property name="text">
<string>Output field width</string>
Expand All @@ -96,7 +89,7 @@
</property>
</widget>
</item>
<item row="2" column="1">
<item row="3" column="1">
<widget class="QSpinBox" name="mOutputFieldWidthSpinBox">
<property name="toolTip">
<string>Width of complete output. For example 123,456 means 6 as field width.</string>
Expand All @@ -109,7 +102,7 @@
</property>
</widget>
</item>
<item row="2" column="2">
<item row="3" column="2">
<widget class="QLabel" name="mOutputFieldPrecisionLabel">
<property name="text">
<string>Precision</string>
Expand All @@ -119,16 +112,66 @@
</property>
</widget>
</item>
<item row="2" column="3">
<item row="3" column="3">
<widget class="QSpinBox" name="mOutputFieldPrecisionSpinBox">
<property name="value">
<number>2</number>
</property>
</widget>
</item>
<item row="4" column="0" colspan="4">
<widget class="QCheckBox" name="mCreateVirtualFieldCheckbox">
<property name="toolTip">
<string>A virtual field will be recalculated every time it is used and will not be saved in the data provider but in the project.</string>
</property>
<property name="text">
<string>Create virtual field</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QDialogButtonBox" name="mButtonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>3</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="mOnlyVirtualFieldsInfoLabel">
<property name="text">
<string>This layer does not support adding new provider fields. You can only add virtual fields.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QgsExpressionBuilderWidget" name="builder" native="true">
<property name="autoFillBackground">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="mOnlyUpdateSelectedCheckBox">
<property name="text">
<string>Only update selected features</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QGroupBox" name="mUpdateExistingGroupBox">
<property name="title">
Expand All @@ -144,32 +187,31 @@
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QComboBox" name="mExistingFieldComboBox"/>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QgsExpressionBuilderWidget" name="builder" native="true">
<property name="autoFillBackground">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QDialogButtonBox" name="mButtonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>3</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
<widget class="QLabel" name="mEditModeAutoTurnOnLabel">
<property name="text">
<string>You are editing information on this layer but the layer is currently not in edit mode. If you click Ok, edit mode will automatically be turned on.</string>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
Expand Down