Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslayertree.h 3 : : -------------------------------------- 4 : : Date : May 2014 5 : : Copyright : (C) 2014 by Martin Dobias 6 : : Email : wonder dot sk at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #ifndef QGSLAYERTREE_H 17 : : #define QGSLAYERTREE_H 18 : : 19 : : #include "qgslayertreenode.h" 20 : : #include "qgslayertreegroup.h" 21 : : #include "qgslayertreelayer.h" 22 : : 23 : : /** 24 : : * \ingroup core 25 : : * \brief Namespace with helper functions for layer tree operations. 26 : : * 27 : : * Only generally useful routines should be here. Miscellaneous utility functions for work 28 : : * with the layer tree are in QgsLayerTreeUtils class. 29 : : * 30 : : * \since QGIS 3.0 31 : : */ 32 : 0 : class CORE_EXPORT QgsLayerTree : public QgsLayerTreeGroup 33 : : { 34 : : Q_OBJECT 35 : : 36 : : public: 37 : : 38 : : /** 39 : : * Check whether the node is a valid group node 40 : : * 41 : : * \since QGIS 2.4 42 : : */ 43 : 0 : static inline bool isGroup( QgsLayerTreeNode *node ) 44 : : { 45 : 0 : return node && node->nodeType() == QgsLayerTreeNode::NodeGroup; 46 : : } 47 : : 48 : : /** 49 : : * Check whether the node is a valid layer node 50 : : * 51 : : * \since QGIS 2.4 52 : : */ 53 : 2 : static inline bool isLayer( const QgsLayerTreeNode *node ) 54 : : { 55 : 2 : return node && node->nodeType() == QgsLayerTreeNode::NodeLayer; 56 : : } 57 : : 58 : : /** 59 : : * Cast node to a group. No type checking is done - use isGroup() to find out whether this operation is legal. 60 : : * 61 : : * \note Not available in Python bindings, because cast is automatic. 62 : : * \since QGIS 2.4 63 : : */ 64 : 1 : static inline QgsLayerTreeGroup *toGroup( QgsLayerTreeNode *node ) SIP_SKIP 65 : : { 66 : 1 : return static_cast<QgsLayerTreeGroup *>( node ); 67 : : } 68 : : 69 : : /** 70 : : * Cast node to a layer. No type checking is done - use isLayer() to find out whether this operation is legal. 71 : : * 72 : : * \note Not available in Python bindings, because cast is automatic. 73 : : * \since QGIS 2.4 74 : : */ 75 : 2 : static inline QgsLayerTreeLayer *toLayer( QgsLayerTreeNode *node ) SIP_SKIP 76 : : { 77 : 2 : return static_cast<QgsLayerTreeLayer *>( node ); 78 : : } 79 : : 80 : : /** 81 : : * Cast node to a layer. No type checking is done - use isLayer() to find out whether this operation is legal. 82 : : * 83 : : * \note Not available in Python bindings, because cast is automatic. 84 : : * \since QGIS 2.4 85 : : */ 86 : 0 : static inline const QgsLayerTreeLayer *toLayer( const QgsLayerTreeNode *node ) SIP_SKIP 87 : : { 88 : 0 : return static_cast< const QgsLayerTreeLayer *>( node ); 89 : : } 90 : : 91 : : /** 92 : : * Create a new empty layer tree 93 : : */ 94 : : QgsLayerTree(); 95 : : 96 : : /** 97 : : * The order in which layers will be rendered on the canvas. 98 : : * Will only be used if the property hasCustomLayerOrder is TRUE. 99 : : * If you need the current layer order that is active, prefer using layerOrder(). 100 : : * 101 : : * \see setCustomLayerOrder 102 : : * \see layerOrder 103 : : * \see hasCustomLayerOrder 104 : : * 105 : : * \since QGIS 3.0 106 : : */ 107 : : QList<QgsMapLayer *> customLayerOrder() const; 108 : : 109 : : /** 110 : : * The order in which layers will be rendered on the canvas. 111 : : * Will only be used if the property hasCustomLayerOrder is TRUE. 112 : : * If you need the current layer order that is active, prefer using layerOrder(). 113 : : * 114 : : * \see customLayerOrder 115 : : * \see layerOrder 116 : : * \see hasCustomLayerOrder 117 : : * 118 : : * \since QGIS 3.0 119 : : */ 120 : : void setCustomLayerOrder( const QList<QgsMapLayer *> &customLayerOrder ); 121 : : 122 : : /** 123 : : * The order in which layers will be rendered on the canvas. 124 : : * Will only be used if the property hasCustomLayerOrder is TRUE. 125 : : * If you need the current layer order that is active, prefer using layerOrder(). 126 : : * 127 : : * \see customLayerOrder 128 : : * \see layerOrder 129 : : * \see hasCustomLayerOrder 130 : : * 131 : : * \since QGIS 3.0 132 : : */ 133 : : void setCustomLayerOrder( const QStringList &customLayerOrder ) SIP_PYNAME( setCustomLayerOrderByIds ); 134 : : 135 : : /** 136 : : * The order in which layers will be rendered on the canvas. 137 : : * Depending on hasCustomLayerOrder, this will return either the override 138 : : * customLayerOrder or the layer order derived from the tree. 139 : : * This property is read only. 140 : : * 141 : : * \see customLayerOrder 142 : : * 143 : : * \since QGIS 3.0 144 : : */ 145 : : QList<QgsMapLayer *> layerOrder() const; 146 : : 147 : : /** 148 : : * Determines if the layer order should be derived from the layer tree 149 : : * or if a custom override order shall be used instead. 150 : : * 151 : : * \see customLayerOrder 152 : : * 153 : : * \since QGIS 3.0 154 : : */ 155 : : bool hasCustomLayerOrder() const; 156 : : 157 : : /** 158 : : * Determines if the layer order should be derived from the layer tree 159 : : * or if a custom override order shall be used instead. 160 : : * 161 : : * \see setCustomLayerOrder 162 : : * 163 : : * \since QGIS 3.0 164 : : */ 165 : : void setHasCustomLayerOrder( bool hasCustomLayerOrder ); 166 : : 167 : : /** 168 : : * Load the layer tree from an XML element. 169 : : * It is not required that layers are loaded at this point. 170 : : * resolveReferences() needs to be called after loading the layers and 171 : : * before using the tree. 172 : : * 173 : : * \since QGIS 3.0 174 : : */ 175 : : static QgsLayerTree *readXml( QDomElement &element, const QgsReadWriteContext &context ); 176 : : 177 : : /** 178 : : * Load the layer order from an XML element. 179 : : * Make sure that this is only called after the layers are loaded. 180 : : * 181 : : * \since QGIS 3.0 182 : : */ 183 : : void readLayerOrderFromXml( const QDomElement &doc ); 184 : : 185 : : void writeXml( QDomElement &parentElement, const QgsReadWriteContext &context ) override; 186 : : 187 : : QgsLayerTree *clone() const override SIP_FACTORY; 188 : : 189 : : /** 190 : : * Clear any information from this layer tree. 191 : : * 192 : : * \since QGIS 3.0 193 : : */ 194 : : void clear(); 195 : : 196 : : signals: 197 : : 198 : : /** 199 : : * Emitted when the custom layer order has changed. 200 : : * 201 : : * \since QGIS 3.0 202 : : */ 203 : : void customLayerOrderChanged(); 204 : : 205 : : /** 206 : : * Emitted when the layer order has changed. 207 : : * 208 : : * \since QGIS 3.0 209 : : */ 210 : : void layerOrderChanged(); 211 : : 212 : : /** 213 : : * Emitted when the hasCustomLayerOrder flag changes. 214 : : * 215 : : * \see hasCustomLayerOrder 216 : : * 217 : : * \since QGIS 3.0 218 : : */ 219 : : void hasCustomLayerOrderChanged( bool hasCustomLayerOrder ); 220 : : 221 : : private slots: 222 : : void nodeAddedChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo ); 223 : : void nodeRemovedChildren(); 224 : : 225 : : private: 226 : : //! Copy constructor \see clone() 227 : : QgsLayerTree( const QgsLayerTree &other ); 228 : : void addMissingLayers(); 229 : : QgsWeakMapLayerPointerList mCustomLayerOrder; 230 : : bool mHasCustomLayerOrder = false; 231 : : 232 : : QgsLayerTree &operator= ( const QgsLayerTree & ) = delete; 233 : : }; 234 : : 235 : : #endif // QGSLAYERTREE_H