Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsconditionalstyle.h 3 : : --------------------- 4 : : begin : August 2015 5 : : copyright : (C) 2015 by Nathan Woodrow 6 : : email : woodrow dot nathan 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 : : #ifndef QGSCONDITIONALSTYLE_H 16 : : #define QGSCONDITIONALSTYLE_H 17 : : 18 : : #include "qgis_core.h" 19 : : #include <QFont> 20 : : #include <QColor> 21 : : #include <QPixmap> 22 : : #include <QDomNode> 23 : : #include <QDomDocument> 24 : : 25 : : #include "qgssymbol.h" 26 : : 27 : : class QgsConditionalStyle; 28 : : class QgsReadWriteContext; 29 : : 30 : : typedef QList<QgsConditionalStyle> QgsConditionalStyles; 31 : : 32 : : 33 : : /** 34 : : * \ingroup core 35 : : * \brief The QgsConditionalLayerStyles class holds conditional style information 36 : : * for a layer. This includes field styles and full row styles. 37 : : */ 38 : : class CORE_EXPORT QgsConditionalLayerStyles : public QObject 39 : : { 40 : : Q_OBJECT 41 : : 42 : : public: 43 : : 44 : : /** 45 : : * Constructor for QgsConditionalLayerStyles, with the specified \a parent object. 46 : : */ 47 : : QgsConditionalLayerStyles( QObject *parent = nullptr ); 48 : : 49 : : /** 50 : : * Returns a list of row styles associated with the layer. 51 : : * 52 : : * \see setRowStyles() 53 : : */ 54 : : QgsConditionalStyles rowStyles() const; 55 : : 56 : : /** 57 : : * Sets the conditional \a styles that apply to full rows of data in the attribute table. 58 : : * Each row will check be checked against each rule. 59 : : * 60 : : * \see rowStyles() 61 : : * \since QGIS 2.12 62 : : */ 63 : : void setRowStyles( const QgsConditionalStyles &styles ); 64 : : 65 : : /** 66 : : * Set the conditional \a styles for a field, with the specified \a fieldName. 67 : : * 68 : : * \see fieldStyles() 69 : : */ 70 : : void setFieldStyles( const QString &fieldName, const QList<QgsConditionalStyle> &styles ); 71 : : 72 : : /** 73 : : * Returns the conditional styles set for the field with matching \a fieldName. 74 : : * 75 : : * \see setFieldStyles() 76 : : */ 77 : : QList<QgsConditionalStyle> fieldStyles( const QString &fieldName ) const; 78 : : 79 : : /** 80 : : * Reads the condition styles state from a DOM node. 81 : : * 82 : : * \see writeXml() 83 : : */ 84 : : bool readXml( const QDomNode &node, const QgsReadWriteContext &context ); 85 : : 86 : : /** 87 : : * Writes the condition styles state to a DOM node. 88 : : * 89 : : * \see readXml() 90 : : */ 91 : : bool writeXml( QDomNode &node, QDomDocument &doc, const QgsReadWriteContext &context ) const; 92 : : 93 : : signals: 94 : : 95 : : /** 96 : : * Emitted when the conditional styles are changed. 97 : : * 98 : : * \since QGIS 3.10 99 : : */ 100 : : void changed(); 101 : : 102 : : private: 103 : : QHash<QString, QgsConditionalStyles> mFieldStyles; 104 : : QgsConditionalStyles mRowStyles; 105 : : }; 106 : : 107 : : /** 108 : : * \class QgsConditionalStyle 109 : : * \ingroup core 110 : : * \brief Conditional styling for a rule. 111 : : */ 112 : 0 : class CORE_EXPORT QgsConditionalStyle 113 : : { 114 : : public: 115 : : QgsConditionalStyle(); 116 : : QgsConditionalStyle( const QgsConditionalStyle &other ); 117 : : QgsConditionalStyle( const QString &rule ); 118 : : 119 : : QgsConditionalStyle &operator=( const QgsConditionalStyle &other ); 120 : : 121 : : /** 122 : : * \brief Check if the rule matches using the given value and feature 123 : : * \param value The current value being checked. The "value" variable from the context is replaced with this value. 124 : : * \param context Expression context for evaluating rule expression 125 : : * \returns TRUE of the rule matches against the given feature 126 : : */ 127 : : bool matches( const QVariant &value, QgsExpressionContext &context ) const; 128 : : 129 : : /** 130 : : * \brief Render a preview icon of the rule, at the specified \a size. 131 : : * 132 : : * If \a size is not specified, a default size will be used. 133 : : * 134 : : * \returns QPixmap preview of the style 135 : : */ 136 : : QPixmap renderPreview( const QSize &size = QSize() ) const; 137 : : 138 : : /** 139 : : * \brief Set the name of the style. Names are optional but handy for display 140 : : * \param value The name given to the style 141 : : */ 142 : 0 : void setName( const QString &value ) { mName = value; mValid = true; } 143 : : 144 : : /** 145 : : * \brief Set the rule for the style. Rules should be of QgsExpression syntax. 146 : : * Special value of \@value is replaced at run time with the check value 147 : : * \param value The QgsExpression style rule to use for this style 148 : : */ 149 : 0 : void setRule( const QString &value ) { mRule = value; mValid = true; } 150 : : 151 : : /** 152 : : * \brief Set the background color for the style 153 : : * \param value QColor for background color 154 : : */ 155 : 0 : void setBackgroundColor( const QColor &value ) { mBackColor = value; mValid = true; } 156 : : 157 : : /** 158 : : * \brief Set the text color for the style 159 : : * \param value QColor for text color 160 : : */ 161 : 0 : void setTextColor( const QColor &value ) { mTextColor = value; mValid = true; } 162 : : 163 : : /** 164 : : * \brief Set the font for the style 165 : : * \param value QFont to be used for text 166 : : */ 167 : 0 : void setFont( const QFont &value ) { mFont = value; mValid = true; } 168 : : 169 : : /** 170 : : * \brief Set the icon for the style. Icons are generated from symbols 171 : : * \param value QgsSymbol to be used when generating the icon 172 : : */ 173 : : void setSymbol( QgsSymbol *value ); 174 : : 175 : : /** 176 : : * \brief The name of the style. 177 : : * \returns The name of the style. Names are optional so might be empty. 178 : : */ 179 : : QString displayText() const; 180 : : 181 : : /** 182 : : * \brief The name of the style. 183 : : * \returns The name of the style. Names are optional so might be empty. 184 : : */ 185 : 0 : QString name() const { return mName; } 186 : : 187 : : /** 188 : : * \brief The icon set for style generated from the set symbol 189 : : * \returns A QPixmap that was set for the icon using the symbol 190 : : */ 191 : 0 : QPixmap icon() const { return mIcon; } 192 : : 193 : : /** 194 : : * \brief The symbol used to generate the icon for the style 195 : : * \returns The QgsSymbol used for the icon 196 : : */ 197 : 0 : QgsSymbol *symbol() const { return mSymbol.get(); } 198 : : 199 : : /** 200 : : * \brief The text color set for style 201 : : * \returns QColor for text color 202 : : */ 203 : 0 : QColor textColor() const { return mTextColor; } 204 : : 205 : : /** 206 : : * \brief Check if the text color is valid for render. 207 : : * Valid colors are non invalid QColors and a color with a > 0 alpha 208 : : * \returns TRUE of the color set for text is valid. 209 : : */ 210 : : bool validTextColor() const; 211 : : 212 : : /** 213 : : * \brief The background color for style 214 : : * \returns QColor for background color 215 : : */ 216 : 0 : QColor backgroundColor() const { return mBackColor; } 217 : : 218 : : /** 219 : : * \brief Check if the background color is valid for render. 220 : : * Valid colors are non invalid QColors and a color with a > 0 alpha 221 : : * \returns TRUE of the color set for background is valid. 222 : : */ 223 : : bool validBackgroundColor() const; 224 : : 225 : : /** 226 : : * \brief The font for the style 227 : : * \returns QFont for the style 228 : : */ 229 : 0 : QFont font() const { return mFont; } 230 : : 231 : : /** 232 : : * \brief The condition rule set for the style. Rule may contain variable \@value 233 : : * to represent the current value 234 : : * \returns QString of the current set rule 235 : : */ 236 : 0 : QString rule() const { return mRule; } 237 : : 238 : : /** 239 : : * \brief isValid Check if this rule is valid. A valid rule has one or more properties 240 : : * set. 241 : : * \returns TRUE if the rule is valid. 242 : : */ 243 : 0 : bool isValid() const { return mValid; } 244 : : 245 : : /** 246 : : * \brief Find and return the matching styles for the value and feature. 247 : : * If no match is found a invalid QgsConditionalStyle is return. 248 : : * 249 : : * \returns A conditional style that matches the value and feature. 250 : : * Check with QgsConditionalStyle::isValid() 251 : : */ 252 : : static QList<QgsConditionalStyle> matchingConditionalStyles( const QList<QgsConditionalStyle> &styles, const QVariant &value, QgsExpressionContext &context ); 253 : : 254 : : /** 255 : : * \brief Find and return the matching style for the value and feature. 256 : : * If no match is found a invalid QgsConditionalStyle is return. 257 : : * 258 : : * \returns A conditional style that matches the value and feature. 259 : : * Check with QgsConditionalStyle::isValid() 260 : : */ 261 : : static QgsConditionalStyle matchingConditionalStyle( const QList<QgsConditionalStyle> &styles, const QVariant &value, QgsExpressionContext &context ); 262 : : 263 : : /** 264 : : * \brief Compress a list of styles into a single style. This can be used to stack the elements of the 265 : : * styles. The font of the last style is used in the output. 266 : : * \param styles The list of styles to compress down 267 : : * \returns A single style generated from joining each style property. 268 : : */ 269 : : static QgsConditionalStyle compressStyles( const QList<QgsConditionalStyle> &styles ); 270 : : 271 : : /** 272 : : * Reads vector conditional style specific state from layer Dom node. 273 : : */ 274 : : bool readXml( const QDomNode &node, const QgsReadWriteContext &context ); 275 : : 276 : : /** 277 : : * Write vector conditional style specific state from layer Dom node. 278 : : */ 279 : : bool writeXml( QDomNode &node, QDomDocument &doc, const QgsReadWriteContext &context ) const; 280 : : 281 : : bool operator==( const QgsConditionalStyle &other ) const; 282 : : bool operator!=( const QgsConditionalStyle &other ) const; 283 : : 284 : : #ifdef SIP_RUN 285 : : SIP_PYOBJECT __repr__(); 286 : : % MethodCode 287 : : QString str; 288 : : if ( !sipCpp->name().isEmpty() ) 289 : : str = QStringLiteral( "<QgsConditionalStyle: '%1' (%2)>" ).arg( sipCpp->name(), sipCpp->rule() ); 290 : : else 291 : : str = QStringLiteral( "<QgsConditionalStyle: %2>" ).arg( sipCpp->rule() ); 292 : : sipRes = PyUnicode_FromString( str.toUtf8().constData() ); 293 : : % End 294 : : #endif 295 : : 296 : : private: 297 : : 298 : : bool mValid = false; 299 : : QString mName; 300 : : QString mRule; 301 : : std::unique_ptr<QgsSymbol> mSymbol; 302 : : QFont mFont; 303 : : QColor mBackColor; 304 : : QColor mTextColor; 305 : : QPixmap mIcon; 306 : : }; 307 : : 308 : : #endif // QGSCONDITIONALSTYLE_H