22 #include "qgssettings.h" 
   25 #include <QColorDialog> 
   26 #include <QHeaderView> 
   27 #include <QInputDialog> 
   29 #include <QTableWidget> 
   33 #include <qwt_global.h> 
   34 #include <qwt_plot_canvas.h> 
   36 #include <qwt_plot_curve.h> 
   37 #include <qwt_plot_grid.h> 
   38 #include <qwt_plot_marker.h> 
   39 #include <qwt_plot_picker.h> 
   40 #include <qwt_picker_machine.h> 
   41 #include <qwt_plot_layout.h> 
   42 #include <qwt_symbol.h> 
   43 #include <qwt_legend.h> 
   48   , mCurrentPlotColorComponent( -1 )
 
   49   , mCurrentPlotMarkerIndex( 0 )
 
   53   connect( cboType, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsGradientColorRampDialog::cboType_currentIndexChanged );
 
   54   connect( btnInformation, &QPushButton::pressed, 
this, &QgsGradientColorRampDialog::btnInformation_pressed );
 
   55   connect( mPositionSpinBox, 
static_cast < void ( QDoubleSpinBox::* )( 
double ) 
> ( &QDoubleSpinBox::valueChanged ), 
this, &QgsGradientColorRampDialog::mPositionSpinBox_valueChanged );
 
   56   connect( mPlotHueCheckbox, &QCheckBox::toggled, 
this, &QgsGradientColorRampDialog::mPlotHueCheckbox_toggled );
 
   57   connect( mPlotLightnessCheckbox, &QCheckBox::toggled, 
this, &QgsGradientColorRampDialog::mPlotLightnessCheckbox_toggled );
 
   58   connect( mPlotSaturationCheckbox, &QCheckBox::toggled, 
this, &QgsGradientColorRampDialog::mPlotSaturationCheckbox_toggled );
 
   59   connect( mPlotAlphaCheckbox, &QCheckBox::toggled, 
this, &QgsGradientColorRampDialog::mPlotAlphaCheckbox_toggled );
 
   61   setWindowModality( Qt::WindowModal );
 
   64   mPositionSpinBox->setShowClearButton( 
false );
 
   65   btnColor1->setAllowOpacity( 
true );
 
   66   btnColor1->setColorDialogTitle( tr( 
"Select Ramp Color" ) );
 
   67   btnColor1->setContext( QStringLiteral( 
"symbology" ) );
 
   68   btnColor1->setShowNoColor( 
true );
 
   69   btnColor1->setNoColorString( tr( 
"Transparent" ) );
 
   70   btnColor2->setAllowOpacity( 
true );
 
   71   btnColor2->setColorDialogTitle( tr( 
"Select Ramp Color" ) );
 
   72   btnColor2->setContext( QStringLiteral( 
"symbology" ) );
 
   73   btnColor2->setShowNoColor( 
true );
 
   74   btnColor2->setNoColorString( tr( 
"Transparent" ) );
 
   80   cboType->blockSignals( 
true );
 
   81   cboType->addItem( tr( 
"Discrete" ) );
 
   82   cboType->addItem( tr( 
"Continuous" ) );
 
   84     cboType->setCurrentIndex( 0 );
 
   86     cboType->setCurrentIndex( 1 );
 
   87   cboType->blockSignals( 
false );
 
   89   if ( mRamp.
info().isEmpty() )
 
   90     btnInformation->setEnabled( 
false );
 
   92   mStopEditor->setGradientRamp( mRamp );
 
   99   mPlot->setFrameStyle( QFrame::NoFrame );
 
  100   QFrame *plotCanvasFrame = 
dynamic_cast<QFrame *
>( mPlot->canvas() );
 
  101   if ( plotCanvasFrame )
 
  102     plotCanvasFrame->setFrameStyle( QFrame::NoFrame );
 
  104   mPlot->setAxisScale( QwtPlot::yLeft, 0.0, 1.0 );
 
  105   mPlot->enableAxis( QwtPlot::yLeft, 
false );
 
  108   QwtPlotGrid *grid = 
