Skip to content

Commit 2cba528

Browse files
committed
If no project layer order set, use layer tree layer order
for QgsMapThemeCollection::masterVisibleLayers()
1 parent 0d0a81b commit 2cba528

File tree

7 files changed

+60
-17
lines changed

7 files changed

+60
-17
lines changed

python/core/layertree/qgslayertree.sip

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,8 @@
1212
*/
1313
namespace QgsLayerTree
1414
{
15-
//! Check whether the node is a valid group node
16-
bool isGroup( QgsLayerTreeNode* node );
17-
18-
//! Check whether the node is a valid layer node
19-
bool isLayer( QgsLayerTreeNode* node );
15+
bool isGroup( QgsLayerTreeNode *node );
16+
bool isLayer( const QgsLayerTreeNode *node );
2017

2118
//! Cast node to a group. No type checking is done - use isGroup() to find out whether this operation is legal.
2219
// PYTHON: automatic cast

python/core/layertree/qgslayertreenode.sip

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class QgsLayerTreeNode : QObject
7070
~QgsLayerTreeNode();
7171

7272
//! Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree namespace for that
73-
NodeType nodeType();
73+
NodeType nodeType() const;
7474
//! Get pointer to the parent. If parent is a null pointer, the node is a root node
7575
QgsLayerTreeNode *parent();
7676
//! Get list of children of the node. Children are owned by the parent
@@ -132,8 +132,7 @@ class QgsLayerTreeNode : QObject
132132
//! Return whether this node is unchecked and all its children.
133133
//! @note added in 3.0
134134
bool isItemVisibilityUncheckedRecursive() const;
135-
136-
//! Return whether the node should be shown as expanded or collapsed in GUI
135+
QList< QgsMapLayer * > checkedLayers() const;
137136
bool isExpanded() const;
138137
//! Set whether the node should be shown as expanded or collapsed in GUI
139138
void setExpanded( bool expanded );

src/core/layertree/qgslayertree.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace QgsLayerTree
3737
}
3838

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

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

5965
#endif // QGSLAYERTREE_H

src/core/layertree/qgslayertreenode.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,26 @@ bool QgsLayerTreeNode::isItemVisibilityUncheckedRecursive() const
126126
return true;
127127
}
128128

129+
void fetchCheckedLayers( const QgsLayerTreeNode *node, QList<QgsMapLayer *> &layers )
130+
{
131+
if ( QgsLayerTree::isLayer( node ) )
132+
{
133+
const QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
134+
if ( nodeLayer->isVisible() )
135+
layers << nodeLayer->layer();
136+
}
137+
138+
Q_FOREACH ( QgsLayerTreeNode *child, node->children() )
139+
fetchCheckedLayers( child, layers );
140+
}
141+
142+
QList<QgsMapLayer *> QgsLayerTreeNode::checkedLayers() const
143+
{
144+
QList<QgsMapLayer *> layers;
145+
fetchCheckedLayers( this, layers );
146+
return layers;
147+
}
148+
129149
void QgsLayerTreeNode::setExpanded( bool expanded )
130150
{
131151
if ( mExpanded == expanded )

src/core/layertree/qgslayertreenode.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
class QDomElement;
2525

2626
class QgsProject;
27+
class QgsMapLayer;
2728

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

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

149+
/**
150+
* Returns a list of any checked layers which belong to this node or its
151+
* children.
152+
* @note added in QGIS 3.0
153+
*/
154+
QList< QgsMapLayer * > checkedLayers() const;
155+
148156
//! Return whether the node should be shown as expanded or collapsed in GUI
149157
bool isExpanded() const;
150158
//! Set whether the node should be shown as expanded or collapsed in GUI

src/core/qgsmapthemecollection.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -185,17 +185,25 @@ QList<QgsMapLayer *> QgsMapThemeCollection::masterLayerOrder() const
185185

186186
QList<QgsMapLayer *> QgsMapThemeCollection::masterVisibleLayers() const
187187
{
188-
QList< QgsMapLayer * > visible;
189-
Q_FOREACH ( QgsMapLayer *layer, masterLayerOrder() )
188+
QList< QgsMapLayer *> allLayers = masterLayerOrder();
189+
QList< QgsMapLayer * > visibleLayers = mProject->layerTreeRoot()->checkedLayers();
190+
191+
if ( allLayers.isEmpty() )
192+
{
193+
// no project layer order set
194+
return visibleLayers;
195+
}
196+
197+
else
190198
{
191-
QgsLayerTreeLayer *nodeLayer = mProject->layerTreeRoot()->findLayer( layer );
192-
if ( nodeLayer )
199+
QList< QgsMapLayer * > orderedVisibleLayers;
200+
Q_FOREACH ( QgsMapLayer *layer, allLayers )
193201
{
194-
if ( nodeLayer->isVisible() )
195-
visible << layer;
202+
if ( visibleLayers.contains( layer ) )
203+
orderedVisibleLayers << layer;
196204
}
205+
return orderedVisibleLayers;
197206
}
198-
return visible;
199207
}
200208

201209

tests/src/python/test_qgsmapthemecollection.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,11 @@ def testMasterVisibleLayers(self):
204204
prj.setLayerOrder([layer, layer2, layer3])
205205
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer, layer3])
206206

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

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

0 commit comments

Comments
 (0)