Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgssymbollayerreference.h 3 : : --------------------- 4 : : begin : June 2019 5 : : copyright : (C) 2019 by Hugo Mercier / Oslandia 6 : : email : infos at oslandia 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 QGSSYMBOLLAYERREFERENCE_H 17 : : #define QGSSYMBOLLAYERREFERENCE_H 18 : : 19 : : #include "qgis_sip.h" 20 : : #include "qgis_core.h" 21 : : #include <QList> 22 : : #include <QVariant> 23 : : #include <QVector> 24 : : 25 : : class QgsVectorLayer; 26 : : 27 : : /** 28 : : * We may need stable references to symbol layers, when pointers to symbol layers is not usable 29 : : * (when a symbol or a feature renderer is cloned for example). 30 : : * 31 : : * A symbol layer identifier consists of: 32 : : * 33 : : * - an identifier to its symbol (given by the QgsFeatureRenderer) 34 : : * - a path of indexes inside its symbol and subsymbols. 35 : : * 36 : : * For a symbol in a QgsSingleSymbolRenderer that has two symbol layers, it will give: 37 : : * 38 : : * - "" for the symbol key 39 : : * - [0] and [1] for the two symbol layer indexes 40 : : * 41 : : * For a QgsRuleBasedRenderer each rule key is the symbol key. 42 : : * 43 : : * For a symbol with a symbol layer that has a sub symbol (say a QgsArrowSymbolLayer), 44 : : * path to symbol layers of the sub symbol are given by a list of indexes: 45 : : * 46 : : * - [0, 0] : first symbol layer of the sub symbol of the first symbol layer 47 : : * - [0, 1] : second symbol layer of the sub symbol of the first symbol layer 48 : : * - [2, 0] : first symbol layer of the sub symbol of the third symbol layer, etc. 49 : : * 50 : : * \ingroup core 51 : : * \since QGIS 3.12 52 : : */ 53 : 0 : class CORE_EXPORT QgsSymbolLayerId 54 : : { 55 : : public: 56 : : QgsSymbolLayerId() {} 57 : : 58 : : /** 59 : : * QgsSymbolLayerId constructor with a symbol key and a unique symbol layer index 60 : : */ 61 : : QgsSymbolLayerId( QString key, int index ) 62 : : : mSymbolKey( key ), mIndexPath( { index } ) 63 : : {} 64 : : 65 : : /** 66 : : * QgsSymbolLayerId constructor with a symbol key and an index path 67 : : */ 68 : 0 : QgsSymbolLayerId( QString key, const QVector<int> &indexPath ) 69 : 0 : : mSymbolKey( key ), mIndexPath( { indexPath } ) 70 : 0 : {} 71 : : 72 : : //! Default copy constructor 73 : 0 : QgsSymbolLayerId( const QgsSymbolLayerId &other ) = default; 74 : : 75 : : //! Default assignment operator 76 : : QgsSymbolLayerId &operator=( const QgsSymbolLayerId &other ) = default; 77 : : 78 : : /** 79 : : * Returns the key associated to the symbol 80 : : */ 81 : 0 : QString symbolKey() const { return mSymbolKey; } 82 : : 83 : : /** 84 : : * Returns the symbol layer index path inside the symbol 85 : : */ 86 : 0 : QVector<int> symbolLayerIndexPath() const { return mIndexPath; } 87 : : 88 : : //! Equality operator 89 : 0 : bool operator==( const QgsSymbolLayerId &other ) const 90 : : { 91 : 0 : return ( mSymbolKey == other.mSymbolKey && mIndexPath == other.mIndexPath ); 92 : : } 93 : : 94 : : //! Comparison operator, for storage in a QSet or QMap 95 : : bool operator<( const QgsSymbolLayerId &other ) const 96 : : { 97 : : return ( mSymbolKey == other.mSymbolKey ) ? 98 : : mIndexPath < other.mIndexPath 99 : : : mSymbolKey < other.mSymbolKey; 100 : : } 101 : : 102 : : private: 103 : : //! Symbol unique identifier (legend key) 104 : : QString mSymbolKey; 105 : : 106 : : //! Symbol layer index path in symbol 107 : : QVector<int> mIndexPath; 108 : : }; 109 : : 110 : : /** 111 : : * \ingroup core 112 : : * \class QgsSymbolLayerReference 113 : : * 114 : : * \brief Type used to refer to a specific symbol layer in a symbol of a layer. 115 : : * \since QGIS 3.12 116 : : */ 117 : 0 : class CORE_EXPORT QgsSymbolLayerReference 118 : : { 119 : : public: 120 : : //! Default constructor 121 : : QgsSymbolLayerReference() = default; 122 : : 123 : : //! Constructor 124 : 0 : QgsSymbolLayerReference( const QString &layerId, const QgsSymbolLayerId &symbolLayer ) 125 : 0 : : mLayerId( layerId ), mSymbolLayerId( symbolLayer ) 126 : 0 : {} 127 : : 128 : : /** 129 : : * The referenced vector layer / feature renderer 130 : : */ 131 : 0 : QString layerId() const { return mLayerId; } 132 : : 133 : : /** 134 : : * The symbol layer's id 135 : : */ 136 : 0 : QgsSymbolLayerId symbolLayerId() const { return mSymbolLayerId; } 137 : : 138 : : //! Comparison operator 139 : 0 : bool operator==( const QgsSymbolLayerReference &other ) const 140 : : { 141 : 0 : return mLayerId == other.mLayerId && 142 : 0 : mSymbolLayerId == other.mSymbolLayerId; 143 : : } 144 : : 145 : : private: 146 : : QString mLayerId; 147 : : QgsSymbolLayerId mSymbolLayerId; 148 : : }; 149 : : 150 : 0 : inline uint qHash( const QgsSymbolLayerId &id ) 151 : : { 152 : 0 : return qHash( id.symbolKey() ) ^ qHash( id.symbolLayerIndexPath() ); 153 : 0 : } 154 : : 155 : 0 : inline uint qHash( const QgsSymbolLayerReference &r ) 156 : : { 157 : 0 : return qHash( r.layerId() ) ^ qHash( r.symbolLayerId() ); 158 : 0 : } 159 : : 160 : : typedef QList<QgsSymbolLayerReference> QgsSymbolLayerReferenceList; 161 : : 162 : : /** 163 : : * Utilitary function to turn a QgsSymbolLayerReferenceList into a string 164 : : * \see stringToSymbolLayerReferenceList 165 : : * \since QGIS 3.12 166 : : */ 167 : : CORE_EXPORT QString symbolLayerReferenceListToString( const QgsSymbolLayerReferenceList & ); 168 : : 169 : : /** 170 : : * Utilitary function to parse a string originated from symbolLayerReferenceListToString 171 : : * into a QgsSymbolLayerReferenceList 172 : : * \see symbolLayerReferenceListToString 173 : : * \since QGIS 3.12 174 : : */ 175 : : CORE_EXPORT QgsSymbolLayerReferenceList stringToSymbolLayerReferenceList( const QString & ); 176 : : 177 : : #endif