new QwtPlotGrid();
 
  109   QwtScaleDiv gridDiv( 0.0, 1.0, QList<double>(), QList<double>(), QList<double>() << 0.2 << 0.4 << 0.6 << 0.8 );
 
  110   grid->setXDiv( gridDiv );
 
  111   grid->setYDiv( gridDiv );
 
  112   grid->setPen( QPen( QColor( 0, 0, 0, 50 ) ) );
 
  113   grid->attach( mPlot );
 
  115   mLightnessCurve = 
new QwtPlotCurve();
 
  116   mLightnessCurve->setTitle( tr( 
"Lightness" ) );
 
  117   mLightnessCurve->setPen( QPen( QColor( 70, 150, 255 ), 0.0 ) ),
 
  118                   mLightnessCurve->setRenderHint( QwtPlotItem::RenderAntialiased, 
true );
 
  119   mLightnessCurve->attach( mPlot );
 
  121   mHueCurve = 
new QwtPlotCurve();
 
  122   mHueCurve->setTitle( tr( 
"Hue" ) );
 
  123   mHueCurve->setPen( QPen( QColor( 255, 215, 70 ), 0.0 ) ),
 
  124             mHueCurve->setRenderHint( QwtPlotItem::RenderAntialiased, 
true );
 
  125   mHueCurve->attach( mPlot );
 
  127   mSaturationCurve = 
new QwtPlotCurve();
 
  128   mSaturationCurve->setTitle( tr( 
"Saturation" ) );
 
  129   mSaturationCurve->setPen( QPen( QColor( 255, 70, 150 ), 0.0 ) ),
 
  130                    mSaturationCurve->setRenderHint( QwtPlotItem::RenderAntialiased, 
true );
 
  131   mSaturationCurve->attach( mPlot );
 
  133   mAlphaCurve = 
new QwtPlotCurve();
 
  134   mAlphaCurve->setTitle( tr( 
"Opacity" ) );
 
  135   mAlphaCurve->setPen( QPen( QColor( 50, 50, 50 ), 0.0 ) ),
 
  136               mAlphaCurve->setRenderHint( QwtPlotItem::RenderAntialiased, 
true );
 
  137   mAlphaCurve->attach( mPlot );
 
  139   mPlotFilter = 
new QgsGradientPlotEventFilter( mPlot );
 
  140   connect( mPlotFilter, &QgsGradientPlotEventFilter::mousePress, 
this, &QgsGradientColorRampDialog::plotMousePress );
 
  141   connect( mPlotFilter, &QgsGradientPlotEventFilter::mouseRelease, 
this, &QgsGradientColorRampDialog::plotMouseRelease );
 
  142   connect( mPlotFilter, &QgsGradientPlotEventFilter::mouseMove, 
this, &QgsGradientColorRampDialog::plotMouseMove );
 
  144   QgsSettings settings;
 
  145   mPlotHueCheckbox->setChecked( settings.value( QStringLiteral( 
"GradientEditor/plotHue" ), 
false ).toBool() );
 
  146   mPlotLightnessCheckbox->setChecked( settings.value( QStringLiteral( 
"GradientEditor/plotLightness" ), 
true ).toBool() );
 
  147   mPlotSaturationCheckbox->setChecked( settings.value( QStringLiteral( 
"GradientEditor/plotSaturation" ), 
false ).toBool() );
 
  148   mPlotAlphaCheckbox->setChecked( settings.value( QStringLiteral( 
"GradientEditor/plotAlpha" ), 
false ).toBool() );
 
  150   mHueCurve->setVisible( mPlotHueCheckbox->isChecked() );
 
  151   mLightnessCurve->setVisible( mPlotLightnessCheckbox->isChecked() );
 
  152   mSaturationCurve->setVisible( mPlotSaturationCheckbox->isChecked() );
 
  153   mAlphaCurve->setVisible( mPlotAlphaCheckbox->isChecked() );
 
  156   mStopEditor->selectStop( 0 );
 
  158   connect( mButtonBox, &QDialogButtonBox::helpRequested, 
this, &QgsGradientColorRampDialog::showHelp );
 
  163   QgsSettings settings;
 
  164   settings.setValue( QStringLiteral( 
"GradientEditor/plotHue" ), mPlotHueCheckbox->isChecked() );
 
  165   settings.setValue( QStringLiteral( 
"GradientEditor/plotLightness" ), mPlotLightnessCheckbox->isChecked() );
 
  166   settings.setValue( QStringLiteral( 
"GradientEditor/plotSaturation" ), mPlotSaturationCheckbox->isChecked() );
 
  167   settings.setValue( QStringLiteral( 
"GradientEditor/plotAlpha" ), mPlotAlphaCheckbox->isChecked() );
 
  175   updateColorButtons();
 
  187 void QgsGradientColorRampDialog::cboType_currentIndexChanged( 
int index )
 
  193   updateColorButtons();
 
  200 void QgsGradientColorRampDialog::btnInformation_pressed()
 
  202   if ( mRamp.
info().isEmpty() )
 
  206   QLabel *label = 
