Skip to content

Commit 28b8ab0

Browse files
committed
fix #6120
1 parent 4be3c19 commit 28b8ab0

3 files changed

+40
-22
lines changed

src/app/qgsattributetabledialog.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid
111111
mToggleEditingButton->setEnabled( canChangeAttributes && !mLayer->isReadOnly() );
112112

113113
mSaveEditsButton->setEnabled( canChangeAttributes && mLayer->isEditable() );
114-
mOpenFieldCalculator->setEnabled( canChangeAttributes && mLayer->isEditable() );
114+
mOpenFieldCalculator->setEnabled(( canChangeAttributes || canAddAttributes ) && mLayer->isEditable() );
115115
mDeleteSelectedButton->setEnabled( canDeleteFeatures && mLayer->isEditable() );
116116
mAddAttribute->setEnabled( canAddAttributes && mLayer->isEditable() );
117117
mRemoveAttribute->setEnabled( canDeleteAttributes && mLayer->isEditable() );
@@ -674,7 +674,7 @@ void QgsAttributeTableDialog::editingToggled()
674674
bool canAddAttributes = mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::AddAttributes;
675675
bool canDeleteAttributes = mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::DeleteAttributes;
676676
bool canAddFeatures = mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::AddFeatures;
677-
mOpenFieldCalculator->setEnabled( canChangeAttributes && mLayer->isEditable() );
677+
mOpenFieldCalculator->setEnabled(( canChangeAttributes || canAddAttributes ) && mLayer->isEditable() );
678678
mDeleteSelectedButton->setEnabled( canDeleteFeatures && mLayer->isEditable() );
679679
mAddAttribute->setEnabled( canAddAttributes && mLayer->isEditable() );
680680
mRemoveAttribute->setEnabled( canDeleteAttributes && mLayer->isEditable() );

src/app/qgsfieldcalculator.cpp

+37-19
Original file line numberDiff line numberDiff line change
@@ -42,28 +42,42 @@ QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl )
4242
mOutputFieldWidthSpinBox->setValue( 10 );
4343
mOutputFieldPrecisionSpinBox->setValue( 3 );
4444

45-
// disable creation of new fields if not supported by data provider
46-
if ( !( vl->dataProvider()->capabilities() & QgsVectorDataProvider::AddAttributes ) )
45+
mUpdateExistingGroupBox->setEnabled( vl->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues );
46+
mNewFieldGroupBox->setEnabled( vl->dataProvider()->capabilities() & QgsVectorDataProvider::AddAttributes );
47+
48+
Q_ASSERT( mNewFieldGroupBox->isEnabled() || mUpdateExistingGroupBox->isEnabled() );
49+
50+
if ( mNewFieldGroupBox->isEnabled() )
51+
{
52+
mNewFieldGroupBox->setChecked( true );
53+
}
54+
else
4755
{
56+
mNewFieldGroupBox->setToolTip( tr( "Not available for layer" ) );
57+
mUpdateExistingGroupBox->setChecked( true );
4858
mUpdateExistingGroupBox->setCheckable( false );
49-
mNewFieldGroupBox->setChecked( false );
50-
mNewFieldGroupBox->setTitle( mNewFieldGroupBox->title() + tr( " (not supported by provider)" ) );
5159
}
5260

53-
if ( vl->selectedFeaturesIds().size() > 0 )
61+
if ( mUpdateExistingGroupBox->isEnabled() )
5462
{
55-
mOnlyUpdateSelectedCheckBox->setChecked( true );
63+
mUpdateExistingGroupBox->setChecked( !mNewFieldGroupBox->isEnabled() );
5664
}
65+
else
66+
{
67+
mUpdateExistingGroupBox->setToolTip( tr( "Not available for layer" ) );
68+
mNewFieldGroupBox->setChecked( true );
69+
mNewFieldGroupBox->setCheckable( false );
70+
}
71+
72+
mOnlyUpdateSelectedCheckBox->setChecked( vl->selectedFeaturesIds().size() > 0 );
5773
}
5874

5975
QgsFieldCalculator::~QgsFieldCalculator()
6076
{
61-
6277
}
6378

6479
void QgsFieldCalculator::accept()
6580
{
66-
6781
QString calcString = builder->expressionText();
6882
QgsExpression exp( calcString );
6983

@@ -79,7 +93,7 @@ void QgsFieldCalculator::accept()
7993
mVectorLayer->beginEditCommand( "Field calculator" );
8094

8195
//update existing field
82-
if ( mUpdateExistingGroupBox->isChecked() )
96+
if ( mUpdateExistingGroupBox->isChecked() || !mNewFieldGroupBox->isEnabled() )
8397
{
8498
QMap<QString, int>::const_iterator fieldIt = mFieldMap.find( mExistingFieldComboBox->currentText() );
8599
if ( fieldIt != mFieldMap.end() )
@@ -128,7 +142,7 @@ void QgsFieldCalculator::accept()
128142
bool calculationSuccess = true;
129143
QString error;
130144

131-
bool onlySelected = ( mOnlyUpdateSelectedCheckBox->isChecked() );
145+
bool onlySelected = mOnlyUpdateSelectedCheckBox->isChecked();
132146
QgsFeatureIds selectedIds = mVectorLayer->selectedFeaturesIds();
133147

134148
// block layerModified signals (that would trigger table update)
@@ -269,18 +283,22 @@ void QgsFieldCalculator::populateFields()
269283
void QgsFieldCalculator::setOkButtonState()
270284
{
271285
QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
272-
okButton->setToolTip( "" );
273-
274-
bool emptyFieldName = mOutputFieldNameLineEdit->text().isEmpty();
275-
bool expressionValid = builder->isExpressionValid();
276286

277-
if ( emptyFieldName )
287+
if (( mNewFieldGroupBox->isChecked() || !mUpdateExistingGroupBox->isEnabled() )
288+
&& mOutputFieldNameLineEdit->text().isEmpty() )
289+
{
278290
okButton->setToolTip( tr( "Please enter a field name" ) );
291+
okButton->setEnabled( false );
292+
return;
293+
}
279294

280-
if ( !expressionValid )
295+
if ( !builder->isExpressionValid() )
296+
{
281297
okButton->setToolTip( okButton->toolTip() + tr( "\n The expression is invalid see (more info) for details" ) );
298+
okButton->setEnabled( false );
299+
return;
300+
}
282301

283-
bool okEnabled = ( !emptyFieldName || mUpdateExistingGroupBox->isChecked() ) && expressionValid;
284-
285-
okButton->setEnabled( okEnabled );
302+
okButton->setToolTip( "" );
303+
okButton->setEnabled( true );
286304
}

src/app/qgsvectorlayerproperties.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ void QgsVectorLayerProperties::updateButtons()
426426
int cap = layer->dataProvider()->capabilities();
427427
mAddAttributeButton->setEnabled( cap & QgsVectorDataProvider::AddAttributes );
428428
mDeleteAttributeButton->setEnabled( cap & QgsVectorDataProvider::DeleteAttributes );
429-
mCalculateFieldButton->setEnabled( cap & QgsVectorDataProvider::ChangeAttributeValues );
429+
mCalculateFieldButton->setEnabled( cap & ( QgsVectorDataProvider::ChangeAttributeValues | QgsVectorDataProvider::AddAttributes ) );
430430
mToggleEditingButton->setChecked( true );
431431
}
432432
else

0 commit comments

Comments
 (0)