Skip to content

Commit 16922a3

Browse files
authored
Merge pull request #8612 from elpaso/vector-legend-toggle-items
Add a toggle action to vector layer legend items [feature]
2 parents 733d4ed + 4654790 commit 16922a3

File tree

6 files changed

+212
-3
lines changed

6 files changed

+212
-3
lines changed

images/images.qrc

+1
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@
277277
<file>themes/default/mActionHelpContents.svg</file>
278278
<file>themes/default/mActionHelpSponsors.png</file>
279279
<file>themes/default/mActionHideAllLayers.svg</file>
280+
<file>themes/default/mActionToggleAllLayers.svg</file>
280281
<file>themes/default/mActionHideSelectedLayers.svg</file>
281282
<file>themes/default/mActionHideDeselectedLayers.svg</file>
282283
<file>themes/default/mActionHistory.svg</file>
Loading

python/core/auto_generated/layertree/qgslayertreemodellegendnode.sip.in

+15
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,8 @@ Checks all items belonging to the same layer as this node.
269269

270270
.. seealso:: :py:func:`uncheckAllItems`
271271

272+
.. seealso:: :py:func:`toggleAllItems`
273+
272274
.. versionadded:: 2.14
273275
%End
274276

@@ -278,7 +280,20 @@ Unchecks all items belonging to the same layer as this node.
278280

279281
.. seealso:: :py:func:`checkAllItems`
280282

283+
.. seealso:: :py:func:`toggleAllItems`
284+
281285
.. versionadded:: 2.14
286+
%End
287+
288+
void toggleAllItems();
289+
%Docstring
290+
Toggle all items belonging to the same layer as this node.
291+
292+
.. seealso:: :py:func:`checkAllItems`
293+
294+
.. seealso:: :py:func:`uncheckAllItems`
295+
296+
.. versionadded:: 3.6
282297
%End
283298

284299
};

src/app/qgsapplayertreeviewmenuprovider.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@ QMenu *QgsAppLayerTreeViewMenuProvider::createContextMenu()
476476
// symbology item
477477
if ( symbolNode->flags() & Qt::ItemIsUserCheckable )
478478
{
479+
menu->addAction( QgsApplication::getThemeIcon( QStringLiteral( "/mActionToggleAllLayers.svg" ) ), tr( "&Toggle Items" ),
480+
symbolNode, &QgsSymbolLegendNode::toggleAllItems );
479481
menu->addAction( QgsApplication::getThemeIcon( QStringLiteral( "/mActionShowAllLayers.svg" ) ), tr( "&Show All Items" ),
480482
symbolNode, &QgsSymbolLegendNode::checkAllItems );
481483
menu->addAction( QgsApplication::getThemeIcon( QStringLiteral( "/mActionHideAllLayers.svg" ) ), tr( "&Hide All Items" ),

src/core/layertree/qgslayertreemodellegendnode.cpp

+19-3
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,22 @@ void QgsSymbolLegendNode::uncheckAllItems()
227227
checkAll( false );
228228
}
229229

230+
void QgsSymbolLegendNode::toggleAllItems()
231+
{
232+
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayerNode->layer() );
233+
if ( !vlayer || !vlayer->renderer() )
234+
return;
235+
236+
const QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
237+
for ( const auto &item : symbolList )
238+
{
239+
vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), ! vlayer->renderer()->legendSymbolItemChecked( item.ruleKey() ) );
240+
}
241+
242+
emit dataChanged();
243+
vlayer->triggerRepaint();
244+
}
245+
230246
QgsRenderContext *QgsLayerTreeModelLegendNode::createTemporaryRenderContext() const
231247
{
232248
double scale = 0.0;
@@ -239,7 +255,7 @@ QgsRenderContext *QgsLayerTreeModelLegendNode::createTemporaryRenderContext() co
239255
return nullptr;
240256

241257
// setup temporary render context
242-
std::unique_ptr<QgsRenderContext> context( new QgsRenderContext );
258+
std::unique_ptr<QgsRenderContext> context = qgis::make_unique<QgsRenderContext>( );
243259
context->setScaleFactor( dpi / 25.4 );
244260
context->setRendererScale( scale );
245261
context->setMapToPixel( QgsMapToPixel( mupp ) );
@@ -252,8 +268,8 @@ void QgsSymbolLegendNode::checkAll( bool state )
252268
if ( !vlayer || !vlayer->renderer() )
253269
return;
254270

255-
QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
256-
Q_FOREACH ( const QgsLegendSymbolItem &item, symbolList )
271+
const QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
272+
for ( const auto &item : symbolList )
257273
{
258274
vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), state );
259275
}

src/core/layertree/qgslayertreemodellegendnode.h

+10
Original file line numberDiff line numberDiff line change
@@ -251,17 +251,27 @@ class CORE_EXPORT QgsSymbolLegendNode : public QgsLayerTreeModelLegendNode
251251
/**
252252
* Checks all items belonging to the same layer as this node.
253253
* \see uncheckAllItems()
254+
* \see toggleAllItems()
254255
* \since QGIS 2.14
255256
*/
256257
void checkAllItems();
257258

258259
/**
259260
* Unchecks all items belonging to the same layer as this node.
260261
* \see checkAllItems()
262+
* \see toggleAllItems()
261263
* \since QGIS 2.14
262264
*/
263265
void uncheckAllItems();
264266

267+
/**
268+
* Toggle all items belonging to the same layer as this node.
269+
* \see checkAllItems()
270+
* \see uncheckAllItems()
271+
* \since QGIS 3.6
272+
*/
273+
void toggleAllItems();
274+
265275
private:
266276
void updateLabel();
267277

0 commit comments

Comments
 (0)