diff --git a/images/images.qrc b/images/images.qrc
index c9097b67948..91ff9ad5396 100644
--- a/images/images.qrc
+++ b/images/images.qrc
@@ -277,6 +277,7 @@
themes/default/mActionHelpContents.svg
themes/default/mActionHelpSponsors.png
themes/default/mActionHideAllLayers.svg
+ themes/default/mActionToggleAllLayers.svg
themes/default/mActionHideSelectedLayers.svg
themes/default/mActionHideDeselectedLayers.svg
themes/default/mActionHistory.svg
diff --git a/images/themes/default/mActionToggleAllLayers.svg b/images/themes/default/mActionToggleAllLayers.svg
new file mode 100644
index 00000000000..03cf704d78e
--- /dev/null
+++ b/images/themes/default/mActionToggleAllLayers.svg
@@ -0,0 +1,140 @@
+
+
diff --git a/python/core/auto_generated/layertree/qgslayertreemodellegendnode.sip.in b/python/core/auto_generated/layertree/qgslayertreemodellegendnode.sip.in
index 97441774395..ca04063027a 100644
--- a/python/core/auto_generated/layertree/qgslayertreemodellegendnode.sip.in
+++ b/python/core/auto_generated/layertree/qgslayertreemodellegendnode.sip.in
@@ -269,6 +269,8 @@ Checks all items belonging to the same layer as this node.
.. seealso:: :py:func:`uncheckAllItems`
+.. seealso:: :py:func:`toggleAllItems`
+
.. versionadded:: 2.14
%End
@@ -278,7 +280,20 @@ Unchecks all items belonging to the same layer as this node.
.. seealso:: :py:func:`checkAllItems`
+.. seealso:: :py:func:`toggleAllItems`
+
.. versionadded:: 2.14
+%End
+
+ void toggleAllItems();
+%Docstring
+Toggle all items belonging to the same layer as this node.
+
+.. seealso:: :py:func:`checkAllItems`
+
+.. seealso:: :py:func:`uncheckAllItems`
+
+.. versionadded:: 3.4
%End
};
diff --git a/src/app/qgsapplayertreeviewmenuprovider.cpp b/src/app/qgsapplayertreeviewmenuprovider.cpp
index 9facb33ee21..db445908325 100644
--- a/src/app/qgsapplayertreeviewmenuprovider.cpp
+++ b/src/app/qgsapplayertreeviewmenuprovider.cpp
@@ -480,6 +480,8 @@ QMenu *QgsAppLayerTreeViewMenuProvider::createContextMenu()
symbolNode, &QgsSymbolLegendNode::checkAllItems );
menu->addAction( QgsApplication::getThemeIcon( QStringLiteral( "/mActionHideAllLayers.svg" ) ), tr( "&Hide All Items" ),
symbolNode, &QgsSymbolLegendNode::uncheckAllItems );
+ menu->addAction( QgsApplication::getThemeIcon( QStringLiteral( "/mActionToggleAllLayers.svg" ) ), tr( "&Toggle All Items" ),
+ symbolNode, &QgsSymbolLegendNode::toggleAllItems );
menu->addSeparator();
}
diff --git a/src/core/layertree/qgslayertreemodellegendnode.cpp b/src/core/layertree/qgslayertreemodellegendnode.cpp
index e0441508ad6..79805ad24d2 100644
--- a/src/core/layertree/qgslayertreemodellegendnode.cpp
+++ b/src/core/layertree/qgslayertreemodellegendnode.cpp
@@ -227,6 +227,22 @@ void QgsSymbolLegendNode::uncheckAllItems()
checkAll( false );
}
+void QgsSymbolLegendNode::toggleAllItems()
+{
+ QgsVectorLayer *vlayer = qobject_cast( mLayerNode->layer() );
+ if ( !vlayer || !vlayer->renderer() )
+ return;
+
+ const QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
+ for ( const auto &item : symbolList )
+ {
+ vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), ! vlayer->renderer()->legendSymbolItemChecked( item.ruleKey() ) );
+ }
+
+ emit dataChanged();
+ vlayer->triggerRepaint();
+}
+
QgsRenderContext *QgsLayerTreeModelLegendNode::createTemporaryRenderContext() const
{
double scale = 0.0;
@@ -239,7 +255,7 @@ QgsRenderContext *QgsLayerTreeModelLegendNode::createTemporaryRenderContext() co
return nullptr;
// setup temporary render context
- std::unique_ptr context( new QgsRenderContext );
+ std::unique_ptr context = qgis::make_unique( );
context->setScaleFactor( dpi / 25.4 );
context->setRendererScale( scale );
context->setMapToPixel( QgsMapToPixel( mupp ) );
@@ -252,8 +268,8 @@ void QgsSymbolLegendNode::checkAll( bool state )
if ( !vlayer || !vlayer->renderer() )
return;
- QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
- Q_FOREACH ( const QgsLegendSymbolItem &item, symbolList )
+ const QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
+ for ( const auto &item : symbolList )
{
vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), state );
}
diff --git a/src/core/layertree/qgslayertreemodellegendnode.h b/src/core/layertree/qgslayertreemodellegendnode.h
index 5c39f7ba868..fadd3c464ac 100644
--- a/src/core/layertree/qgslayertreemodellegendnode.h
+++ b/src/core/layertree/qgslayertreemodellegendnode.h
@@ -251,6 +251,7 @@ class CORE_EXPORT QgsSymbolLegendNode : public QgsLayerTreeModelLegendNode
/**
* Checks all items belonging to the same layer as this node.
* \see uncheckAllItems()
+ * \see toggleAllItems()
* \since QGIS 2.14
*/
void checkAllItems();
@@ -258,10 +259,19 @@ class CORE_EXPORT QgsSymbolLegendNode : public QgsLayerTreeModelLegendNode
/**
* Unchecks all items belonging to the same layer as this node.
* \see checkAllItems()
+ * \see toggleAllItems()
* \since QGIS 2.14
*/
void uncheckAllItems();
+ /**
+ * Toggle all items belonging to the same layer as this node.
+ * \see checkAllItems()
+ * \see uncheckAllItems()
+ * \since QGIS 3.4
+ */
+ void toggleAllItems();
+
private:
void updateLabel();