nullptr;
 
  209   QTableWidget *tableInfo = 
new QTableWidget( dlg );
 
  210   tableInfo->verticalHeader()->hide();
 
  211   tableInfo->horizontalHeader()->hide();
 
  212   tableInfo->setRowCount( mRamp.
info().count() );
 
  213   tableInfo->setColumnCount( 2 );
 
  216   for ( QgsStringMap::const_iterator it = rampInfo.constBegin();
 
  217         it != rampInfo.constEnd(); ++it )
 
  219     if ( it.key().startsWith( QLatin1String( 
"cpt-city" ) ) )
 
  221     tableInfo->setItem( i, 0, 
new QTableWidgetItem( it.key() ) );
 
  222     tableInfo->setItem( i, 1, 
new QTableWidgetItem( it.value() ) );
 
  223     tableInfo->resizeRowToContents( i );
 
  226   tableInfo->resizeColumnToContents( 0 );
 
  227   tableInfo->horizontalHeader()->setStretchLastSection( 
true );
 
  228   tableInfo->setRowCount( i );
 
  229   tableInfo->setFixedHeight( tableInfo->rowHeight( 0 ) * i + 5 );
 
  230   dlg->
layout()->addWidget( tableInfo );
 
  231   dlg->resize( 600, 250 );
 
  233   dlg->
layout()->addSpacing( 5 );
 
  236   QString gradientFile = mRamp.
info().value( QStringLiteral( 
"cpt-city-gradient" ) );
 
  237   if ( ! gradientFile.isNull() )
 
  239     QString fileName = gradientFile;
 
  241     if ( ! QFile::exists( fileName ) )
 
  243       fileName = gradientFile;
 
  244       fileName.replace( QLatin1String( 
"<cpt-city>" ), QLatin1String( 
"http://soliton.vm.bytemark.co.uk/pub/cpt-city" ) );
 
  246     label = 
new QLabel( tr( 
"Gradient file : %1" ).arg( fileName ), dlg );
 
  247     label->setTextInteractionFlags( Qt::TextBrowserInteraction );
 
  248     dlg->
layout()->addSpacing( 5 );
 
  249     dlg->
layout()->addWidget( label );
 
  253   QString licenseFile = mRamp.
info().value( QStringLiteral( 
"cpt-city-license" ) );
 
  254   if ( !licenseFile.isNull() )
 
  256     QString fileName = licenseFile;
 
  258     if ( ! QFile::exists( fileName ) )
 
  260       fileName = licenseFile;
 
  261       fileName.replace( QLatin1String( 
"<cpt-city>" ), QLatin1String( 
"http://soliton.vm.bytemark.co.uk/pub/cpt-city" ) );
 
  263     label = 
new QLabel( tr( 
"License file : %1" ).arg( fileName ), dlg );
 
  264     label->setTextInteractionFlags( Qt::TextBrowserInteraction );
 
  265     dlg->
