QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
qgscolorrampimpl.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgscolorrampimpl.h
3  ---------------------
4  begin : November 2009
5  copyright : (C) 2009 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 QGSCOLORRAMPIMPL_H
17 #define QGSCOLORRAMPIMPL_H
18 
19 #include "qgis_core.h"
20 #include <QColor>
21 #include <QGradient>
22 #include "qgis.h"
23 #include "qgscolorscheme.h"
24 #include "qgscolorramp.h"
25 
26 #ifndef SIP_RUN
28 typedef QColor( *InterpolateColorFunc )( const QColor &c1, const QColor &c2, const double value, Qgis::AngularDirection direction );
30 #endif
31 
37 class CORE_EXPORT QgsGradientStop
38 {
39  public:
40 
46  QgsGradientStop( double offset, const QColor &color );
47 
49  double offset;
51  QColor color;
52 
53  bool operator==( const QgsGradientStop &other ) const
54  {
55  return other.color == color && qgsDoubleNear( other.offset, offset ) && other.mColorSpec == mColorSpec && other.mDirection == mDirection;
56  }
57 
58  bool operator!=( const QgsGradientStop &other ) const
59  {
60  return !( *this == other );
61  }
62 
72  QColor::Spec colorSpec() const { return mColorSpec; }
73 
85  void setColorSpec( QColor::Spec spec );
86 
97  Qgis::AngularDirection direction() const { return mDirection; }
98 
109  void setDirection( Qgis::AngularDirection direction ) { mDirection = direction; }
110 
111  private:
112 
113  QColor::Spec mColorSpec = QColor::Spec::Rgb;
115  InterpolateColorFunc mFunc = nullptr;
116 
117  friend class QgsGradientColorRamp;
118 };
119 
121 typedef QList<QgsGradientStop> QgsGradientStopsList;
122 
123 // these are the QGIS branding colors, exaggerated a bit to make a default ramp with greater color variation
124 // then the official QGIS color gradient!
125 #define DEFAULT_GRADIENT_COLOR1 QColor(69, 116, 40)
126 #define DEFAULT_GRADIENT_COLOR2 QColor(188, 220, 60)
127 
134 class CORE_EXPORT QgsGradientColorRamp : public QgsColorRamp
135 {
136  public:
137 
146  QgsGradientColorRamp( const QColor &color1 = DEFAULT_GRADIENT_COLOR1,
147  const QColor &color2 = DEFAULT_GRADIENT_COLOR2,
148  bool discrete = false,
149  const QgsGradientStopsList &stops = QgsGradientStopsList() );
150 
152  static QgsColorRamp *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
153 
154  int count() const override { return mStops.count() + 2; }
155  double value( int index ) const override;
156  QColor color( double value ) const override;
157 
163  static QString typeString() { return QStringLiteral( "gradient" ); }
164 
165  QString type() const override;
166  void invert() override;
167  QgsGradientColorRamp *clone() const override SIP_FACTORY;
168  QVariantMap properties() const override;
169 
175  QColor color1() const { return mColor1; }
176 
182  QColor color2() const { return mColor2; }
183 
190  void setColor1( const QColor &color ) { mColor1 = color; }
191 
198  void setColor2( const QColor &color ) { mColor2 = color; }
199 
205  bool isDiscrete() const { return mDiscrete; }
206 
214  void setDiscrete( bool discrete ) { mDiscrete = discrete; }
215 
223  void convertToDiscrete( bool discrete );
224 
232  void setStops( const QgsGradientStopsList &stops );
233 
238  QgsGradientStopsList stops() const { return mStops; }
239 
244  QgsStringMap info() const { return mInfo; }
245 
251  void setInfo( const QgsStringMap &info ) { mInfo = info; }
252 
259  void addStopsToGradient( QGradient *gradient, double opacity = 1 ) const;
260 
270  QColor::Spec colorSpec() const { return mColorSpec; }
271 
283  void setColorSpec( QColor::Spec spec );
284 
295  Qgis::AngularDirection direction() const { return mDirection; }
296 
307  void setDirection( Qgis::AngularDirection direction ) { mDirection = direction; }
308 
309  protected:
310  QColor mColor1;
311  QColor mColor2;
312  bool mDiscrete;
315  QColor::Spec mColorSpec = QColor::Spec::Rgb;
317 
318  InterpolateColorFunc mFunc = nullptr;
319 };
320 
322 
323 #define DEFAULT_RANDOM_COUNT 10
324 #define DEFAULT_RANDOM_HUE_MIN 0
325 #define DEFAULT_RANDOM_HUE_MAX 359
326 #define DEFAULT_RANDOM_VAL_MIN 200
327 #define DEFAULT_RANDOM_VAL_MAX 240
328 #define DEFAULT_RANDOM_SAT_MIN 100
329 #define DEFAULT_RANDOM_SAT_MAX 240
330 
336 class CORE_EXPORT QgsLimitedRandomColorRamp : public QgsColorRamp
337 {
338  public:
339 
351  int hueMin = DEFAULT_RANDOM_HUE_MIN, int hueMax = DEFAULT_RANDOM_HUE_MAX,
352  int satMin = DEFAULT_RANDOM_SAT_MIN, int satMax = DEFAULT_RANDOM_SAT_MAX,
353  int valMin = DEFAULT_RANDOM_VAL_MIN, int valMax = DEFAULT_RANDOM_VAL_MAX );
354 
361  static QgsColorRamp *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
362 
363  double value( int index ) const override;
364  QColor color( double value ) const override;
365 
371  static QString typeString() { return QStringLiteral( "random" ); }
372 
373  QString type() const override;
374  QgsLimitedRandomColorRamp *clone() const override SIP_FACTORY;
375  QVariantMap properties() const override;
376  int count() const override { return mCount; }
377 
381  static QList<QColor> randomColors( int count,
382  int hueMax = DEFAULT_RANDOM_HUE_MAX, int hueMin = DEFAULT_RANDOM_HUE_MIN,
383  int satMax = DEFAULT_RANDOM_SAT_MAX, int satMin = DEFAULT_RANDOM_SAT_MIN,
384  int valMax = DEFAULT_RANDOM_VAL_MAX, int valMin = DEFAULT_RANDOM_VAL_MIN );
385 
390  void updateColors();
391 
396  int hueMin() const { return mHueMin; }
397 
402  int hueMax() const { return mHueMax; }
403 
408  int satMin() const { return mSatMin; }
409 
414  int satMax() const { return mSatMax; }
415 
420  int valMin() const { return mValMin; }
421 
426  int valMax() const { return mValMax; }
427 
431  void setCount( int val ) { mCount = val; }
432 
437  void setHueMin( int val ) { mHueMin = val; }
438 
443  void setHueMax( int val ) { mHueMax = val; }
444 
449  void setSatMin( int val ) { mSatMin = val; }
450 
455  void setSatMax( int val ) { mSatMax = val; }
456 
461  void setValMin( int val ) { mValMin = val; }
462 
467  void setValMax( int val ) { mValMax = val; }
468 
469  protected:
470  int mCount;
471  int mHueMin;
472  int mHueMax;
473  int mSatMin;
474  int mSatMax;
475  int mValMin;
476  int mValMax;
477  QList<QColor> mColors;
478 };
479 
486 class CORE_EXPORT QgsRandomColorRamp: public QgsColorRamp
487 {
488  public:
489 
493  QgsRandomColorRamp() = default;
494 
495  int count() const override;
496 
497  double value( int index ) const override;
498 
499  QColor color( double value ) const override;
500 
507  virtual void setTotalColorCount( int colorCount );
508 
514  static QString typeString() { return QStringLiteral( "randomcolors" ); }
515 
516  QString type() const override;
517 
518  QgsRandomColorRamp *clone() const override SIP_FACTORY;
519 
520  QVariantMap properties() const override;
521 
522  protected:
523 
524  int mTotalColorCount = 0;
525  QList<QColor> mPrecalculatedColors;
526 
527 };
528 
529 
535 class CORE_EXPORT QgsPresetSchemeColorRamp : public QgsColorRamp, public QgsColorScheme
536 {
537  public:
538 
543  QgsPresetSchemeColorRamp( const QList< QColor > &colors = QList< QColor >() );
544 
550 
557  static QgsColorRamp *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
558 
564  bool setColors( const QgsNamedColorList &colors, const QString & = QString(), const QColor & = QColor() ) override { mColors = colors; return true; }
565 
570  QList< QColor > colors() const;
571 
572  double value( int index ) const override;
573  QColor color( double value ) const override;
574 
580  static QString typeString() { return QStringLiteral( "preset" ); }
581 
582  QString type() const override;
583  void invert() override;
584  QgsPresetSchemeColorRamp *clone() const override SIP_FACTORY;
585  QVariantMap properties() const override;
586  int count() const override;
587 
588  QString schemeName() const override { return QStringLiteral( "preset" ); }
589  QgsNamedColorList fetchColors( const QString &context = QString(), const QColor &baseColor = QColor() ) override;
590  bool isEditable() const override { return true; }
591 
592  private:
593 
594  QgsNamedColorList mColors;
595 };
596 
597 
598 #define DEFAULT_COLORBREWER_SCHEMENAME "Spectral"
599 #define DEFAULT_COLORBREWER_COLORS 5
600 
606 class CORE_EXPORT QgsColorBrewerColorRamp : public QgsColorRamp
607 {
608  public:
609 
616  QgsColorBrewerColorRamp( const QString &schemeName = DEFAULT_COLORBREWER_SCHEMENAME,
617  int colors = DEFAULT_COLORBREWER_COLORS,
618  bool inverted = false );
619 
626  static QgsColorRamp *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
627 
628  double value( int index ) const override;
629  QColor color( double value ) const override;
630 
636  static QString typeString() { return QStringLiteral( "colorbrewer" ); }
637 
638  QString type() const override { return QgsColorBrewerColorRamp::typeString(); }
639  void invert() override;
640  QgsColorBrewerColorRamp *clone() const override SIP_FACTORY;
641  QVariantMap properties() const override;
642  int count() const override { return mColors; }
643 
648  QString schemeName() const { return mSchemeName; }
649 
654  int colors() const { return mColors; }
655 
662  void setSchemeName( const QString &schemeName ) { mSchemeName = schemeName; loadPalette(); }
663 
670  void setColors( int colors ) { mColors = colors; loadPalette(); }
671 
676  static QStringList listSchemeNames();
677 
684  static QList<int> listSchemeVariants( const QString &schemeName );
685 
686  protected:
687 
689  void loadPalette();
690 
691  QString mSchemeName;
692  int mColors;
693  QList<QColor> mPalette;
694  bool mInverted;
695 };
696 
697 
698 #define DEFAULT_CPTCITY_SCHEMENAME "cb/div/BrBG_" //change this
699 #define DEFAULT_CPTCITY_VARIANTNAME "05"
700 
705 class CORE_EXPORT QgsCptCityColorRamp : public QgsGradientColorRamp
706 {
707  public:
708 
716  QgsCptCityColorRamp( const QString &schemeName = DEFAULT_CPTCITY_SCHEMENAME,
717  const QString &variantName = DEFAULT_CPTCITY_VARIANTNAME,
718  bool inverted = false,
719  bool doLoadFile = true );
720 
729  QgsCptCityColorRamp( const QString &schemeName, const QStringList &variantList,
730  const QString &variantName = QString(), bool inverted = false,
731  bool doLoadFile = true );
732 
734  static QgsColorRamp *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
735 
741  static QString typeString() { return QStringLiteral( "cpt-city" ); }
742 
743  QString type() const override;
744 
745  void invert() override;
746 
747  QgsCptCityColorRamp *clone() const override SIP_FACTORY;
748  void copy( const QgsCptCityColorRamp *other );
749  QgsGradientColorRamp *cloneGradientRamp() const SIP_FACTORY;
750 
751  QVariantMap properties() const override;
752 
753  QString schemeName() const { return mSchemeName; }
754  QString variantName() const { return mVariantName; }
755  QStringList variantList() const { return mVariantList; }
756 
757  // lazy loading - have to call loadPalette() explicitly
758  void setSchemeName( const QString &schemeName ) { mSchemeName = schemeName; mFileLoaded = false; }
759  void setVariantName( const QString &variantName ) { mVariantName = variantName; mFileLoaded = false; }
760  void setVariantList( const QStringList &variantList ) { mVariantList = variantList; }
761  void setName( const QString &schemeName, const QString &variantName = QString(), const QStringList &variantList = QStringList() )
762  { mSchemeName = schemeName; mVariantName = variantName; mVariantList = variantList; mFileLoaded = false; }
763 
764  void loadPalette() { loadFile(); }
765  bool hasMultiStops() const { return mMultiStops; }
766 
773  static QString fileNameForVariant( const QString &schema, const QString &variant ) SIP_SKIP;
774 
775  QString fileName() const;
776  bool loadFile();
777  bool fileLoaded() const { return mFileLoaded; }
778 
779  QString copyingFileName() const;
780  QString descFileName() const;
781  QgsStringMap copyingInfo() const;
782 
783  protected:
784  QString mSchemeName;
785  QString mVariantName;
786  QStringList mVariantList;
787  bool mFileLoaded = false;
788  bool mMultiStops = false;
789  bool mInverted;
790 
791 };
792 
793 // clazy:excludeall=qstring-allocations
794 
795 #endif
AngularDirection
Angular directions.
Definition: qgis.h:2770
@ CounterClockwise
Counter-clockwise direction.
Color ramp utilising "Color Brewer" preset color schemes.
static QString typeString()
Returns the string identifier for QgsColorBrewerColorRamp.
QString type() const override
Returns a string representing the color ramp type.
QString schemeName() const
Returns the name of the color brewer color scheme.
int colors() const
Returns the number of colors in the ramp.
void setSchemeName(const QString &schemeName)
Sets the name of the color brewer color scheme.
void setColors(int colors)
Sets the number of colors in the ramp.
Abstract base class for color ramps.
Definition: qgscolorramp.h:29
Abstract base class for color schemes.
void setName(const QString &schemeName, const QString &variantName=QString(), const QStringList &variantList=QStringList())
void setSchemeName(const QString &schemeName)
void setVariantList(const QStringList &variantList)
QStringList variantList() const
void setVariantName(const QString &variantName)
static QString typeString()
Returns the string identifier for QgsCptCityColorRamp.
bool hasMultiStops() const
QString variantName() const
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
QgsGradientStopsList mStops
void setColor1(const QColor &color)
Sets the gradient start color.
void setColor2(const QColor &color)
Sets the gradient end color.
void setInfo(const QgsStringMap &info)
Sets additional info to attach to the gradient ramp (e.g., authorship notes)
bool isDiscrete() const
Returns true if the gradient is using discrete interpolation, rather than smoothly interpolating betw...
int count() const override
Returns number of defined colors, or -1 if undefined.
QgsStringMap info() const
Returns any additional info attached to the gradient ramp (e.g., authorship notes)
QColor::Spec colorSpec() const
Returns the color specification in which the color component interpolation will occur.
static QString typeString()
Returns the string identifier for QgsGradientColorRamp.
void setDirection(Qgis::AngularDirection direction)
Sets the direction to traverse the color wheel using when interpolating hue-based color specification...
Qgis::AngularDirection direction() const
Returns the direction to traverse the color wheel using when interpolating hue-based color specificat...
QgsGradientStopsList stops() const
Returns the list of intermediate gradient stops for the ramp.
void setDiscrete(bool discrete)
Sets whether the gradient should use discrete interpolation, rather than smoothly interpolating betwe...
QColor color2() const
Returns the gradient end color.
Represents a color stop within a QgsGradientColorRamp color ramp.
Qgis::AngularDirection direction() const
Returns the direction to traverse the color wheel using when interpolating hue-based color specificat...
bool operator==(const QgsGradientStop &other) const
QColor::Spec colorSpec() const
Returns the color specification in which the color component interpolation will occur.
double offset
Relative positional offset, between 0 and 1.
bool operator!=(const QgsGradientStop &other) const
void setDirection(Qgis::AngularDirection direction)
Sets the direction to traverse the color wheel using when interpolating hue-based color specification...
QColor color
Gradient color at stop.
Constrained random color ramp, which returns random colors based on preset parameters.
static QString typeString()
Returns the string identifier for QgsLimitedRandomColorRamp.
void setSatMin(int val)
Sets the minimum saturation for generated colors.
void setHueMin(int val)
Sets the minimum hue for generated colors.
void setSatMax(int val)
Sets the maximum saturation for generated colors.
int valMax() const
Returns the maximum value for generated colors.
int satMax() const
Returns the maximum saturation for generated colors.
void setHueMax(int val)
Sets the maximum hue for generated colors.
void setCount(int val)
Sets the number of colors contained in the ramp.
int hueMax() const
Returns the maximum hue for generated colors.
int hueMin() const
Returns the minimum hue for generated colors.
void setValMax(int val)
Sets the maximum value for generated colors.
int valMin() const
Returns the minimum value for generated colors.
void setValMin(int val)
Sets the minimum value for generated colors.
int satMin() const
Returns the minimum saturation for generated colors.
A scheme based color ramp consisting of a list of predefined colors.
bool setColors(const QgsNamedColorList &colors, const QString &=QString(), const QColor &=QColor()) override
Sets the list of colors used by the ramp.
static QString typeString()
Returns the string identifier for QgsPresetSchemeColorRamp.
bool isEditable() const override
Returns whether the color scheme is editable.
Totally random color ramp.
QgsRandomColorRamp()=default
Constructor for QgsRandomColorRamp.
static QString typeString()
Returns the string identifier for QgsRandomColorRamp.
QList< QPair< QColor, QString > > QgsNamedColorList
List of colors paired with a friendly display name identifying the color.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:5172
QMap< QString, QString > QgsStringMap
Definition: qgis.h:5702
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define DEFAULT_COLORBREWER_COLORS
#define DEFAULT_COLORBREWER_SCHEMENAME
#define DEFAULT_RANDOM_HUE_MAX
#define DEFAULT_CPTCITY_SCHEMENAME
#define DEFAULT_RANDOM_HUE_MIN
#define DEFAULT_RANDOM_COUNT
#define DEFAULT_RANDOM_SAT_MAX
#define DEFAULT_RANDOM_SAT_MIN
#define DEFAULT_CPTCITY_VARIANTNAME
#define DEFAULT_GRADIENT_COLOR1
#define DEFAULT_RANDOM_VAL_MIN
QList< QgsGradientStop > QgsGradientStopsList
List of gradient stops.
#define DEFAULT_GRADIENT_COLOR2
#define DEFAULT_RANDOM_VAL_MAX
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)