Skip to content

Commit

Permalink
[feature] Add a toggle action to vector layer legend items
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso committed Dec 5, 2018
1 parent a8be1ff commit ff99f1b
Show file tree
Hide file tree
Showing 6 changed files with 187 additions and 3 deletions.
1 change: 1 addition & 0 deletions images/images.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@
<file>themes/default/mActionHelpContents.svg</file>
<file>themes/default/mActionHelpSponsors.png</file>
<file>themes/default/mActionHideAllLayers.svg</file>
<file>themes/default/mActionToggleAllLayers.svg</file>
<file>themes/default/mActionHideSelectedLayers.svg</file>
<file>themes/default/mActionHideDeselectedLayers.svg</file>
<file>themes/default/mActionHistory.svg</file>
Expand Down
140 changes: 140 additions & 0 deletions images/themes/default/mActionToggleAllLayers.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

};
Expand Down
2 changes: 2 additions & 0 deletions src/app/qgsapplayertreeviewmenuprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
22 changes: 19 additions & 3 deletions src/core/layertree/qgslayertreemodellegendnode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,22 @@ void QgsSymbolLegendNode::uncheckAllItems()
checkAll( false );
}

void QgsSymbolLegendNode::toggleAllItems()
{
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( 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;
Expand All @@ -239,7 +255,7 @@ QgsRenderContext *QgsLayerTreeModelLegendNode::createTemporaryRenderContext() co
return nullptr;

// setup temporary render context
std::unique_ptr<QgsRenderContext> context( new QgsRenderContext );
std::unique_ptr<QgsRenderContext> context = qgis::make_unique<QgsRenderContext>( );
context->setScaleFactor( dpi / 25.4 );
context->setRendererScale( scale );
context->setMapToPixel( QgsMapToPixel( mupp ) );
Expand All @@ -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 );
}
Expand Down
10 changes: 10 additions & 0 deletions src/core/layertree/qgslayertreemodellegendnode.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,17 +251,27 @@ 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();

/**
* 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();

Expand Down

0 comments on commit ff99f1b

Please sign in to comment.