Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgscolorschemeregistry.h 3 : : ------------------------ 4 : : begin : July 2014 5 : : copyright : (C) 2014 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSCOLORSCHEMEREGISTRY_H 19 : : #define QGSCOLORSCHEMEREGISTRY_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgscolorscheme.h" 23 : : #include <QList> 24 : : 25 : : /** 26 : : * \ingroup core 27 : : * \class QgsColorSchemeRegistry 28 : : * \brief Registry of color schemes 29 : : * 30 : : * A registry of QgsColorScheme color schemes. This class can be created directly, or 31 : : * accessed via a QgsApplication::colorSchemeRegistry(). 32 : : * \since QGIS 2.5 33 : : */ 34 : : class CORE_EXPORT QgsColorSchemeRegistry 35 : : { 36 : : 37 : : public: 38 : : 39 : : /** 40 : : * Constructor for an empty color scheme registry 41 : : */ 42 : 5 : QgsColorSchemeRegistry() = default; 43 : : 44 : : virtual ~QgsColorSchemeRegistry(); 45 : : 46 : : /** 47 : : * Adds all color schemes from the global instance to this color scheme. 48 : : * \see addDefaultSchemes 49 : : * \see addColorScheme 50 : : */ 51 : : void populateFromInstance(); 52 : : 53 : : /** 54 : : * Adds all default color schemes to this color scheme. 55 : : * \see populateFromInstance 56 : : * \see addColorScheme 57 : : * \see addUserSchemes 58 : : */ 59 : : void addDefaultSchemes(); 60 : : 61 : : /** 62 : : * Initializes the default random style color scheme for the user. 63 : : * \since QGIS 3.2 64 : : */ 65 : : void initStyleScheme(); 66 : : 67 : : /** 68 : : * Creates schemes for all gpl palettes in the user's palettes folder. 69 : : * \see populateFromInstance 70 : : * \see addDefaultSchemes 71 : : * \see addColorScheme 72 : : */ 73 : : void addUserSchemes(); 74 : : 75 : : /** 76 : : * Adds a color scheme to the registry. Ownership of the scheme is transferred 77 : : * to the registry. 78 : : * \param scheme color scheme to add 79 : : * \see populateFromInstance 80 : : * \see removeColorScheme 81 : : */ 82 : : void addColorScheme( QgsColorScheme *scheme SIP_TRANSFER ); 83 : : 84 : : /** 85 : : * Removes all matching color schemes from the registry 86 : : * \param scheme color scheme to remove 87 : : * \returns TRUE if scheme was found and removed 88 : : * \see addColorScheme 89 : : */ 90 : : bool removeColorScheme( QgsColorScheme *scheme ); 91 : : 92 : : /** 93 : : * Returns all color schemes in the registry 94 : : * \returns list of color schemes 95 : : */ 96 : : QList<QgsColorScheme *> schemes() const; 97 : : 98 : : /** 99 : : * Returns all color schemes in the registry which have a specified flag set 100 : : * \param flag flag to match 101 : : * \returns list of color schemes with flag set 102 : : */ 103 : : QList<QgsColorScheme *> schemes( QgsColorScheme::SchemeFlag flag ) const; 104 : : 105 : : 106 : : /** 107 : : * Returns color schemes of a specific type 108 : : * \param schemeList destination list for matching schemes 109 : : * \note not available in Python bindings 110 : : */ 111 : : #ifndef SIP_RUN 112 : : template<class T> void schemes( QList<T *> &schemeList ) 113 : : { 114 : : schemeList.clear(); 115 : : QList<QgsColorScheme *> schemeInstanceList = schemes(); 116 : : QList<QgsColorScheme *>::iterator schemeIt = schemeInstanceList.begin(); 117 : : for ( ; schemeIt != schemeInstanceList.end(); ++schemeIt ) 118 : : { 119 : : T *scheme = dynamic_cast<T *>( *schemeIt ); 120 : : if ( scheme ) 121 : : { 122 : : schemeList.push_back( scheme ); 123 : : } 124 : : } 125 : : } 126 : : #endif 127 : : 128 : : /** 129 : : * Sets the color \a scheme to use when fetching random colors to use for symbol styles. 130 : : * 131 : : * \a scheme should match a color scheme which is already present in the registry. 132 : : * 133 : : * Note that calling this method takes a snapshot of the colors from the scheme's 134 : : * QgsColorScheme::fetchColors() list. Accordingly, any future changes to the colors 135 : : * in \a scheme are not automatically reflected by calls to fetchRandomStyleColor(). 136 : : * If \a scheme is updated, then another call to setRandomStyleColorScheme() must 137 : : * be made in order to update the cached list of available style colors. 138 : : * 139 : : * \see randomStyleColorScheme() 140 : : * \see fetchRandomStyleColor() 141 : : * 142 : : * \since QGIS 3.2 143 : : */ 144 : : void setRandomStyleColorScheme( QgsColorScheme *scheme ); 145 : : 146 : : /** 147 : : * Returns the color scheme used when fetching random colors to use for symbol styles. 148 : : * 149 : : * This may be NULLPTR, in which case totally random colors are used for styles. 150 : : * 151 : : * \see setRandomStyleColorScheme() 152 : : * \see fetchRandomStyleColor() 153 : : * 154 : : * \since QGIS 3.2 155 : : */ 156 : : QgsColorScheme *randomStyleColorScheme(); 157 : : 158 : : /** 159 : : * Returns a random color for use with a new symbol style (e.g. for a newly created 160 : : * map layer). 161 : : * 162 : : * If a randomStyleColorScheme() is set then this color will be randomly taken from that 163 : : * color scheme. If no randomStyleColorScheme() is set then a totally random color 164 : : * will be generated. 165 : : * 166 : : * Note that calling setRandomStyleColorScheme() takes a snapshot of the colors from the scheme's 167 : : * QgsColorScheme::fetchColors() list. Accordingly, any future changes to the colors 168 : : * in the scheme are not automatically reflected by calls to fetchRandomStyleColor(). 169 : : * If the scheme is updated, then another call to setRandomStyleColorScheme() must 170 : : * be made in order to update the cached list of available style colors from which 171 : : * fetchRandomStyleColor() selects colors. 172 : : * 173 : : * This method is thread safe. 174 : : * 175 : : * \see randomStyleColorScheme() 176 : : * \see setRandomStyleColorScheme() 177 : : * \since QGIS 3.2 178 : : */ 179 : : QColor fetchRandomStyleColor() const; 180 : : 181 : : private: 182 : : 183 : : QList< QgsColorScheme * > mColorSchemeList; 184 : : 185 : 5 : QgsColorScheme *mRandomStyleColorScheme = nullptr; 186 : : QgsNamedColorList mRandomStyleColors; 187 : : 188 : 5 : mutable int mNextRandomStyleColorIndex = 0; 189 : : 190 : 5 : int mNextRandomStyleColorDirection = 1; 191 : : 192 : : }; 193 : : 194 : : 195 : : 196 : : #endif