Skip to content

Commit

Permalink
If no project layer order set, use layer tree layer order
Browse files Browse the repository at this point in the history
for QgsMapThemeCollection::masterVisibleLayers()
  • Loading branch information
nyalldawson committed Mar 13, 2017
1 parent 0d0a81b commit 2cba528
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 17 deletions.
7 changes: 2 additions & 5 deletions python/core/layertree/qgslayertree.sip
Expand Up @@ -12,11 +12,8 @@
*/ */
namespace QgsLayerTree namespace QgsLayerTree
{ {
//! Check whether the node is a valid group node bool isGroup( QgsLayerTreeNode *node );
bool isGroup( QgsLayerTreeNode* node ); bool isLayer( const QgsLayerTreeNode *node );

//! Check whether the node is a valid layer node
bool isLayer( QgsLayerTreeNode* node );


//! Cast node to a group. No type checking is done - use isGroup() to find out whether this operation is legal. //! Cast node to a group. No type checking is done - use isGroup() to find out whether this operation is legal.
// PYTHON: automatic cast // PYTHON: automatic cast
Expand Down
5 changes: 2 additions & 3 deletions python/core/layertree/qgslayertreenode.sip
Expand Up @@ -70,7 +70,7 @@ class QgsLayerTreeNode : QObject
~QgsLayerTreeNode(); ~QgsLayerTreeNode();


//! Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree namespace for that //! Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree namespace for that
NodeType nodeType(); NodeType nodeType() const;
//! Get pointer to the parent. If parent is a null pointer, the node is a root node //! Get pointer to the parent. If parent is a null pointer, the node is a root node
QgsLayerTreeNode *parent(); QgsLayerTreeNode *parent();
//! Get list of children of the node. Children are owned by the parent //! Get list of children of the node. Children are owned by the parent
Expand Down Expand Up @@ -132,8 +132,7 @@ class QgsLayerTreeNode : QObject
//! Return whether this node is unchecked and all its children. //! Return whether this node is unchecked and all its children.
//! @note added in 3.0 //! @note added in 3.0
bool isItemVisibilityUncheckedRecursive() const; bool isItemVisibilityUncheckedRecursive() const;

QList< QgsMapLayer * > checkedLayers() const;
//! Return whether the node should be shown as expanded or collapsed in GUI
bool isExpanded() const; bool isExpanded() const;
//! Set whether the node should be shown as expanded or collapsed in GUI //! Set whether the node should be shown as expanded or collapsed in GUI
void setExpanded( bool expanded ); void setExpanded( bool expanded );
Expand Down
8 changes: 7 additions & 1 deletion src/core/layertree/qgslayertree.h
Expand Up @@ -37,7 +37,7 @@ namespace QgsLayerTree
} }


//! Check whether the node is a valid layer node //! Check whether the node is a valid layer node
inline bool isLayer( QgsLayerTreeNode *node ) inline bool isLayer( const QgsLayerTreeNode *node )
{ {
return node && node->nodeType() == QgsLayerTreeNode::NodeLayer; return node && node->nodeType() == QgsLayerTreeNode::NodeLayer;
} }
Expand All @@ -54,6 +54,12 @@ namespace QgsLayerTree
return static_cast<QgsLayerTreeLayer *>( node ); return static_cast<QgsLayerTreeLayer *>( node );
} }


//! Cast node to a layer. No type checking is done - use isLayer() to find out whether this operation is legal.
inline const QgsLayerTreeLayer *toLayer( const QgsLayerTreeNode *node )
{
return static_cast< const QgsLayerTreeLayer *>( node );
}

} }


#endif // QGSLAYERTREE_H #endif // QGSLAYERTREE_H
20 changes: 20 additions & 0 deletions src/core/layertree/qgslayertreenode.cpp
Expand Up @@ -126,6 +126,26 @@ bool QgsLayerTreeNode::isItemVisibilityUncheckedRecursive() const
return true; return true;
} }


void fetchCheckedLayers( const QgsLayerTreeNode *node, QList<QgsMapLayer *> &layers )
{
if ( QgsLayerTree::isLayer( node ) )
{
const QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
if ( nodeLayer->isVisible() )
layers << nodeLayer->layer();
}

Q_FOREACH ( QgsLayerTreeNode *child, node->children() )
fetchCheckedLayers( child, layers );
}

