17#include "moc_qgsgradientcolorrampdialog.cpp"
24#include <QColorDialog>
26#include <QInputDialog>
28#include <QTableWidget>
32#include <qwt_global.h>
33#include <qwt_plot_canvas.h>
35#include <qwt_plot_curve.h>
36#include <qwt_plot_grid.h>
37#include <qwt_plot_marker.h>
38#include <qwt_plot_picker.h>
39#include <qwt_picker_machine.h>
40#include <qwt_plot_layout.h>
41#include <qwt_symbol.h>
42#include <qwt_legend.h>
43#include <qwt_scale_div.h>
44#include <qwt_scale_map.h>
49 , mCurrentPlotColorComponent( -1 )
50 , mCurrentPlotMarkerIndex( 0 )
55 mColorWidget->setColorModelEditable(
false );
57 mStopColorSpec->addItem( tr(
"RGB" ),
static_cast< int >( QColor::Spec::Rgb ) );
58 mStopColorSpec->addItem( tr(
"HSV" ),
static_cast< int >( QColor::Spec::Hsv ) );
59 mStopColorSpec->addItem( tr(
"HSL" ),
static_cast< int >( QColor::Spec::Hsl ) );
60 mStopColorSpec->addItem( tr(
"CMYK" ),
static_cast< int >( QColor::Spec::Cmyk ) );
61 mStopColorSpec->setCurrentIndex( mStopColorSpec->findData(
static_cast< int >(
ramp.
colorSpec() ) ) );
65 mStopDirection->setCurrentIndex( mStopColorSpec->findData(
static_cast< int >(
ramp.
direction() ) ) );
67 mStopDirection->setEnabled( hasDirection(
static_cast< QColor::Spec
>( mStopColorSpec->currentData().toInt() ) ) );
69 connect( mStopColorSpec,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, [ = ]
71 const QColor::Spec colorSpec =
static_cast< QColor::Spec
>( mStopColorSpec->currentData().toInt() );
72 mStopDirection->setEnabled( hasDirection( colorSpec ) );
74 if ( colorSpec != mColorWidget->color().spec() )
76 mColorWidget->setColor( mColorWidget->color().convertTo( colorSpec ) );
82 mStopEditor->setSelectedStopColorSpec( colorSpec );
85 connect( mStopDirection,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, [ = ]
90 mStopEditor->setSelectedStopDirection(
static_cast< Qgis::AngularDirection >( mStopDirection->currentData().toInt() ) );
93 connect( cboType,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsGradientColorRampDialog::cboType_currentIndexChanged );
94 connect( btnInformation, &QPushButton::pressed,
this, &QgsGradientColorRampDialog::btnInformation_pressed );
95 connect( mPositionSpinBox,
static_cast < void ( QDoubleSpinBox::* )(
double )
> ( &QDoubleSpinBox::valueChanged ),
this, &QgsGradientColorRampDialog::mPositionSpinBox_valueChanged );
96 connect( mPlotHueCheckbox, &QCheckBox::toggled,
this, &QgsGradientColorRampDialog::mPlotHueCheckbox_toggled );
97 connect( mPlotLightnessCheckbox, &QCheckBox::toggled,
this, &QgsGradientColorRampDialog::mPlotLightnessCheckbox_toggled );
98 connect( mPlotSaturationCheckbox, &QCheckBox::toggled,
this, &QgsGradientColorRampDialog::mPlotSaturationCheckbox_toggled );
99 connect( mPlotAlphaCheckbox, &QCheckBox::toggled,
this, &QgsGradientColorRampDialog::mPlotAlphaCheckbox_toggled );
101 setWindowModality( Qt::WindowModal );
104 mPositionSpinBox->setShowClearButton(
false );
105 btnColor1->setAllowOpacity(
true );
106 btnColor1->setColorDialogTitle( tr(
"Select Ramp Color" ) );
107 btnColor1->setContext( QStringLiteral(
"symbology" ) );
108 btnColor1->setShowNoColor(
true );
109 btnColor1->setNoColorString( tr(
"Transparent" ) );
110 btnColor2->setAllowOpacity(
true );
111 btnColor2->setColorDialogTitle( tr(
"Select Ramp Color" ) );
112 btnColor2->setContext( QStringLiteral(
"symbology" ) );
113 btnColor2->setShowNoColor(
true );
114 btnColor2->setNoColorString( tr(
"Transparent" ) );
115 updateColorButtons();
120 cboType->blockSignals(
true );
121 cboType->addItem( tr(
"Discrete" ) );
122 cboType->addItem( tr(
"Continuous" ) );
124 cboType->setCurrentIndex( 0 );
126 cboType->setCurrentIndex( 1 );
127 cboType->blockSignals(
false );
129 if ( mRamp.
info().isEmpty() )
130 btnInformation->setEnabled(
false );
132 mStopEditor->setGradientRamp( mRamp );
139 mPlot->setFrameStyle( QFrame::NoFrame );
140 QFrame *plotCanvasFrame =
dynamic_cast<QFrame *
>( mPlot->canvas() );
141 if ( plotCanvasFrame )
142 plotCanvasFrame->setFrameStyle( QFrame::NoFrame );
144 mPlot->setAxisScale( QwtPlot::yLeft, 0.0, 1.0 );
145 mPlot->enableAxis( QwtPlot::yLeft,
false );
148 QwtPlotGrid *grid =
new QwtPlotGrid();
149 QwtScaleDiv gridDiv( 0.0, 1.0, QList<double>(), QList<double>(), QList<double>() << 0.2 << 0.4 << 0.6 << 0.8 );
150 grid->setXDiv( gridDiv );
151 grid->setYDiv( gridDiv );
152 grid->setPen( QPen( QColor( 0, 0, 0, 50 ) ) );
153 grid->attach( mPlot );
155 mLightnessCurve =
new QwtPlotCurve();
156 mLightnessCurve->setTitle( tr(
"Lightness" ) );
157 mLightnessCurve->setPen( QPen( QColor( 70, 150, 255 ), 0.0 ) ),
158 mLightnessCurve->setRenderHint( QwtPlotItem::RenderAntialiased,
true );
159 mLightnessCurve->attach( mPlot );
161 mHueCurve =
new QwtPlotCurve();
162 mHueCurve->setTitle( tr(
"Hue" ) );
163 mHueCurve->setPen( QPen( QColor( 255, 215, 70 ), 0.0 ) ),
164 mHueCurve->setRenderHint( QwtPlotItem::RenderAntialiased,
true );
165 mHueCurve->attach( mPlot );
167 mSaturationCurve =
new QwtPlotCurve();
168 mSaturationCurve->setTitle( tr(
"Saturation" ) );
169 mSaturationCurve->setPen( QPen( QColor( 255, 70, 150 ), 0.0 ) ),
170 mSaturationCurve->setRenderHint( QwtPlotItem::RenderAntialiased,
true );
171 mSaturationCurve->attach( mPlot );
173 mAlphaCurve =
new QwtPlotCurve();
174 mAlphaCurve->setTitle( tr(
"Opacity" ) );
175 mAlphaCurve->setPen( QPen( QColor( 50, 50, 50 ), 0.0 ) ),
176 mAlphaCurve->setRenderHint( QwtPlotItem::RenderAntialiased,
true );
177 mAlphaCurve->attach( mPlot );
179 mPlotFilter =
new QgsGradientPlotEventFilter( mPlot );
180 connect( mPlotFilter, &QgsGradientPlotEventFilter::mousePress,
this, &QgsGradientColorRampDialog::plotMousePress );
181 connect( mPlotFilter, &QgsGradientPlotEventFilter::mouseRelease,
this, &QgsGradientColorRampDialog::plotMouseRelease );
182 connect( mPlotFilter, &QgsGradientPlotEventFilter::mouseMove,
this, &QgsGradientColorRampDialog::plotMouseMove );
185 mPlotHueCheckbox->setChecked( settings.
value( QStringLiteral(
"GradientEditor/plotHue" ),
false ).toBool() );
186 mPlotLightnessCheckbox->setChecked( settings.
value( QStringLiteral(
"GradientEditor/plotLightness" ),
true ).toBool() );
187 mPlotSaturationCheckbox->setChecked( settings.
value( QStringLiteral(
"GradientEditor/plotSaturation" ),
false ).toBool() );
188 mPlotAlphaCheckbox->setChecked( settings.
value( QStringLiteral(
"GradientEditor/plotAlpha" ),
false ).toBool() );
190 mHueCurve->setVisible( mPlotHueCheckbox->isChecked() );
191 mLightnessCurve->setVisible( mPlotLightnessCheckbox->isChecked() );
192 mSaturationCurve->setVisible( mPlotSaturationCheckbox->isChecked() );
193 mAlphaCurve->setVisible( mPlotAlphaCheckbox->isChecked() );
196 mStopEditor->selectStop( 0 );
198 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsGradientColorRampDialog::showHelp );
204 settings.
setValue( QStringLiteral(
"GradientEditor/plotHue" ), mPlotHueCheckbox->isChecked() );
205 settings.
setValue( QStringLiteral(
"GradientEditor/plotLightness" ), mPlotLightnessCheckbox->isChecked() );
206 settings.
setValue( QStringLiteral(
"GradientEditor/plotSaturation" ), mPlotSaturationCheckbox->isChecked() );
207 settings.
setValue( QStringLiteral(
"GradientEditor/plotAlpha" ), mPlotAlphaCheckbox->isChecked() );
215 updateColorButtons();
227void QgsGradientColorRampDialog::cboType_currentIndexChanged(
int index )
233 updateColorButtons();
240void QgsGradientColorRampDialog::btnInformation_pressed()
242 if ( mRamp.
info().isEmpty() )
246 QLabel *label =
nullptr;
249 QTableWidget *tableInfo =
new QTableWidget( dlg );
250 tableInfo->verticalHeader()->hide();
251 tableInfo->horizontalHeader()->hide();
252 tableInfo->setRowCount( mRamp.
info().count() );
253 tableInfo->setColumnCount( 2 );
256 for ( QgsStringMap::const_iterator it = rampInfo.constBegin();
257 it != rampInfo.constEnd(); ++it )
259 if ( it.key().startsWith( QLatin1String(
"cpt-city" ) ) )
261 tableInfo->setItem( i, 0,
new QTableWidgetItem( it.key() ) );
262 tableInfo->setItem( i, 1,
new QTableWidgetItem( it.value() ) );
263 tableInfo->resizeRowToContents( i );
266 tableInfo->resizeColumnToContents( 0 );
267 tableInfo->horizontalHeader()->setStretchLastSection(
true );
268 tableInfo->setRowCount( i );
269 tableInfo->setFixedHeight( tableInfo->rowHeight( 0 ) * i + 5 );
270 dlg->
layout()->addWidget( tableInfo );
271 dlg->resize( 600, 250 );
273 dlg->
layout()->addSpacing( 5 );
276 QString gradientFile = mRamp.
info().value( QStringLiteral(
"cpt-city-gradient" ) );
277 if ( ! gradientFile.isNull() )
279 QString fileName = gradientFile;
281 if ( ! QFile::exists( fileName ) )
283 fileName = gradientFile;
284 fileName.replace( QLatin1String(
"<cpt-city>" ), QLatin1String(
"http://soliton.vm.bytemark.co.uk/pub/cpt-city" ) );
286 label =
new QLabel( tr(
"Gradient file : %1" ).arg( fileName ), dlg );
287 label->setTextInteractionFlags( Qt::TextBrowserInteraction );
288 dlg->
layout()->addSpacing( 5 );
289 dlg->
layout()->addWidget( label );
293 QString licenseFile = mRamp.
info().value( QStringLiteral(
"cpt-city-license" ) );
294 if ( !licenseFile.isNull() )
296 QString fileName = licenseFile;
298 if ( ! QFile::exists( fileName ) )
300 fileName = licenseFile;
301 fileName.replace( QLatin1String(
"<cpt-city>" ), QLatin1String(
"http://soliton.vm.bytemark.co.uk/pub/cpt-city" ) );
303 label =
new QLabel( tr(
"License file : %1" ).arg( fileName ), dlg );
304 label->setTextInteractionFlags( Qt::TextBrowserInteraction );
305 dlg->
layout()->addSpacing( 5 );
306 dlg->
layout()->addWidget( label );
307 if ( QFile::exists( fileName ) )
309 QTextEdit *textEdit =
new QTextEdit( dlg );
310 textEdit->setReadOnly(
true );
311 QFile file( fileName );
312 if ( file.open( QIODevice::ReadOnly | QIODevice::Text ) )
314 textEdit->setText( file.readAll() );
316 dlg->
layout()->addSpacing( 5 );
317 dlg->
layout()->addWidget( textEdit );
318 dlg->resize( 600, 500 );
326void QgsGradientColorRampDialog::updateColorButtons()
328 btnColor1->blockSignals(
true );
329 btnColor1->setColor( mRamp.
color1() );
330 btnColor1->blockSignals(
false );
331 btnColor2->blockSignals(
true );
332 btnColor2->setColor( mRamp.
color2() );
333 btnColor2->blockSignals(
false );
336void QgsGradientColorRampDialog::updateStopEditor()
338 mStopEditor->blockSignals(
true );
339 mStopEditor->setGradientRamp( mRamp );
340 mStopEditor->blockSignals(
false );
343void QgsGradientColorRampDialog::selectedStopChanged(
const QgsGradientStop &stop )
346 mColorWidget->blockSignals(
true );
347 mColorWidget->setColor( stop.
color );
348 mColorWidget->blockSignals(
false );
349 mPositionSpinBox->blockSignals(
true );
350 mPositionSpinBox->setValue( stop.
offset * 100 );
351 mPositionSpinBox->blockSignals(
false );
353 mStopColorSpec->setCurrentIndex( mStopColorSpec->findData(
static_cast< int >( mStopEditor->selectedStop().colorSpec() ) ) );
354 mStopDirection->setCurrentIndex( mStopDirection->findData(
static_cast< int >( mStopEditor->selectedStop().direction() ) ) );
360 mPositionSpinBox->setDisabled(
true );
361 mDeleteStopButton->setDisabled(
true );
365 mPositionSpinBox->setDisabled(
false );
366 mDeleteStopButton->setDisabled(
false );
370 mStopColorSpec->setEnabled( !( stop.
offset == 0 && stop.
color == mRamp.
color1() ) );
371 mStopDirection->setEnabled( !( stop.
offset == 0 && stop.
color == mRamp.
color1() ) && hasDirection( mStopEditor->selectedStop().colorSpec() ) );
376void QgsGradientColorRampDialog::colorWidgetChanged(
const QColor &color )
378 mStopEditor->setSelectedStopColor( color );
381void QgsGradientColorRampDialog::mPositionSpinBox_valueChanged(
double val )
383 mStopEditor->setSelectedStopOffset( val / 100.0 );
386void QgsGradientColorRampDialog::mPlotHueCheckbox_toggled(
bool checked )
388 mHueCurve->setVisible( checked );
392void QgsGradientColorRampDialog::mPlotLightnessCheckbox_toggled(
bool checked )
394 mLightnessCurve->setVisible( checked );
398void QgsGradientColorRampDialog::mPlotSaturationCheckbox_toggled(
bool checked )
400 mSaturationCurve->setVisible( checked );
404void QgsGradientColorRampDialog::mPlotAlphaCheckbox_toggled(
bool checked )
406 mAlphaCurve->setVisible( checked );
410void QgsGradientColorRampDialog::plotMousePress( QPointF point )
415 mCurrentPlotColorComponent = -1;
416 mCurrentPlotMarkerIndex = -1;
419 for (
int i = 0; i < mRamp.
count(); ++i )
422 double currentOff = 0.0;
426 currentCol = mRamp.
color1();
428 else if ( i == mRamp.
count() - 1 )
431 currentCol = mRamp.
color2();
435 currentOff = mRamp.
stops().at( i - 1 ).offset;
436 currentCol = mRamp.
stops().at( i - 1 ).color;
440 if ( mPlotHueCheckbox->isChecked() )
442 currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.hslHueF(), 2.0 );
443 if ( currentDist < minDist )
445 minDist = currentDist;
446 mCurrentPlotColorComponent = 0;
447 mCurrentPlotMarkerIndex = i;
450 if ( mPlotLightnessCheckbox->isChecked() )
452 currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.lightnessF(), 2.0 );
453 if ( currentDist < minDist )
455 minDist = currentDist;
456 mCurrentPlotColorComponent = 1;
457 mCurrentPlotMarkerIndex = i;
460 if ( mPlotSaturationCheckbox->isChecked() )
462 currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.hslSaturationF(), 2.0 );
463 if ( currentDist < minDist )
465 minDist = currentDist;
466 mCurrentPlotColorComponent = 2;
467 mCurrentPlotMarkerIndex = i;
470 if ( mPlotAlphaCheckbox->isChecked() )
472 currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.alphaF(), 2.0 );
473 if ( currentDist < minDist )
475 minDist = currentDist;
476 mCurrentPlotColorComponent = 3;
477 mCurrentPlotMarkerIndex = i;
483 if ( mCurrentPlotMarkerIndex >= 0 )
484 mStopEditor->selectStop( mCurrentPlotMarkerIndex );
487void QgsGradientColorRampDialog::plotMouseRelease( QPointF )
489 mCurrentPlotColorComponent = -1;
492void QgsGradientColorRampDialog::plotMouseMove( QPointF point )
494 QColor newColor = mStopEditor->selectedStop().color;
496 if ( mCurrentPlotColorComponent == 0 )
497 newColor = QColor::fromHslF( std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ), newColor.hslSaturationF(), newColor.lightnessF(), newColor.alphaF() );
498 else if ( mCurrentPlotColorComponent == 1 )
499 newColor = QColor::fromHslF( newColor.hslHueF(), newColor.hslSaturationF(), std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ), newColor.alphaF() );
500 else if ( mCurrentPlotColorComponent == 2 )
501 newColor = QColor::fromHslF( newColor.hslHueF(), std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ), newColor.lightnessF(), newColor.alphaF() );
502 else if ( mCurrentPlotColorComponent == 3 )
503 newColor = QColor::fromHslF( newColor.hslHueF(), newColor.hslSaturationF(), newColor.lightnessF(), std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ) );
505 mStopEditor->setSelectedStopDetails( newColor, std::clamp( point.x(), qreal( 0.0 ), qreal( 1.0 ) ) );
508bool byX( QPointF p1, QPointF p2 )
510 return p1.x() < p2.x();
513void QgsGradientColorRampDialog::addPlotMarker(
double x,
double y,
const QColor &color,
bool isSelected )
515 QColor borderColor = color.darker( 200 );
516 borderColor.setAlpha( 255 );
518 QColor brushColor = color;
519 brushColor.setAlpha( 255 );
521 QwtPlotMarker *marker =
new QwtPlotMarker();
522 marker->setSymbol(
new QwtSymbol( QwtSymbol::Ellipse, QBrush( brushColor ), QPen( borderColor, isSelected ? 2 : 1 ), QSize( 8, 8 ) ) );
523 marker->setValue( x, y );
524 marker->attach( mPlot );
525 marker->setRenderHint( QwtPlotItem::RenderAntialiased,
true );
529void QgsGradientColorRampDialog::addMarkersForColor(
double x,
const QColor &color,
bool isSelected )
531 if ( mPlotHueCheckbox->isChecked() )
532 addPlotMarker( x, color.hslHueF(), color, isSelected && mCurrentPlotColorComponent == 0 );
533 if ( mPlotLightnessCheckbox->isChecked() )
534 addPlotMarker( x, color.lightnessF(), color, isSelected && mCurrentPlotColorComponent == 1 );
535 if ( mPlotSaturationCheckbox->isChecked() )
536 addPlotMarker( x, color.hslSaturationF(), color, isSelected && mCurrentPlotColorComponent == 2 );
537 if ( mPlotAlphaCheckbox->isChecked() )
538 addPlotMarker( x, color.alphaF(), color, isSelected && mCurrentPlotColorComponent == 3 );
541bool QgsGradientColorRampDialog::hasDirection( QColor::Spec colorSpec )
545 case QColor::Spec::Rgb:
546 case QColor::Spec::ExtendedRgb:
547 case QColor::Spec::Cmyk:
548 case QColor::Spec::Invalid:
551 case QColor::Spec::Hsv:
552 case QColor::Spec::Hsl:
559void QgsGradientColorRampDialog::updatePlot()
562 const auto constMMarkers = mMarkers;
563 for ( QwtPlotMarker *marker : constMMarkers )
570 QPolygonF lightnessPoints;
572 QPolygonF saturationPoints;
573 QPolygonF alphaPoints;
574 lightnessPoints << QPointF( 0.0, mRamp.
color1().lightnessF() );
575 huePoints << QPointF( 0.0, mRamp.
color1().hslHueF() );
576 saturationPoints << QPointF( 0.0, mRamp.
color1().hslSaturationF() );
577 alphaPoints << QPointF( 0.0, mRamp.
color1().alphaF() );
578 addMarkersForColor( 0, mRamp.
color1(), mCurrentPlotMarkerIndex == 0 );
581 const auto constStops = mRamp.
stops();
584 lightnessPoints << QPointF( stop.
offset, stop.
color.lightnessF() );
585 huePoints << QPointF( stop.
offset, stop.
color.hslHueF() );
586 saturationPoints << QPointF( stop.
offset, stop.
color.hslSaturationF() );
587 alphaPoints << QPointF( stop.
offset, stop.
color.alphaF() );
589 addMarkersForColor( stop.
offset, stop.
color, mCurrentPlotMarkerIndex == i );
594 for (
double p = 0.001; p < 1.0; p += 0.001 )
596 QColor
c = mRamp.
color( p );
597 lightnessPoints << QPointF( p,
c.lightnessF() );
598 huePoints << QPointF( p,
c.hslHueF() );
599 saturationPoints << QPointF( p,
c.hslSaturationF() );
600 alphaPoints << QPointF( p,
c.alphaF() );
603 lightnessPoints << QPointF( 1.0, mRamp.
color2().lightnessF() );
604 huePoints << QPointF( 1.0, mRamp.
color2().hslHueF() );
605 saturationPoints << QPointF( 1.0, mRamp.
color2().hslSaturationF() );
606 alphaPoints << QPointF( 1.0, mRamp.
color2().alphaF() );
607 addMarkersForColor( 1.0, mRamp.
color2(), mCurrentPlotMarkerIndex == i );
609 std::sort( lightnessPoints.begin(), lightnessPoints.end(),
byX );
610 std::sort( huePoints.begin(), huePoints.end(),
byX );
611 std::sort( saturationPoints.begin(), saturationPoints.end(),
byX );
612 std::sort( alphaPoints.begin(), alphaPoints.end(),
byX );
614 mLightnessCurve->setSamples( lightnessPoints );
615 mHueCurve->setSamples( huePoints );
616 mSaturationCurve->setSamples( saturationPoints );
617 mAlphaCurve->setSamples( alphaPoints );
621void QgsGradientColorRampDialog::updateRampFromStopEditor()
623 mRamp = mStopEditor->gradientRamp();
626 mPositionSpinBox->blockSignals(
true );
627 mPositionSpinBox->setValue( mStopEditor->selectedStop().offset * 100 );
628 mPositionSpinBox->blockSignals(
false );
629 mColorWidget->blockSignals(
true );
630 mColorWidget->setColor( mStopEditor->selectedStop().color );
631 mColorWidget->blockSignals(
false );
633 mStopColorSpec->setCurrentIndex( mStopColorSpec->findData(
static_cast< int >( mStopEditor->selectedStop().colorSpec() ) ) );
634 mStopDirection->setCurrentIndex( mStopDirection->findData(
static_cast< int >( mStopEditor->selectedStop().direction() ) ) );
638 mStopColorSpec->setEnabled( !( mStopEditor->selectedStop().offset == 0 && mStopEditor->selectedStop().color == mRamp.
color1() ) );
639 mStopDirection->setEnabled( !( mStopEditor->selectedStop().offset == 0 && mStopEditor->selectedStop().color == mRamp.
color1() ) && hasDirection( mStopEditor->selectedStop().colorSpec() ) );
641 updateColorButtons();
649 mStopEditor->setColor1( color );
650 updateColorButtons();
655 mStopEditor->setColor2( color );
656 updateColorButtons();
659void QgsGradientColorRampDialog::showHelp()
661 QgsHelp::openHelp( QStringLiteral(
"style_library/style_manager.html#setting-a-color-ramp" ) );
667QgsGradientPlotEventFilter::QgsGradientPlotEventFilter( QwtPlot *plot )
671 mPlot->canvas()->installEventFilter(
this );
674bool QgsGradientPlotEventFilter::eventFilter( QObject *
object, QEvent *event )
676 if ( !mPlot->isEnabled() )
677 return QObject::eventFilter(
object, event );
679 switch ( event->type() )
681 case QEvent::MouseButtonPress:
683 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>( event );
684 if ( mouseEvent->button() == Qt::LeftButton )
686 emit mousePress( mapPoint( mouseEvent->pos() ) );
690 case QEvent::MouseMove:
692 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>( event );
693 if ( mouseEvent->buttons() & Qt::LeftButton )
696 emit mouseMove( mapPoint( mouseEvent->pos() ) );
700 case QEvent::MouseButtonRelease:
702 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>( event );
703 if ( mouseEvent->button() == Qt::LeftButton )
705 emit mouseRelease( mapPoint( mouseEvent->pos() ) );
713 return QObject::eventFilter(
object, event );
716QPointF QgsGradientPlotEventFilter::mapPoint( QPointF point )
const
721 return QPointF( mPlot->canvasMap( QwtPlot::xBottom ).invTransform( point.x() ),
722 mPlot->canvasMap( QwtPlot::yLeft ).invTransform( point.y() ) );
AngularDirection
Angular directions.
@ CounterClockwise
Counter-clockwise direction.
@ Clockwise
Clockwise direction.
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::Spec colorSpec() const
Returns the color specification in which the color component interpolation will occur.
QColor color(double value) const override
Returns the color corresponding to a specified value.
QColor color1() const
Returns the gradient start color.
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.
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 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.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
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
#define BUILTIN_UNREACHABLE
QMap< QString, QString > QgsStringMap
bool byX(QPointF p1, QPointF p2)