From d775a0d97aa9f51e919f268f13ebf039df7e0350 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Wed, 22 Nov 2017 09:17:28 +0100 Subject: [PATCH] [app][bugfix] Update layer editable state when filter is changed Fixes #17507 --- src/app/qgisapp.cpp | 16 ++++++++-------- src/app/qgisapp.h | 8 +++++++- src/app/qgsapplayertreeviewmenuprovider.cpp | 1 + 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index e9efb659a0b..1bc0c61607d 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -8940,6 +8940,7 @@ void QgisApp::layerSubsetString() if ( qb->exec() && ( subsetBefore != qb->sql() ) && mLayerTreeView ) { mLayerTreeView->refreshLayerSymbology( vlayer->id() ); + activateDeactivateLayerRelatedActions( vlayer ); } } @@ -11089,14 +11090,13 @@ void QgisApp::layersWereAdded( const QList &layers ) connect( vlayer, &QgsVectorLayer::labelingFontNotFound, this, &QgisApp::labelingFontNotFound ); QgsVectorDataProvider *vProvider = vlayer->dataProvider(); - if ( vProvider && vProvider->capabilities() & QgsVectorDataProvider::EditingCapabilities ) - { - connect( vlayer, &QgsVectorLayer::layerModified, this, &QgisApp::updateLayerModifiedActions ); - connect( vlayer, &QgsVectorLayer::editingStarted, this, &QgisApp::layerEditStateChanged ); - connect( vlayer, &QgsVectorLayer::editingStopped, this, &QgisApp::layerEditStateChanged ); - connect( vlayer, &QgsVectorLayer::readOnlyChanged, this, &QgisApp::layerEditStateChanged ); - } - + // Do not check for layer editing capabilities because they may change + // (for example when subsetString is added/removed) and signals need to + // be in place in order to update the GUI + connect( vlayer, &QgsVectorLayer::layerModified, this, &QgisApp::updateLayerModifiedActions ); + connect( vlayer, &QgsVectorLayer::editingStarted, this, &QgisApp::layerEditStateChanged ); + connect( vlayer, &QgsVectorLayer::editingStopped, this, &QgisApp::layerEditStateChanged ); + connect( vlayer, &QgsVectorLayer::readOnlyChanged, this, &QgisApp::layerEditStateChanged ); connect( vlayer, &QgsVectorLayer::raiseError, this, &QgisApp::onLayerError ); provider = vProvider; diff --git a/src/app/qgisapp.h b/src/app/qgisapp.h index f7353bbdd05..cfcdbb1f8b6 100644 --- a/src/app/qgisapp.h +++ b/src/app/qgisapp.h @@ -689,7 +689,13 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow //! mark project dirty void markDirty(); - void layersWereAdded( const QList & ); + /** + * \brief layersWereAdded is triggered when layers were added + * This method loops through the list of \a layers and connect all + * application signals that need to listen to layer events. + * \param layers list of map layers that have been added + */ + void layersWereAdded( const QList &layers ); /* layer will be removed - changed from removingLayer to removingLayers in 1.8. diff --git a/src/app/qgsapplayertreeviewmenuprovider.cpp b/src/app/qgsapplayertreeviewmenuprovider.cpp index 475e97e6180..f6302be04e2 100644 --- a/src/app/qgsapplayertreeviewmenuprovider.cpp +++ b/src/app/qgsapplayertreeviewmenuprovider.cpp @@ -226,6 +226,7 @@ QMenu *QgsAppLayerTreeViewMenuProvider::createContextMenu() { menu->addAction( toggleEditingAction ); toggleEditingAction->setChecked( vlayer->isEditable() ); + toggleEditingAction->setEnabled( true ); } if ( saveLayerEditsAction && vlayer->isModified() ) {