layout()->addSpacing( 5 );
 
  266     dlg->
layout()->addWidget( label );
 
  267     if ( QFile::exists( fileName ) )
 
  269       QTextEdit *textEdit = 
new QTextEdit( dlg );
 
  270       textEdit->setReadOnly( 
true );
 
  271       QFile file( fileName );
 
  272       if ( file.open( QIODevice::ReadOnly | QIODevice::Text ) )
 
  274         textEdit->setText( file.readAll() );
 
  276         dlg->
layout()->addSpacing( 5 );
 
  277         dlg->
layout()->addWidget( textEdit );
 
  278         dlg->resize( 600, 500 );
 
  286 void QgsGradientColorRampDialog::updateColorButtons()
 
  288   btnColor1->blockSignals( 
true );
 
  289   btnColor1->setColor( mRamp.
color1() );
 
  290   btnColor1->blockSignals( 
false );
 
  291   btnColor2->blockSignals( 
true );
 
  292   btnColor2->setColor( mRamp.
color2() );
 
  293   btnColor2->blockSignals( 
false );
 
  296 void QgsGradientColorRampDialog::updateStopEditor()
 
  298   mStopEditor->blockSignals( 
true );
 
  299   mStopEditor->setGradientRamp( mRamp );
 
  300   mStopEditor->blockSignals( 
false );
 
  303 void QgsGradientColorRampDialog::selectedStopChanged( 
const QgsGradientStop &stop )
 
  305   mColorWidget->blockSignals( 
true );
 
  306   mColorWidget->setColor( stop.
color );
 
  307   mColorWidget->blockSignals( 
false );
 
  308   mPositionSpinBox->blockSignals( 
true );
 
  309   mPositionSpinBox->setValue( stop.
offset * 100 );
 
  310   mPositionSpinBox->blockSignals( 
false );
 
  315     mPositionSpinBox->setDisabled( 
true );
 
  316     mDeleteStopButton->setDisabled( 
true );
 
  320     mPositionSpinBox->setDisabled( 
false );
 
  321     mDeleteStopButton->setDisabled( 
false );
 
  327 void QgsGradientColorRampDialog::colorWidgetChanged( 
const QColor &color )
 
  329   mStopEditor->setSelectedStopColor( color );
 
  332 void QgsGradientColorRampDialog::mPositionSpinBox_valueChanged( 
double val )
 
  334   mStopEditor->setSelectedStopOffset( val / 100.0 );
 
  337 void QgsGradientColorRampDialog::mPlotHueCheckbox_toggled( 
bool checked )
 
  339   mHueCurve->setVisible( checked );
 
  343 void QgsGradientColorRampDialog::mPlotLightnessCheckbox_toggled( 
bool checked )
 
  345   mLightnessCurve->setVisible( checked );
 
  349 void QgsGradientColorRampDialog::mPlotSaturationCheckbox_toggled( 
bool checked )
 
  351   mSaturationCurve->setVisible( checked );
 
  355 void QgsGradientColorRampDialog::mPlotAlphaCheckbox_toggled( 
bool checked )
 
  357   mAlphaCurve->setVisible( checked );
 
  361 void QgsGradientColorRampDialog::plotMousePress( QPointF point )
 
  366   mCurrentPlotColorComponent = -1;
 
  367   mCurrentPlotMarkerIndex = -1;
 
  370   for ( 
int i = 0; i < mRamp.
count(); ++i )
 
  373     double currentOff = 0.0;
 
  377       currentCol = mRamp.
color1();
 
  379     else if ( i == mRamp.
count() - 1 )
 
  382       currentCol = mRamp.
color2();
 
  386       currentOff = mRamp.
stops().at( i - 1 ).offset;
 
  387       currentCol = mRamp.
