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 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + 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();