diff --git a/python/gui/qgisinterface.sip b/python/gui/qgisinterface.sip index 9807ce69b58..5c4f7ebe32c 100644 --- a/python/gui/qgisinterface.sip +++ b/python/gui/qgisinterface.sip @@ -344,6 +344,8 @@ class QgisInterface : QObject virtual QAction *actionOpenTable() = 0; virtual QAction *actionToggleEditing() = 0; /** @note added in 1.9 */ + virtual QAction *actionSaveActiveLayerEdits() = 0; + /** @note added in 1.9 */ virtual QAction *actionAllEdits() = 0; /** @note added in 1.9 */ virtual QAction *actionSaveEdits() = 0; diff --git a/src/app/legend/qgslegendlayer.cpp b/src/app/legend/qgslegendlayer.cpp index 7895624fdc9..96e767b4b6e 100644 --- a/src/app/legend/qgslegendlayer.cpp +++ b/src/app/legend/qgslegendlayer.cpp @@ -415,6 +415,7 @@ void QgsLegendLayer::addToPopupMenu( QMenu& theMenu ) { QgsMapLayer *lyr = layer(); QAction *toggleEditingAction = QgisApp::instance()->actionToggleEditing(); + QAction *saveLayerEditsAction = QgisApp::instance()->actionSaveActiveLayerEdits(); QAction *allEditsAction = QgisApp::instance()->actionAllEdits(); // zoom to layer extent @@ -469,6 +470,10 @@ void QgsLegendLayer::addToPopupMenu( QMenu& theMenu ) theMenu.addAction( toggleEditingAction ); toggleEditingAction->setChecked( vlayer->isEditable() ); } + if ( saveLayerEditsAction && vlayer->isModified() ) + { + theMenu.addAction( saveLayerEditsAction ); + } } if ( allEditsAction->isEnabled() ) diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 86aed12bebd..d13b6818029 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -949,6 +949,7 @@ void QgisApp::createActions() connect( mActionAddWfsLayer, SIGNAL( triggered() ), this, SLOT( addWfsLayer() ) ); connect( mActionOpenTable, SIGNAL( triggered() ), this, SLOT( attributeTable() ) ); connect( mActionToggleEditing, SIGNAL( triggered() ), this, SLOT( toggleEditing() ) ); + connect( mActionSaveLayerEdits, SIGNAL( triggered() ), this, SLOT( saveActiveLayerEdits() ) ); connect( mActionSaveEdits, SIGNAL( triggered() ), this, SLOT( saveEdits() ) ); connect( mActionSaveAllEdits, SIGNAL( triggered() ), this, SLOT( saveAllEdits() ) ); connect( mActionRollbackEdits, SIGNAL( triggered() ), this, SLOT( rollbackEdits() ) ); @@ -1670,6 +1671,7 @@ void QgisApp::setTheme( QString theThemeName ) mActionSponsors->setIcon( QgsApplication::getThemeIcon( "/mActionHelpSponsors.png" ) ); mActionDraw->setIcon( QgsApplication::getThemeIcon( "/mActionDraw.png" ) ); mActionToggleEditing->setIcon( QgsApplication::getThemeIcon( "/mActionToggleEditing.svg" ) ); + mActionSaveLayerEdits->setIcon( QgsApplication::getThemeIcon( "/mActionSaveAllEdits.svg" ) ); mActionAllEdits->setIcon( QgsApplication::getThemeIcon( "/mActionAllEdits.svg" ) ); mActionSaveEdits->setIcon( QgsApplication::getThemeIcon( "/mActionSaveEdits.svg" ) ); mActionSaveAllEdits->setIcon( QgsApplication::getThemeIcon( "/mActionSaveAllEdits.svg" ) ); @@ -5206,6 +5208,11 @@ bool QgisApp::toggleEditing( QgsMapLayer *layer, bool allowCancel ) return res; } +void QgisApp::saveActiveLayerEdits() +{ + saveEdits( activeLayer() ); +} + void QgisApp::saveEdits( QgsMapLayer *layer, bool leaveEditable ) { QgsVectorLayer *vlayer = qobject_cast( layer ); @@ -5362,6 +5369,20 @@ bool QgisApp::verifyEditsActionDialog( QString act, QString upon ) void QgisApp::updateLayerModifiedActions() { + bool enableSaveLayerEdits = false; + QgsVectorLayer* vlayer = qobject_cast( activeLayer() ); + if ( vlayer ) + { + QgsVectorDataProvider* dprovider = vlayer->dataProvider(); + if ( dprovider ) + { + enableSaveLayerEdits = ( dprovider->capabilities() & QgsVectorDataProvider::ChangeAttributeValues + && vlayer->isEditable() + && vlayer->isModified() ); + } + } + mActionSaveLayerEdits->setEnabled( enableSaveLayerEdits ); + mActionSaveEdits->setEnabled( mMapLegend && mMapLegend->selectedLayersEditable( true ) ); mActionRollbackEdits->setEnabled( mMapLegend && mMapLegend->selectedLayersEditable( true ) ); mActionCancelEdits->setEnabled( mMapLegend && mMapLegend->selectedLayersEditable() ); @@ -7322,6 +7343,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer ) mActionOpenTable->setEnabled( false ); mActionToggleEditing->setEnabled( false ); mActionToggleEditing->setChecked( false ); + mActionSaveLayerEdits->setEnabled( false ); mActionLayerSaveAs->setEnabled( false ); mActionLayerSelectionSaveAs->setEnabled( false ); mActionLayerProperties->setEnabled( false ); @@ -7413,6 +7435,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer ) bool canChangeAttributes = dprovider->capabilities() & QgsVectorDataProvider::ChangeAttributeValues; mActionToggleEditing->setEnabled( canChangeAttributes && !vlayer->isReadOnly() ); mActionToggleEditing->setChecked( vlayer->isEditable() ); + mActionSaveLayerEdits->setEnabled( canChangeAttributes && vlayer->isEditable() && vlayer->isModified() ); mUndoWidget->dockContents()->setEnabled( vlayer->isEditable() ); updateUndoActions(); } @@ -7420,6 +7443,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer ) { mActionToggleEditing->setEnabled( false ); mActionToggleEditing->setChecked( false ); + mActionSaveLayerEdits->setEnabled( false ); mUndoWidget->dockContents()->setEnabled( false ); mActionUndo->setEnabled( false ); mActionRedo->setEnabled( false ); @@ -7588,6 +7612,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer ) mActionOpenTable->setEnabled( false ); mActionToggleEditing->setEnabled( false ); mActionToggleEditing->setChecked( false ); + mActionSaveLayerEdits->setEnabled( false ); mUndoWidget->dockContents()->setEnabled( false ); mActionUndo->setEnabled( false ); mActionRedo->setEnabled( false ); diff --git a/src/app/qgisapp.h b/src/app/qgisapp.h index 06e721d39e3..468cc83e797 100644 --- a/src/app/qgisapp.h +++ b/src/app/qgisapp.h @@ -291,6 +291,8 @@ class QgisApp : public QMainWindow, private Ui::MainWindow QAction *actionOpenTable() { return mActionOpenTable; } QAction *actionToggleEditing() { return mActionToggleEditing; } /** @note added in 1.9 */ + QAction *actionSaveActiveLayerEdits() { return mActionSaveLayerEdits; } + /** @note added in 1.9 */ QAction *actionAllEdits() { return mActionAllEdits; } QAction *actionSaveEdits() { return mActionSaveEdits; } /** @note added in 1.9 */ @@ -792,6 +794,10 @@ class QgisApp : public QMainWindow, private Ui::MainWindow //! starts/stops editing mode of a layer bool toggleEditing( QgsMapLayer *layer, bool allowCancel = true ); + /** Save edits for active vector layer and start new transactions + * @note added in 1.9 */ + void saveActiveLayerEdits(); + //! Save edits of a layer void saveEdits( QgsMapLayer *layer, bool leaveEditable = true ); diff --git a/src/app/qgisappinterface.cpp b/src/app/qgisappinterface.cpp index 566ffc13496..feeb51596c3 100644 --- a/src/app/qgisappinterface.cpp +++ b/src/app/qgisappinterface.cpp @@ -436,6 +436,7 @@ QAction *QgisAppInterface::actionCopyLayerStyle() { return qgis->actionCopyLayer QAction *QgisAppInterface::actionPasteLayerStyle() { return qgis->actionPasteLayerStyle(); } QAction *QgisAppInterface::actionOpenTable() { return qgis->actionOpenTable(); } QAction *QgisAppInterface::actionToggleEditing() { return qgis->actionToggleEditing(); } +QAction *QgisAppInterface::actionSaveActiveLayerEdits() { return qgis->actionSaveActiveLayerEdits(); } QAction *QgisAppInterface::actionAllEdits() { return qgis->actionAllEdits(); } QAction *QgisAppInterface::actionSaveEdits() { return qgis->actionSaveEdits(); } QAction *QgisAppInterface::actionSaveAllEdits() { return qgis->actionSaveAllEdits(); } diff --git a/src/app/qgisappinterface.h b/src/app/qgisappinterface.h index 4fe8f0c3c50..83b0665cbd9 100644 --- a/src/app/qgisappinterface.h +++ b/src/app/qgisappinterface.h @@ -296,6 +296,8 @@ class QgisAppInterface : public QgisInterface virtual QAction *actionOpenTable(); virtual QAction *actionToggleEditing(); /** @note added in 1.9 */ + virtual QAction *actionSaveActiveLayerEdits(); + /** @note added in 1.9 */ virtual QAction *actionAllEdits(); /** @note added in 1.9 */ virtual QAction *actionSaveEdits(); diff --git a/src/gui/qgisinterface.h b/src/gui/qgisinterface.h index 26a0468b778..74de83e1e35 100644 --- a/src/gui/qgisinterface.h +++ b/src/gui/qgisinterface.h @@ -392,6 +392,8 @@ class GUI_EXPORT QgisInterface : public QObject virtual QAction *actionOpenTable() = 0; virtual QAction *actionToggleEditing() = 0; /** @note added in 1.9 */ + virtual QAction *actionSaveActiveLayerEdits() = 0; + /** @note added in 1.9 */ virtual QAction *actionAllEdits() = 0; /** @note added in 1.9 */ virtual QAction *actionSaveEdits() = 0; diff --git a/src/ui/qgisapp.ui b/src/ui/qgisapp.ui index 12d23ed6b0c..5e70fc5b542 100644 --- a/src/ui/qgisapp.ui +++ b/src/ui/qgisapp.ui @@ -164,6 +164,7 @@ + @@ -282,6 +283,7 @@ + @@ -1940,6 +1942,18 @@ Acts on currently active editable layer + + + + :/images/themes/default/mActionSaveAllEdits.svg:/images/themes/default/mActionSaveAllEdits.svg + + + Save Layer Edits + + + Save Layer Edits + +