stops().at( i - 1 ).color;
 
  391     if ( mPlotHueCheckbox->isChecked() )
 
  393       currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.hslHueF(), 2.0 );
 
  394       if ( currentDist < minDist )
 
  396         minDist = currentDist;
 
  397         mCurrentPlotColorComponent = 0;
 
  398         mCurrentPlotMarkerIndex = i;
 
  401     if ( mPlotLightnessCheckbox->isChecked() )
 
  403       currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.lightnessF(), 2.0 );
 
  404       if ( currentDist < minDist )
 
  406         minDist = currentDist;
 
  407         mCurrentPlotColorComponent = 1;
 
  408         mCurrentPlotMarkerIndex = i;
 
  411     if ( mPlotSaturationCheckbox->isChecked() )
 
  413       currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.hslSaturationF(), 2.0 );
 
  414       if ( currentDist < minDist )
 
  416         minDist = currentDist;
 
  417         mCurrentPlotColorComponent = 2;
 
  418         mCurrentPlotMarkerIndex = i;
 
  421     if ( mPlotAlphaCheckbox->isChecked() )
 
  423       currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.alphaF(), 2.0 );
 
  424       if ( currentDist < minDist )
 
  426         minDist = currentDist;
 
  427         mCurrentPlotColorComponent = 3;
 
  428         mCurrentPlotMarkerIndex = i;
 
  434   if ( mCurrentPlotMarkerIndex >= 0 )
 
  435     mStopEditor->selectStop( mCurrentPlotMarkerIndex );
 
  438 void QgsGradientColorRampDialog::plotMouseRelease( QPointF )
 
  440   mCurrentPlotColorComponent = -1;
 
  443 void QgsGradientColorRampDialog::plotMouseMove( QPointF point )
 
  445   QColor newColor = mStopEditor->selectedStop().color;
 
  447   if ( mCurrentPlotColorComponent == 0 )
 
  448     newColor = QColor::fromHslF( std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ), newColor.hslSaturationF(), newColor.lightnessF(), newColor.alphaF() );
 
  449   else if ( mCurrentPlotColorComponent == 1 )
 
  450     newColor = QColor::fromHslF( newColor.hslHueF(), newColor.hslSaturationF(), std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ), newColor.alphaF() );
 
  451   else if ( mCurrentPlotColorComponent == 2 )
 
  452     newColor = QColor::fromHslF( newColor.hslHueF(), std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ), newColor.lightnessF(), newColor.alphaF() );
 
  453   else if ( mCurrentPlotColorComponent == 3 )
 
  454     newColor = QColor::fromHslF( newColor.hslHueF(), newColor.hslSaturationF(), newColor.lightnessF(), std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ) );
 
  456   mStopEditor->setSelectedStopDetails( newColor, std::clamp( point.x(), qreal( 0.0 ), qreal( 1.0 ) ) );
 
  459 bool byX( QPointF p1, QPointF p2 )
 
  461   return p1.x() < p2.x();
 
  464 void QgsGradientColorRampDialog::addPlotMarker( 
double x, 
double y, 
const QColor &color, 
bool isSelected )
 
  466   QColor borderColor = color.darker( 200 );
 
  467   borderColor.setAlpha( 255 );
 
  469   QColor brushColor = color;
 
  470   brushColor.setAlpha( 255 );
 
  472   QwtPlotMarker *marker = 
