Index: src/app/attributetable/qgsattributetabledialog.cpp =================================================================== --- src/app/attributetable/qgsattributetabledialog.cpp (Revision 15693) +++ src/app/attributetable/qgsattributetabledialog.cpp (Arbeitskopie) @@ -90,6 +90,7 @@ mZoomMapToSelectedRowsButton->setIcon( getThemeIcon( "/mActionZoomToSelected.png" ) ); mInvertSelectionButton->setIcon( getThemeIcon( "/mActionInvertSelection.png" ) ); mToggleEditingButton->setIcon( getThemeIcon( "/mActionToggleEditing.png" ) ); + mSaveEditsButton->setIcon( getThemeIcon( "/mActionSaveEdits.png" ) ); mDeleteSelectedButton->setIcon( getThemeIcon( "/mActionDeleteSelected.png" ) ); mOpenFieldCalculator->setIcon( getThemeIcon( "/mActionCalculateField.png" ) ); mAddAttribute->setIcon( getThemeIcon( "/mActionNewAttribute.png" ) ); @@ -101,9 +102,12 @@ bool canAddAttributes = mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::AddAttributes; bool canDeleteAttributes = mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::DeleteAttributes; bool canAddFeatures = mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::AddFeatures; + mToggleEditingButton->setCheckable( true ); mToggleEditingButton->setChecked( mLayer->isEditable() ); mToggleEditingButton->setEnabled( canChangeAttributes && !mLayer->isReadOnly() ); + + mSaveEditsButton->setEnabled( canChangeAttributes && mLayer->isEditable() ); mOpenFieldCalculator->setEnabled( canChangeAttributes && mLayer->isEditable() ); mDeleteSelectedButton->setEnabled( canDeleteFeatures && mLayer->isEditable() ); mAddAttribute->setEnabled( canAddAttributes && mLayer->isEditable() ); @@ -113,6 +117,8 @@ // info from table to application connect( this, SIGNAL( editingToggled( QgsMapLayer * ) ), QgisApp::instance(), SLOT( toggleEditing( QgsMapLayer * ) ) ); + connect( this, SIGNAL( saveEdits( QgsMapLayer * ) ), QgisApp::instance(), SLOT( saveEdits( QgsMapLayer * ) ) ); + // info from layer to table connect( mLayer, SIGNAL( editingStarted() ), this, SLOT( editingToggled() ) ); connect( mLayer, SIGNAL( editingStopped() ), this, SLOT( editingToggled() ) ); @@ -683,10 +689,16 @@ emit editingToggled( mLayer ); } +void QgsAttributeTableDialog::on_mSaveEditsButton_clicked() +{ + emit saveEdits( mLayer ); +} + void QgsAttributeTableDialog::editingToggled() { mToggleEditingButton->blockSignals( true ); mToggleEditingButton->setChecked( mLayer->isEditable() ); + mSaveEditsButton->setEnabled( mLayer->isEditable() ); mToggleEditingButton->blockSignals( false ); bool canChangeAttributes = mLayer->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues; Index: src/app/attributetable/qgsattributetabledialog.h =================================================================== --- src/app/attributetable/qgsattributetabledialog.h (Revision 15693) +++ src/app/attributetable/qgsattributetabledialog.h (Arbeitskopie) @@ -114,6 +114,10 @@ */ void on_mToggleEditingButton_toggled(); /** + * Saves edits + */ + void on_mSaveEditsButton_clicked(); + /** * Inverts selection */ void on_mInvertSelectionButton_clicked(); @@ -160,11 +164,17 @@ signals: /** - * Informs that editing mode ha been toggled + * Informs that editing mode has been toggled * @param layer layer that has been toggled */ void editingToggled( QgsMapLayer *layer ); + /** + * Informs that edits should be saved + * @param layer layer whose edits are to be saved + */ + void saveEdits( QgsMapLayer *layer ); + protected: /** * Handle closing of the window Index: src/app/qgisapp.h =================================================================== --- src/app/qgisapp.h (Revision 15693) +++ src/app/qgisapp.h (Arbeitskopie) @@ -725,6 +725,9 @@ //! starts/stops editing mode of a layer bool toggleEditing( QgsMapLayer *layer, bool allowCancel = true ); + //! save edits of a layer + void saveEdits( QgsMapLayer *layer ); + //! save current vector layer void saveAsVectorFile(); void saveSelectionAsVectorFile(); Index: src/app/qgisapp.cpp =================================================================== --- src/app/qgisapp.cpp (Revision 15693) +++ src/app/qgisapp.cpp (Arbeitskopie) @@ -4264,7 +4264,15 @@ if ( mMapCanvas && mMapCanvas->isDrawing() ) return; - QgsVectorLayer *vlayer = qobject_cast( activeLayer() ); // FIXME: save edits of all selected layers + foreach( QgsMapLayer * layer, mMapLegend->selectedLayers() ) + { + saveEdits( layer ); + } +} + +void QgisApp::saveEdits( QgsMapLayer *layer ) +{ + QgsVectorLayer *vlayer = qobject_cast( layer ); if ( !vlayer || !vlayer->isEditable() || !vlayer->isModified() ) return; Index: src/ui/qgsattributetabledialog.ui =================================================================== --- src/ui/qgsattributetabledialog.ui (Revision 15693) +++ src/ui/qgsattributetabledialog.ui (Arbeitskopie) @@ -142,7 +142,7 @@ - Invert selection (Ctrl+S) + Invert selection (Ctrl+R) @@ -244,6 +244,35 @@ + + + Save Edits (Ctrl+S) + + + + + + + + + + ../../images/themes/default/mActionSaveEdits.png../../images/themes/default/mActionSaveEdits.png + + + + 18 + 18 + + + + Ctrl+E + + + true + + + + Delete selected features (Ctrl+D) @@ -410,5 +439,22 @@ mOpenFieldCalculator - + + + mToggleEditingButton + toggled(bool) + mSaveEditsButton + setEnabled(bool) + + + 192 + 504 + + + 214 + 501 + + + +