QList<QgsMapLayer *> QgsLayerTreeNode::checkedLayers() const
{
QList<QgsMapLayer *> layers;
fetchCheckedLayers( this, layers );
return layers;
}

void QgsLayerTreeNode::setExpanded( bool expanded ) void QgsLayerTreeNode::setExpanded( bool expanded )
{ {
if ( mExpanded == expanded ) if ( mExpanded == expanded )
Expand Down
10 changes: 9 additions & 1 deletion src/core/layertree/qgslayertreenode.h
Expand Up @@ -24,6 +24,7 @@
class QDomElement; class QDomElement;


class QgsProject; class QgsProject;
class QgsMapLayer;


/** \ingroup core /** \ingroup core
* This class is a base class for nodes in a layer tree. * This class is a base class for nodes in a layer tree.
Expand Down Expand Up @@ -80,7 +81,7 @@ class CORE_EXPORT QgsLayerTreeNode : public QObject
~QgsLayerTreeNode(); ~QgsLayerTreeNode();


//! Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree namespace for that //! Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree namespace for that
NodeType nodeType() { return mNodeType; } NodeType nodeType() const { return mNodeType; }
//! Get pointer to the parent. If parent is a null pointer, the node is a root node //! Get pointer to the parent. If parent is a null pointer, the node is a root node
QgsLayerTreeNode *parent() { return mParent; } QgsLayerTreeNode *parent() { return mParent; }
//! Get list of children of the node. Children are owned by the parent //! Get list of children of the node. Children are owned by the parent
Expand Down Expand Up @@ -145,6 +146,13 @@ class CORE_EXPORT QgsLayerTreeNode : public QObject
//! @note added in 3.0 //! @note added in 3.0
bool isItemVisibilityUncheckedRecursive() const; bool isItemVisibilityUncheckedRecursive() const;


/**
* Returns a list of any checked layers which belong to this node or its
* children.
* @note added in QGIS 3.0
*/
QList< QgsMapLayer * > checkedLayers() const;

//! Return whether the node should be shown as expanded or collapsed in GUI //! Return whether the node should be shown as expanded or collapsed in GUI
bool isExpanded() const; bool isExpanded() const;
//! Set whether the node should be shown as expanded or collapsed in GUI //! Set whether the node should be shown as expanded or collapsed in GUI
Expand Down
22 changes: 15 additions & 7 deletions src/core/qgsmapthemecollection.cpp
Expand Up @@ -185,17 +185,25 @@ QList<QgsMapLayer *> QgsMapThemeCollection::masterLayerOrder() const


QList<QgsMapLayer *> QgsMapThemeCollection::masterVisibleLayers() const QList<QgsMapLayer *> QgsMapThemeCollection::masterVisibleLayers() const
{ {
QList< QgsMapLayer * > visible; QList< QgsMapLayer *> allLayers = masterLayerOrder();
Q_FOREACH ( QgsMapLayer *layer, masterLayerOrder() ) QList< QgsMapLayer * > visibleLayers = mProject->layerTreeRoot()->checkedLayers();

if ( allLayers.isEmpty() )
{
// no project layer order set
return visibleLayers;
}

else
{ {
QgsLayerTreeLayer *nodeLayer = mProject->layerTreeRoot()->findLayer( layer ); QList< QgsMapLayer * > orderedVisibleLayers;
if ( nodeLayer ) Q_FOREACH ( QgsMapLayer *layer, allLayers )
{ {
if ( nodeLayer->isVisible() ) if ( visibleLayers.contains( layer ) )
visible << layer; orderedVisibleLayers << layer;
} }
return orderedVisibleLayers;
} }
return visible;
} }




Expand Down
5 changes: 5 additions & 0 deletions tests/src/python/test_qgsmapthemecollection.py
Expand Up @@ -204,6 +204,11 @@ def testMasterVisibleLayers(self):
prj.setLayerOrder([layer, layer2, layer3]) prj.setLayerOrder([layer, layer2, layer3])
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer, layer3]) self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer, layer3])


# test with no project layer order set, should respect tree order
prj.setLayerOrder([])
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer, layer3])
layer_node.setItemVisibilityChecked(True)
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer, layer2, layer3])


if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

0 comments on commit 2cba528

Please sign in to comment.