new QwtPlotMarker();
 
  473   marker->setSymbol( 
new QwtSymbol( QwtSymbol::Ellipse,  QBrush( brushColor ), QPen( borderColor, isSelected ? 2 : 1 ), QSize( 8, 8 ) ) );
 
  474   marker->setValue( x, y );
 
  475   marker->attach( mPlot );
 
  476   marker->setRenderHint( QwtPlotItem::RenderAntialiased, 
true );
 
  480 void QgsGradientColorRampDialog::addMarkersForColor( 
double x, 
const QColor &color, 
bool isSelected )
 
  482   if ( mPlotHueCheckbox->isChecked() )
 
  483     addPlotMarker( x, color.hslHueF(), color, isSelected && mCurrentPlotColorComponent == 0 );
 
  484   if ( mPlotLightnessCheckbox->isChecked() )
 
  485     addPlotMarker( x, color.lightnessF(), color, isSelected && mCurrentPlotColorComponent == 1 );
 
  486   if ( mPlotSaturationCheckbox->isChecked() )
 
  487     addPlotMarker( x, color.hslSaturationF(), color, isSelected && mCurrentPlotColorComponent == 2 );
 
  488   if ( mPlotAlphaCheckbox->isChecked() )
 
  489     addPlotMarker( x, color.alphaF(), color, isSelected && mCurrentPlotColorComponent == 3 );
 
  492 void QgsGradientColorRampDialog::updatePlot()
 
  495   const auto constMMarkers = mMarkers;
 
  496   for ( QwtPlotMarker *marker : constMMarkers )
 
  503   QPolygonF lightnessPoints;
 
  505   QPolygonF saturationPoints;
 
  506   QPolygonF alphaPoints;
 
  507   lightnessPoints << QPointF( 0.0, mRamp.
color1().lightnessF() );
 
  508   huePoints << QPointF( 0.0, mRamp.
color1().hslHueF() );
 
  509   saturationPoints << QPointF( 0.0, mRamp.
color1().hslSaturationF() );
 
  510   alphaPoints << QPointF( 0.0, mRamp.
color1().alphaF() );
 
  511   addMarkersForColor( 0, mRamp.
color1(), mCurrentPlotMarkerIndex == 0 );
 
  514   const auto constStops = mRamp.
stops();
 
  517     lightnessPoints << QPointF( stop.
offset, stop.
color.lightnessF() );
 
  518     huePoints << QPointF( stop.
offset, stop.
color.hslHueF() );
 
  519     saturationPoints << QPointF( stop.
offset, stop.
color.hslSaturationF() );
 
  520     alphaPoints << QPointF( stop.
offset, stop.
color.alphaF() );
 
  522     addMarkersForColor( stop.
offset, stop.
color, mCurrentPlotMarkerIndex == i );
 
  527   for ( 
double p = 0.001; p < 1.0; p += 0.001 )
 
  529     QColor 
c = mRamp.
color( p );
 
  530     lightnessPoints << QPointF( p, 
c.lightnessF() );
 
  531     huePoints << QPointF( p, 
c.hslHueF() );
 
  532     saturationPoints << QPointF( p, 
c.hslSaturationF() );
 
  533     alphaPoints << QPointF( p, 
c.alphaF() );
 
  536   lightnessPoints << QPointF( 1.0, mRamp.
color2().lightnessF() );
 
  537   huePoints << QPointF( 1.0, mRamp.
color2().hslHueF() );
 
  538   saturationPoints << QPointF( 1.0, mRamp.
color2().hslSaturationF() );
 
  539   alphaPoints << QPointF( 1.0, mRamp.
color2().alphaF() );
 
  540   addMarkersForColor( 1.0, mRamp.
color2(), mCurrentPlotMarkerIndex == i );
 
  542   std::sort( lightnessPoints.begin(), lightnessPoints.end(), 
byX );
 
  543   std::sort( huePoints.begin(), huePoints.end(), 
byX );
 
  544   std::sort( saturationPoints.begin(), saturationPoints.end(), 
byX );
 
  545   std::sort( alphaPoints.begin(), alphaPoints.end(), 
byX );
 
  547   mLightnessCurve->setSamples( lightnessPoints );
 
  548   mHueCurve->setSamples( huePoints );
 
  549   mSaturationCurve->setSamples( saturationPoints );
 
  550   mAlphaCurve->setSamples( alphaPoints );
 
  554 void QgsGradientColorRampDialog::updateRampFromStopEditor()
 
  556   mRamp = mStopEditor->gradientRamp();
 
  557   mPositionSpinBox->blockSignals( 
true );
 
  558   mPositionSpinBox->setValue( mStopEditor->selectedStop().offset * 100 );
 
  559   mPositionSpinBox->blockSignals( 
false );
 
  560   mColorWidget->blockSignals( 
true );
 
  561   mColorWidget->setColor( mStopEditor->selectedStop().color );
 
  562   mColorWidget->blockSignals( 
false );
 
  564   updateColorButtons();
 
  572   mStopEditor->setColor1( color );
 
  573   updateColorButtons();
 
  578   mStopEditor->setColor2( color );
 
  579   updateColorButtons();
 
  582 void QgsGradientColorRampDialog::showHelp()
 
  584   QgsHelp::openHelp( QStringLiteral( 
"style_library/style_manager.html#setting-a-color-ramp" ) );
 
  590 QgsGradientPlotEventFilter::QgsGradientPlotEventFilter( QwtPlot *plot )
 
  594   mPlot->canvas()->installEventFilter( 
this );
 
  597 bool QgsGradientPlotEventFilter::eventFilter( QObject *
object, QEvent *event )
 
  599   if ( !mPlot->isEnabled() )
 
  600     return QObject::eventFilter( 
object, event );
 
  602   switch ( event->type() )
 
  604     case QEvent::MouseButtonPress:
 
  606       const QMouseEvent *mouseEvent = 
