@@ -140,6 +140,8 @@ void QgsFieldsProperties::onAttributeSelectionChanged()
140140 if ( mDesignerTree ->selectedItems ()[0 ]->data ( 0 , DesignerTreeRole ).value <DesignerTreeItemData>().type () == DesignerTreeItemData::Container )
141141 isAddPossible = true ;
142142 mAddItemButton ->setEnabled ( isAddPossible );
143+
144+ updateButtons ();
143145}
144146
145147QTreeWidgetItem *QgsFieldsProperties::loadAttributeEditorTreeItem ( QgsAttributeEditorElement* const widgetDef, QTreeWidgetItem* parent )
@@ -161,7 +163,7 @@ QTreeWidgetItem *QgsFieldsProperties::loadAttributeEditorTreeItem( QgsAttributeE
161163
162164 const QgsAttributeEditorContainer* container = dynamic_cast <const QgsAttributeEditorContainer*>( widgetDef );
163165
164- Q_FOREACH ( QgsAttributeEditorElement* wdg, container->children () )
166+ Q_FOREACH ( QgsAttributeEditorElement* wdg, container->children () )
165167 {
166168 loadAttributeEditorTreeItem ( wdg, newWidget );
167169 }
@@ -185,7 +187,7 @@ void QgsFieldsProperties::loadAttributeEditorTree()
185187 mDesignerTree ->setAcceptDrops ( true );
186188 mDesignerTree ->setDragDropMode ( QAbstractItemView::DragDrop );
187189
188- Q_FOREACH ( QgsAttributeEditorElement* wdg, mLayer ->attributeEditorElements () )
190+ Q_FOREACH ( QgsAttributeEditorElement* wdg, mLayer ->attributeEditorElements () )
189191 {
190192 loadAttributeEditorTreeItem ( wdg, mDesignerTree ->invisibleRootItem () );
191193 }
@@ -270,7 +272,7 @@ void QgsFieldsProperties::loadRelations()
270272
271273 int idx = 0 ;
272274
273- Q_FOREACH ( const QgsRelation& relation, relations )
275+ Q_FOREACH ( const QgsRelation& relation, relations )
274276 {
275277 mRelationsList ->insertRow ( idx );
276278
@@ -308,7 +310,7 @@ void QgsFieldsProperties::on_mAddItemButton_clicked()
308310 if ( parent->data ( 0 , DesignerTreeRole ).value <DesignerTreeItemData>().type () != DesignerTreeItemData::Container )
309311 return ;
310312
311- Q_FOREACH ( QTableWidgetItem* item, listItems )
313+ Q_FOREACH ( QTableWidgetItem* item, listItems )
312314 {
313315 if ( item->column () == 0 ) // Information is in the first column
314316 mDesignerTree ->addItem ( parent , item->data ( DesignerTreeRole ).value <DesignerTreeItemData>() );
@@ -407,7 +409,7 @@ void QgsFieldsProperties::attributeTypeDialog()
407409 int index = -1 ;
408410 int row = -1 ;
409411
410- Q_FOREACH ( QTableWidgetItem* wdg, mIndexedWidgets )
412+ Q_FOREACH ( QTableWidgetItem* wdg, mIndexedWidgets )
411413 {
412414 cfg = wdg->data ( FieldConfigRole ).value <FieldConfig>();
413415 if ( cfg.mButton == pb )
@@ -486,6 +488,7 @@ bool QgsFieldsProperties::addAttribute( const QgsField &field )
486488 else
487489 {
488490 mLayer ->destroyEditCommand ();
491+ QMessageBox::critical ( this , tr ( " Failed to add field" ), tr ( " Failed to add field '%1' of type '%2'. Is the field name unique?" ).arg ( field.name () ).arg ( field.typeName () ) );
489492 return false ;
490493 }
491494}
@@ -536,34 +539,38 @@ void QgsFieldsProperties::on_mAddAttributeButton_clicked()
536539 }
537540 else
538541 {
539- mLayer ->beginEditCommand ( " Attribute added" );
540- if ( !addAttribute ( dialog.field () ) )
541- {
542- mLayer ->destroyEditCommand ();
543- QMessageBox::information ( this , tr ( " Name conflict" ), tr ( " The attribute could not be inserted. The name already exists in the table." ) );
544- }
545- else
546- {
547- mLayer ->endEditCommand ();
548- }
542+ addAttribute ( dialog.field () );
549543 }
550544 }
551545}
552546
553547void QgsFieldsProperties::on_mDeleteAttributeButton_clicked ()
554548{
555- QSet<int > attrs;
556- foreach ( QTableWidgetItem* item, mFieldsList ->selectedItems () )
549+ QSet<int > providerFields;
550+ QSet<int > expressionFields;
551+ Q_FOREACH ( QTableWidgetItem* item, mFieldsList ->selectedItems () )
557552 {
558553 if ( item->column () == 0 )
559554 {
560- attrs << mIndexedWidgets .indexOf ( item );
555+ int idx = mIndexedWidgets .indexOf ( item );
556+ if ( mLayer ->pendingFields ().fieldOrigin ( idx ) == QgsFields::OriginExpression )
557+ expressionFields << idx;
558+ else
559+ providerFields << idx;
561560 }
562561 }
563562
564- mLayer ->beginEditCommand ( tr ( " Deleted attribute" ) );
565- mLayer ->deleteAttributes ( attrs.toList () );
566- mLayer ->endEditCommand ();
563+ if ( expressionFields.count () )
564+ mLayer ->deleteAttributes ( expressionFields.toList () );
565+
566+ if ( providerFields.count () )
567+ {
568+ mLayer ->beginEditCommand ( tr ( " Deleted attributes" ) );
569+ if ( mLayer ->deleteAttributes ( providerFields.toList () ) )
570+ mLayer ->endEditCommand ();
571+ else
572+ mLayer ->destroyEditCommand ();
573+ }
567574}
568575
569576void QgsFieldsProperties::updateButtons ()
@@ -574,17 +581,31 @@ void QgsFieldsProperties::updateButtons()
574581
575582 if ( mLayer ->isEditable () )
576583 {
577- mAddAttributeButton ->setEnabled ( cap & QgsVectorDataProvider::AddAttributes );
578584 mDeleteAttributeButton ->setEnabled ( cap & QgsVectorDataProvider::DeleteAttributes );
579585 mCalculateFieldButton ->setEnabled ( cap & ( QgsVectorDataProvider::ChangeAttributeValues | QgsVectorDataProvider::AddAttributes ) );
580586 mToggleEditingButton ->setChecked ( true );
581587 }
582588 else
583589 {
584- mAddAttributeButton ->setEnabled ( false );
585- mDeleteAttributeButton ->setEnabled ( false );
586590 mToggleEditingButton ->setChecked ( false );
587591 mCalculateFieldButton ->setEnabled ( false );
592+
593+ // Enable delete button if items are selected
594+ mDeleteAttributeButton ->setEnabled ( mFieldsList ->selectedItems ().count () > 0 );
595+
596+ // and only if all selected items have their origin in an expression
597+ Q_FOREACH ( QTableWidgetItem* item, mFieldsList ->selectedItems () )
598+ {
599+ if ( item->column () == 0 )
600+ {
601+ int idx = mIndexedWidgets .indexOf ( item );
602+ if ( mLayer ->pendingFields ().fieldOrigin ( idx ) != QgsFields::OriginExpression )
603+ {
604+ mDeleteAttributeButton ->setEnabled ( false );
605+ break ;
606+ }
607+ }
608+ }
588609 }
589610}
590611
@@ -826,7 +847,7 @@ QMimeData* QgsFieldsProperties::DragList::mimeData( const QList<QTableWidgetItem
826847 QByteArray encoded;
827848 QDataStream stream ( &encoded, QIODevice::WriteOnly );
828849
829- Q_FOREACH ( const QTableWidgetItem* item, items )
850+ Q_FOREACH ( const QTableWidgetItem* item, items )
830851 {
831852 // Relevant information is always in the UserRole of the first column
832853 if ( item && item->column () == 0 )
@@ -996,7 +1017,7 @@ QMimeData* QgsFieldsProperties::DesignerTree::mimeData( const QList<QTreeWidgetI
9961017 QByteArray encoded;
9971018 QDataStream stream ( &encoded, QIODevice::WriteOnly );
9981019
999- Q_FOREACH ( const QTreeWidgetItem* item, items )
1020+ Q_FOREACH ( const QTreeWidgetItem* item, items )
10001021 {
10011022 if ( item )
10021023 {
0 commit comments