Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsnumericformat.h 3 : : ------------------- 4 : : begin : January 2020 5 : : copyright : (C) 2020 by Nyall Dawson 6 : : email : nyall dot dawson 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 QGSNUMERICFORMAT_H 16 : : #define QGSNUMERICFORMAT_H 17 : : 18 : : #include "qgis_core.h" 19 : : #include "qgis_sip.h" 20 : : 21 : : #include <QString> 22 : : #include <QVariantMap> 23 : : #include <QDomDocument> 24 : : 25 : : 26 : : class QgsReadWriteContext; 27 : : 28 : : /** 29 : : * \ingroup core 30 : : * \brief A context for numeric formats 31 : : * 32 : : * \since QGIS 3.12 33 : : */ 34 : : class CORE_EXPORT QgsNumericFormatContext 35 : : { 36 : : public: 37 : : 38 : : /** 39 : : * Constructor for QgsNumericFormatContext. 40 : : * 41 : : * The context will be populated based on the user's current locale settings. 42 : : */ 43 : : QgsNumericFormatContext(); 44 : : 45 : : 46 : : /** 47 : : * Returns the thousands separator character. 48 : : * 49 : : * \see setThousandsSeparator() 50 : : */ 51 : 0 : QChar thousandsSeparator() const 52 : : { 53 : 0 : return mThousandsSep; 54 : : } 55 : : 56 : : /** 57 : : * Sets the thousands \a separator character. 58 : : * 59 : : * \see thousandsSeparator() 60 : : */ 61 : : void setThousandsSeparator( const QChar &separator ) 62 : : { 63 : : mThousandsSep = separator; 64 : : } 65 : : 66 : : /** 67 : : * Returns the decimal separator character. 68 : : * 69 : : * \see setDecimalSeparator() 70 : : */ 71 : 0 : QChar decimalSeparator() const 72 : : { 73 : 0 : return mDecimalSep; 74 : : } 75 : : 76 : : /** 77 : : * Returns the decimal separator character. 78 : : * 79 : : * \see setDecimalSeparator() 80 : : */ 81 : : void setDecimalSeparator( const QChar &separator ) 82 : : { 83 : : mDecimalSep = separator; 84 : : } 85 : : 86 : : /** 87 : : * Returns the percent character. 88 : : * 89 : : * \see setPercent() 90 : : */ 91 : 0 : QChar percent() const 92 : : { 93 : 0 : return mPercent; 94 : : } 95 : : 96 : : /** 97 : : * Sets the percent \a character. 98 : : * 99 : : * \see percent() 100 : : */ 101 : : void setPercent( const QChar &character ) 102 : : { 103 : : mPercent = character; 104 : : } 105 : : 106 : : /** 107 : : * Returns the zero digit character. 108 : : * 109 : : * \see setZeroDigit() 110 : : */ 111 : 0 : QChar zeroDigit() const 112 : : { 113 : 0 : return mZeroDigit; 114 : : } 115 : : 116 : : /** 117 : : * Returns the zero digit \a character. 118 : : * 119 : : * \see zeroDigit() 120 : : */ 121 : : void setZeroDigit( const QChar &character ) 122 : : { 123 : : mZeroDigit = character; 124 : : } 125 : : 126 : : /** 127 : : * Returns the negative sign character. 128 : : * 129 : : * \see setNegativeSign() 130 : : */ 131 : 0 : QChar negativeSign() const 132 : : { 133 : 0 : return mNegativeSign; 134 : : } 135 : : 136 : : /** 137 : : * Sets the negative sign \a character. 138 : : * 139 : : * \see negativeSign() 140 : : */ 141 : : void setNegativeSign( const QChar &character ) 142 : : { 143 : : mNegativeSign = character; 144 : : } 145 : : 146 : : /** 147 : : * Returns the positive sign character. 148 : : * 149 : : * \see setPositiveSign() 150 : : */ 151 : 0 : QChar positiveSign() const 152 : : { 153 : 0 : return mPositiveSign; 154 : : } 155 : : 156 : : /** 157 : : * Sets the positive sign \a character. 158 : : * 159 : : * \see positiveSign() 160 : : */ 161 : : void setPositiveSign( const QChar &character ) 162 : : { 163 : : mPositiveSign = character; 164 : : } 165 : : 166 : : /** 167 : : * Returns the exponential character. 168 : : * 169 : : * \see setExponential() 170 : : */ 171 : 0 : QChar exponential() const 172 : : { 173 : 0 : return mExponential; 174 : : } 175 : : 176 : : /** 177 : : * Sets the exponential \a character. 178 : : * 179 : : * \see exponential() 180 : : */ 181 : : void setExponential( const QChar &character ) 182 : : { 183 : : mExponential = character; 184 : : } 185 : : 186 : : private: 187 : : QChar mThousandsSep; 188 : : QChar mDecimalSep; 189 : : QChar mPercent; 190 : : QChar mZeroDigit; 191 : : QChar mNegativeSign; 192 : : QChar mPositiveSign; 193 : : QChar mExponential; 194 : : }; 195 : : 196 : : #ifdef SIP_RUN 197 : : % ModuleHeaderCode 198 : : #include <qgsbasicnumericformat.h> 199 : : #include <qgsbearingnumericformat.h> 200 : : #include <qgscurrencynumericformat.h> 201 : : #include <qgsfallbacknumericformat.h> 202 : : #include <qgspercentagenumericformat.h> 203 : : #include <qgsscientificnumericformat.h> 204 : : % End 205 : : #endif 206 : : 207 : : /** 208 : : * \ingroup core 209 : : * \brief A numeric formatter allows for formatting a numeric value for display, using 210 : : * a variety of different formatting techniques (e.g. as scientific notation, currency values, 211 : : * percentage values, etc) 212 : : * 213 : : * This is an abstract base class and will always need to be subclassed. 214 : : * 215 : : * \since QGIS 3.12 216 : : */ 217 : 0 : class CORE_EXPORT QgsNumericFormat 218 : : { 219 : : 220 : : #ifdef SIP_RUN 221 : : SIP_CONVERT_TO_SUBCLASS_CODE 222 : : if ( dynamic_cast< QgsBearingNumericFormat * >( sipCpp ) ) 223 : : sipType = sipType_QgsBearingNumericFormat; 224 : : else if ( dynamic_cast< QgsFallbackNumericFormat * >( sipCpp ) ) 225 : : sipType = sipType_QgsFallbackNumericFormat; 226 : : else if ( dynamic_cast< QgsPercentageNumericFormat * >( sipCpp ) ) 227 : : sipType = sipType_QgsPercentageNumericFormat; 228 : : else if ( dynamic_cast< QgsScientificNumericFormat * >( sipCpp ) ) 229 : : sipType = sipType_QgsScientificNumericFormat; 230 : : else if ( dynamic_cast< QgsCurrencyNumericFormat * >( sipCpp ) ) 231 : : sipType = sipType_QgsCurrencyNumericFormat; 232 : : else if ( dynamic_cast< QgsBasicNumericFormat * >( sipCpp ) ) 233 : : sipType = sipType_QgsBasicNumericFormat; 234 : : else if ( dynamic_cast< QgsFractionNumericFormat * >( sipCpp ) ) 235 : : sipType = sipType_QgsFractionNumericFormat; 236 : : else 237 : : sipType = NULL; 238 : : SIP_END 239 : : #endif 240 : : 241 : : public: 242 : : 243 : : /** 244 : : * Default constructor 245 : : */ 246 : 48 : QgsNumericFormat() = default; 247 : : 248 : 46 : virtual ~QgsNumericFormat() = default; 249 : : 250 : : /** 251 : : * Returns a unique id for this numeric format. 252 : : * 253 : : * This id is used to identify this numeric format in the registry with QgsNumericFormatRegistry::format(). 254 : : */ 255 : : virtual QString id() const = 0; 256 : : 257 : : /** 258 : : * Returns the translated, user-visible name for this format. 259 : : */ 260 : : virtual QString visibleName() const = 0; 261 : : 262 : : /** 263 : : * Returns a sorting key value, where formats with a lower sort key will be shown earlier in lists. 264 : : * 265 : : * Generally, subclasses should return QgsNumericFormat::sortKey() as their sorting key. 266 : : */ 267 : : virtual int sortKey(); 268 : : 269 : : /** 270 : : * Returns a suggested sample value which nicely represents the current format configuration. 271 : : */ 272 : : virtual double suggestSampleValue() const; 273 : : 274 : : /** 275 : : * Returns a formatted string representation of a numeric double value. 276 : : */ 277 : : virtual QString formatDouble( double value, const QgsNumericFormatContext &context ) const = 0; 278 : : 279 : : /** 280 : : * Clones the format, returning a new object. 281 : : * 282 : : * The caller takes ownership of the returned object. 283 : : */ 284 : : virtual QgsNumericFormat *clone() const = 0 SIP_FACTORY; 285 : : 286 : : /** 287 : : * Creates a new copy of the format, using the supplied \a configuration. 288 : : * 289 : : * The caller takes ownership of the returned object. 290 : : */ 291 : : virtual QgsNumericFormat *create( const QVariantMap &configuration, const QgsReadWriteContext &context ) const = 0 SIP_FACTORY; 292 : : 293 : : /** 294 : : * Returns the current configuration of the formatter. This value can be used in a call to create() 295 : : * in order to recreate this formatter in its current state. 296 : : */ 297 : : virtual QVariantMap configuration( const QgsReadWriteContext &context ) const = 0; 298 : : 299 : : /** 300 : : * Writes the format to an XML \a element. 301 : : * \see QgsNumericFormatRegistry::createFromXml() 302 : : */ 303 : : void writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const; 304 : : 305 : : bool operator==( const QgsNumericFormat &other ) const; 306 : : bool operator!=( const QgsNumericFormat &other ) const; 307 : : 308 : : }; 309 : : 310 : : #endif // QGSNUMERICFORMAT_H