Skip to content

Commit

Permalink
Add layer tree method to return all selected legend nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Mar 31, 2023
1 parent 12c8c9a commit 941b0ca
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 9 deletions.
36 changes: 33 additions & 3 deletions python/gui/auto_generated/layertree/qgslayertreeview.sip.in
Expand Up @@ -226,18 +226,48 @@ Gets current legend node. May be ``None`` if current node is not a legend node.

QList<QgsLayerTreeNode *> selectedNodes( bool skipInternal = false ) const;
%Docstring
Returns list of selected nodes
Returns the list of selected layer tree nodes.

:param skipInternal: If ``True``, will ignore nodes which have an ancestor in the selection

.. seealso:: :py:func:`selectedLayerNodes`

.. seealso:: :py:func:`selectedLegendNodes`

.. seealso:: :py:func:`selectedLayers`
%End

QList<QgsLayerTreeLayer *> selectedLayerNodes() const;
%Docstring
Returns list of selected nodes filtered to just layer nodes
Returns the list of selected nodes filtered to just layer nodes (:py:class:`QgsLayerTreeLayer`).

.. seealso:: :py:func:`selectedNodes`

.. seealso:: :py:func:`selectedLayers`

.. seealso:: :py:func:`selectedLegendNodes`
%End

QList<QgsMapLayer *> selectedLayers() const;
%Docstring
Gets list of selected layers
Returns the list of selected layers.

.. seealso:: :py:func:`selectedNodes`

.. seealso:: :py:func:`selectedLayerNodes`

.. seealso:: :py:func:`selectedLegendNodes`
%End

QList<QgsLayerTreeModelLegendNode *> selectedLegendNodes() const;
%Docstring
Returns the list of selected legend nodes.

.. seealso:: :py:func:`selectedNodes`

.. seealso:: :py:func:`selectedLayerNodes`

.. versionadded:: 3.32
%End

QList<QgsMapLayer *> selectedLayersRecursive() const;
Expand Down
24 changes: 21 additions & 3 deletions src/gui/layertree/qgslayertreeview.cpp
Expand Up @@ -23,7 +23,6 @@
#include "qgslayertreeviewdefaultactions.h"
#include "qgsmaplayer.h"
#include "qgsmessagebar.h"
#include "qgslayertreefilterproxymodel.h"

#include "qgsgui.h"

Expand Down Expand Up @@ -431,7 +430,8 @@ QList<QgsLayerTreeNode *> QgsLayerTreeView::selectedNodes( bool skipInternal ) c
QList<QgsLayerTreeLayer *> QgsLayerTreeView::selectedLayerNodes() const
{
QList<QgsLayerTreeLayer *> layerNodes;
const auto constSelectedNodes = selectedNodes();
const QList<QgsLayerTreeNode *> constSelectedNodes = selectedNodes();
layerNodes.reserve( constSelectedNodes.size() );
for ( QgsLayerTreeNode *node : constSelectedNodes )
{
if ( QgsLayerTree::isLayer( node ) )
Expand All @@ -443,7 +443,8 @@ QList<QgsLayerTreeLayer *> QgsLayerTreeView::selectedLayerNodes() const
QList<QgsMapLayer *> QgsLayerTreeView::selectedLayers() const
{
QList<QgsMapLayer *> list;
const auto constSelectedLayerNodes = selectedLayerNodes();
const QList<QgsLayerTreeLayer *> constSelectedLayerNodes = selectedLayerNodes();
list.reserve( constSelectedLayerNodes.size() );
for ( QgsLayerTreeLayer *node : constSelectedLayerNodes )
{
if ( node->layer() )
Expand All @@ -452,6 +453,23 @@ QList<QgsMapLayer *> QgsLayerTreeView::selectedLayers() const
return list;
}

QList<QgsLayerTreeModelLegendNode *> QgsLayerTreeView::selectedLegendNodes() const
{
QList<QgsLayerTreeModelLegendNode *> res;
const QModelIndexList selected = selectionModel()->selectedIndexes();
res.reserve( selected.size() );
for ( const QModelIndex &index : selected )
{
const QModelIndex &modelIndex = mProxyModel->mapToSource( index );
if ( QgsLayerTreeModelLegendNode *node = layerTreeModel()->index2legendNode( modelIndex ) )
{
res.push_back( node );
}
}

return res;
}

QList<QgsMapLayer *> QgsLayerTreeView::selectedLayersRecursive() const
{
QModelIndexList mapped;
Expand Down
34 changes: 31 additions & 3 deletions src/gui/layertree/qgslayertreeview.h
Expand Up @@ -238,16 +238,44 @@ class GUI_EXPORT QgsLayerTreeView : public QTreeView
QgsLayerTreeModelLegendNode *currentLegendNode() const;

/**
* Returns list of selected nodes
* Returns the list of selected layer tree nodes.
*
* \param skipInternal If TRUE, will ignore nodes which have an ancestor in the selection
*
* \see selectedLayerNodes()
* \see selectedLegendNodes()
* \see selectedLayers()
*/
QList<QgsLayerTreeNode *> selectedNodes( bool skipInternal = false ) const;
//! Returns list of selected nodes filtered to just layer nodes

/**
* Returns the list of selected nodes filtered to just layer nodes (QgsLayerTreeLayer).
*
* \see selectedNodes()
* \see selectedLayers()
* \see selectedLegendNodes()
*/
QList<QgsLayerTreeLayer *> selectedLayerNodes() const;

//! Gets list of selected layers
/**
* Returns the list of selected layers.
*
* \see selectedNodes()
* \see selectedLayerNodes()
* \see selectedLegendNodes()
*/
QList<QgsMapLayer *> selectedLayers() const;

/**
* Returns the list of selected legend nodes.
*
* \see selectedNodes()
* \see selectedLayerNodes()
*
* \since QGIS 3.32
*/
QList<QgsLayerTreeModelLegendNode *> selectedLegendNodes() const;

/**
* Gets list of selected layers, including those that are not directly selected, but their
* ancestor groups is selected. If we have a group with two layers L1, L2 and just the group
Expand Down

0 comments on commit 941b0ca

Please sign in to comment.