static_cast<QMouseEvent * 
>( event );
 
  607       if ( mouseEvent->button() == Qt::LeftButton )
 
  609         emit mousePress( mapPoint( mouseEvent->pos() ) );
 
  613     case QEvent::MouseMove:
 
  615       const QMouseEvent *mouseEvent = 
static_cast<QMouseEvent * 
>( event );
 
  616       if ( mouseEvent->buttons() & Qt::LeftButton )
 
  619         emit mouseMove( mapPoint( mouseEvent->pos() ) );
 
  623     case QEvent::MouseButtonRelease:
 
  625       const QMouseEvent *mouseEvent = 
static_cast<QMouseEvent * 
>( event );
 
  626       if ( mouseEvent->button() == Qt::LeftButton )
 
  628         emit mouseRelease( mapPoint( mouseEvent->pos() ) );
 
  636   return QObject::eventFilter( 
object, event );
 
  639 QPointF QgsGradientPlotEventFilter::mapPoint( QPointF point )
 const 
  644   return QPointF( mPlot->canvasMap( QwtPlot::xBottom ).invTransform( point.x() ),
 
  645                   mPlot->canvasMap( QwtPlot::yLeft ).invTransform( point.y() ) );
 
static QString defaultBaseDir()
A generic dialog with layout and button box.
QVBoxLayout * layout()
Returns the central layout. Widgets added to it must have this dialog as parent.
~QgsGradientColorRampDialog() override
QDialogButtonBox * buttonBox() const
Returns a reference to the dialog's button box.
void setColor2(const QColor &color)
Sets the end color for the gradient ramp.
QgsGradientColorRamp ramp
void setRamp(const QgsGradientColorRamp &ramp)
Sets the color ramp to show in the dialog.
QgsGradientColorRampDialog(const QgsGradientColorRamp &ramp, QWidget *parent=nullptr)
Constructor for QgsGradientColorRampDialog.
void setColor1(const QColor &color)
Sets the start color for the gradient ramp.
void changed()
Emitted when the dialog settings change.
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
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)
void convertToDiscrete(bool discrete)
Converts a gradient with existing color stops to or from discrete interpolation.
QColor color(double value) const override
Returns the color corresponding to a specified value.
QColor color1() const
Returns the gradient start color.
QgsGradientStopsList stops() const
Returns the list of intermediate gradient stops for the ramp.
QColor color2() const
Returns the gradient end color.
void changed()
Emitted when the gradient ramp is changed by a user.
void deleteSelectedStop()
Deletes the current selected stop.
void selectedStopChanged(const QgsGradientStop &stop)
Emitted when the current selected stop changes.
Represents a color stop within a QgsGradientColorRamp color ramp.
double offset
Relative positional offset, between 0 and 1.
QColor color
Gradient color at stop.
static QgsGui * instance()
Returns a pointer to the singleton instance.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QMap< QString, QString > QgsStringMap
bool byX(QPointF p1, QPointF p2)