3434#include " qgslogger.h"
3535#include " qgsmapcanvas.h"
3636#include " qgsfieldcalculator.h"
37+ #include " qgsfeatureaction.h"
3738
3839class QgsAttributeTableDock : public QDockWidget
3940{
@@ -99,13 +100,16 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid
99100 bool canDeleteFeatures = mLayer ->dataProvider ()->capabilities () & QgsVectorDataProvider::DeleteFeatures;
100101 bool canAddAttributes = mLayer ->dataProvider ()->capabilities () & QgsVectorDataProvider::AddAttributes;
101102 bool canDeleteAttributes = mLayer ->dataProvider ()->capabilities () & QgsVectorDataProvider::DeleteAttributes;
103+ bool canAddFeatures = mLayer ->dataProvider ()->capabilities () & QgsVectorDataProvider::AddFeatures;
102104 mToggleEditingButton ->setCheckable ( true );
103105 mToggleEditingButton ->setChecked ( mLayer ->isEditable () );
104106 mToggleEditingButton ->setEnabled ( canChangeAttributes && !mLayer ->isReadOnly () );
105107 mOpenFieldCalculator ->setEnabled ( canChangeAttributes && mLayer ->isEditable () );
106108 mDeleteSelectedButton ->setEnabled ( canDeleteFeatures && mLayer ->isEditable () );
107109 mAddAttribute ->setEnabled ( canAddAttributes && mLayer ->isEditable () );
108110 mRemoveAttribute ->setEnabled ( canDeleteAttributes && mLayer ->isEditable () );
111+ mAddFeature ->setEnabled ( canAddFeatures && mLayer ->isEditable () && mLayer ->geometryType () == QGis::NoGeometry );
112+ mAddFeature ->setHidden ( !canAddFeatures || mLayer ->geometryType () != QGis::NoGeometry );
109113
110114 // info from table to application
111115 connect ( this , SIGNAL ( editingToggled ( QgsMapLayer * ) ), QgisApp::instance (), SLOT ( toggleEditing ( QgsMapLayer * ) ) );
@@ -114,6 +118,7 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid
114118 connect ( mLayer , SIGNAL ( editingStopped () ), this , SLOT ( editingToggled () ) );
115119
116120 connect ( searchButton, SIGNAL ( clicked () ), this , SLOT ( search () ) );
121+ connect ( mAddFeature , SIGNAL ( clicked () ), this , SLOT ( addFeature () ) );
117122
118123 connect ( mLayer , SIGNAL ( selectionChanged () ), this , SLOT ( updateSelectionFromLayer () ) );
119124 connect ( mLayer , SIGNAL ( layerDeleted () ), this , SLOT ( close () ) );
@@ -674,10 +679,12 @@ void QgsAttributeTableDialog::editingToggled()
674679 bool canDeleteFeatures = mLayer ->dataProvider ()->capabilities () & QgsVectorDataProvider::DeleteFeatures;
675680 bool canAddAttributes = mLayer ->dataProvider ()->capabilities () & QgsVectorDataProvider::AddAttributes;
676681 bool canDeleteAttributes = mLayer ->dataProvider ()->capabilities () & QgsVectorDataProvider::DeleteAttributes;
682+ bool canAddFeatures = mLayer ->dataProvider ()->capabilities () & QgsVectorDataProvider::AddFeatures;
677683 mOpenFieldCalculator ->setEnabled ( canChangeAttributes && mLayer ->isEditable () );
678684 mDeleteSelectedButton ->setEnabled ( canDeleteFeatures && mLayer ->isEditable () );
679685 mAddAttribute ->setEnabled ( canAddAttributes && mLayer ->isEditable () );
680686 mRemoveAttribute ->setEnabled ( canDeleteAttributes && mLayer ->isEditable () );
687+ mAddFeature ->setEnabled ( canAddFeatures && mLayer ->isEditable () && mLayer ->geometryType () == QGis::NoGeometry );
681688
682689 // (probably reload data if user stopped editing - possible revert)
683690 mModel ->reload ( mModel ->index ( 0 , 0 ), mModel ->index ( mModel ->rowCount (), mModel ->columnCount () ) );
@@ -775,9 +782,18 @@ void QgsAttributeTableDialog::on_mRemoveAttribute_clicked()
775782void QgsAttributeTableDialog::on_mOpenFieldCalculator_clicked ()
776783{
777784 QgsFieldCalculator calc ( mLayer );
778- if ( calc.exec () == QDialog::Accepted )
785+ calc.exec ();
786+ }
787+
788+ void QgsAttributeTableDialog::addFeature ()
789+ {
790+ if ( !mLayer ->isEditable () )
791+ return ;
792+
793+ QgsFeature f;
794+ QgsFeatureAction action ( tr ( " Geometryless feature added" ), f, mLayer , -1 , this );
795+ if ( action.addFeature () )
779796 {
780- // update model - a field has been added or updated
781797 mModel ->reload ( mModel ->index ( 0 , 0 ), mModel ->index ( mModel ->rowCount (), mModel ->columnCount () ) );
782798 }
783799}
0 commit comments