QGIS API Documentation
qgscolorrampcombobox.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgscolorrampcombobox.cpp
3  ---------------------
4  begin : October 2010
5  copyright : (C) 2010 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 #include "qgscolorrampcombobox.h"
16 
17 #include "qgssymbollayerv2utils.h"
18 #include "qgsvectorcolorrampv2.h"
19 #include "qgsstylev2.h"
21 
26 
28 
30  QComboBox( parent ), mStyle( nullptr ), mSourceColorRamp( nullptr ), mShowGradientOnly( false )
31 {
32 }
33 
35 {
36  delete mSourceColorRamp;
37 }
38 
40 {
41  if ( count() != 0 )
42  return; // already populated!
43 
44  mStyle = style;
45 
47 
48  QStringList rampNames = mStyle->colorRampNames();
49  for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it )
50  {
51  QgsVectorColorRampV2* ramp = style->colorRamp( *it );
52 
53  if ( !mShowGradientOnly || ramp->type() == "gradient" )
54  {
56 
57  addItem( icon, *it );
58  }
59  delete ramp;
60  }
61 
62  if ( !mShowGradientOnly )
63  addItem( tr( "Random colors" ) );
64  addItem( tr( "New color ramp..." ) );
65  connect( this, SIGNAL( activated( int ) ), SLOT( colorRampChanged( int ) ) );
66 }
67 
69 {
70  QString rampName = currentText();
71 
72  if ( rampName == tr( "Random colors" ) )
73  {
74  return new QgsRandomColorsV2();
75  }
76  else if ( rampName == "[source]" && mSourceColorRamp )
77  return mSourceColorRamp->clone();
78  else
79  return mStyle->colorRamp( rampName );
80 }
81 
83 {
84  int index = currentIndex();
85  return index == count() - 1; //create new ramp is last item in combobox
86 }
87 
89 {
90  delete mSourceColorRamp;
91  mSourceColorRamp = sourceRamp->clone();
92 
94  if ( itemText( 0 ) == "[source]" )
95  setItemIcon( 0, icon );
96  else
97  insertItem( 0, icon, "[source]" );
98  setCurrentIndex( 0 );
99 }
100 
102 {
103  if ( index != count() - 1 )
104  return;
105 
106  // last item: "new color ramp..."
107  QString rampName;
108  if ( !mShowGradientOnly )
109  {
111  }
112  else
113  {
114  rampName = QgsStyleV2ManagerDialog::addColorRampStatic( this, mStyle, "Gradient" );
115  }
116  if ( rampName.isEmpty() )
117  return;
118 
119  // put newly added ramp into the combo
120  QgsVectorColorRampV2* ramp = mStyle->colorRamp( rampName );
122 
123  blockSignals( true ); // avoid calling this method again!
124  insertItem( index, icon, rampName );
125  blockSignals( false );
126 
127  delete ramp;
128 
129  // ... and set it as active
130  setCurrentIndex( index );
131 
132  // make sure the color ramp is stored
133  mStyle->save();
134 }
135 
137 {
138  QgsVectorColorRampV2* currentRamp = currentColorRamp();
139  if ( !currentRamp )
140  return;
141 
142  QScopedPointer<QgsVectorColorRampV2> newRamp( currentRamp->clone() );
143 
144  if ( newRamp->type() == "gradient" )
145  {
146  QgsVectorGradientColorRampV2* gradRamp = static_cast<QgsVectorGradientColorRampV2*>( newRamp.data() );
147  QgsVectorGradientColorRampV2Dialog dlg( gradRamp, this );
148  if ( dlg.exec() && gradRamp )
149  {
150  setSourceColorRamp( gradRamp );
151  emit sourceRampEdited();
152  }
153  }
154  else if ( newRamp->type() == "random" )
155  {
156  QgsVectorRandomColorRampV2* randRamp = static_cast<QgsVectorRandomColorRampV2*>( newRamp.data() );
157  QgsVectorRandomColorRampV2Dialog dlg( randRamp, this );
158  if ( dlg.exec() )
159  {
160  setSourceColorRamp( randRamp );
161  emit sourceRampEdited();
162  }
163  }
164  else if ( newRamp->type() == "colorbrewer" )
165  {
166  QgsVectorColorBrewerColorRampV2* brewerRamp = static_cast<QgsVectorColorBrewerColorRampV2*>( newRamp.data() );
167  QgsVectorColorBrewerColorRampV2Dialog dlg( brewerRamp, this );
168  if ( dlg.exec() )
169  {
170  setSourceColorRamp( brewerRamp );
171  emit sourceRampEdited();
172  }
173  }
174  else if ( newRamp->type() == "cpt-city" )
175  {
176  QgsCptCityColorRampV2* cptCityRamp = static_cast<QgsCptCityColorRampV2*>( newRamp.data() );
177  QgsCptCityColorRampV2Dialog dlg( cptCityRamp, this );
178  if ( dlg.exec() && cptCityRamp )
179  {
180  setSourceColorRamp( cptCityRamp );
181  emit sourceRampEdited();
182  }
183  }
184 }
QgsVectorColorRampV2 * currentColorRamp()
return new instance of the current color ramp or NULL if there is no active color ramp ...
static unsigned index
QgsVectorColorRampV2 * colorRamp(const QString &name)
return a NEW copy of color ramp
Definition: qgsstylev2.cpp:257
QgsColorRampComboBox(QWidget *parent=nullptr)
static QIcon colorRampPreviewIcon(QgsVectorColorRampV2 *ramp, QSize size)
virtual QString type() const =0
Returns a string representing the color ramp type.
QStyle * style() const
void setIconSize(const QSize &size)
int exec()
QString itemText(int index) const
const QPixmap * icon() const
QStringList colorRampNames()
return a list of names of color ramps
Definition: qgsstylev2.cpp:273
QString tr(const char *sourceText, const char *disambiguation, int n)
void insertItem(int index, const QString &text, const QVariant &userData)
bool save(QString filename=QString())
save style into a file (will use current filename if empty string is passed)
Definition: qgsstylev2.cpp:357
void addItem(const QString &text, const QVariant &userData)
int count() const
virtual QgsVectorColorRampV2 * clone() const =0
Creates a clone of the color ramp.
bool isEmpty() const
void activated(int index)
void colorRampChanged(int index)
void editSourceRamp()
Triggers a dialog which allows users to edit the current source ramp for the combo box...
iterator end()
bool blockSignals(bool block)
Random color ramp, which returns random colors based on preset parameters.
void setSourceColorRamp(QgsVectorColorRampV2 *sourceRamp)
add/select color ramp which was used previously by the renderer
bool createNewColorRampSelected() const
Returns true if the current selection in the combo box is the option for creating a new color ramp...
QgsVectorColorRampV2 * mSourceColorRamp
void setItemIcon(int index, const QIcon &icon)
int currentIndex() const
static QString addColorRampStatic(QWidget *parent, QgsStyleV2 *style, QString RampType=QString())
open add color ramp dialog, return color ramp&#39;s name if the ramp has been added
QString currentText() const
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Abstract base class for color ramps.
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
void sourceRampEdited()
Emitted when the user has edited the current source ramp.
iterator begin()
void populate(QgsStyleV2 *style)
initialize the combo box with color ramps from the style