23#include <QColorDialog>
25#include <QInputDialog>
28#include <QTableWidget>
31#include "moc_qgsgradientcolorrampdialog.cpp"
33using namespace Qt::StringLiterals;
36#include <qwt_global.h>
37#include <qwt_plot_canvas.h>
39#include <qwt_plot_curve.h>
40#include <qwt_plot_grid.h>
41#include <qwt_plot_marker.h>
42#include <qwt_plot_picker.h>
43#include <qwt_picker_machine.h>
44#include <qwt_plot_layout.h>
45#include <qwt_symbol.h>
46#include <qwt_legend.h>
47#include <qwt_scale_div.h>
48#include <qwt_scale_map.h>
57 mColorWidget->setColorModelEditable(
false );
59 mStopColorSpec->addItem( tr(
"RGB" ),
static_cast<int>( QColor::Spec::Rgb ) );
60 mStopColorSpec->addItem( tr(
"HSV" ),
static_cast<int>( QColor::Spec::Hsv ) );
61 mStopColorSpec->addItem( tr(
"HSL" ),
static_cast<int>( QColor::Spec::Hsl ) );
62 mStopColorSpec->addItem( tr(
"CMYK" ),
static_cast<int>( QColor::Spec::Cmyk ) );
63 mStopColorSpec->setCurrentIndex( mStopColorSpec->findData(
static_cast<int>(
ramp.colorSpec() ) ) );
67 mStopDirection->setCurrentIndex( mStopColorSpec->findData(
static_cast<int>(
ramp.direction() ) ) );
69 mStopDirection->setEnabled( hasDirection(
static_cast<QColor::Spec
>( mStopColorSpec->currentData().toInt() ) ) );
71 connect( mStopColorSpec,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, [
this] {
72 const QColor::Spec colorSpec =
static_cast<QColor::Spec
>( mStopColorSpec->currentData().toInt() );
73 mStopDirection->setEnabled( hasDirection( colorSpec ) );
75 if ( colorSpec != mColorWidget->color().spec() )
77 mColorWidget->setColor( mColorWidget->color().convertTo( colorSpec ) );
83 mStopEditor->setSelectedStopColorSpec( colorSpec );
86 connect( mStopDirection,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, [
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( u
"symbology"_s );
108 btnColor1->setShowNoColor(
true );
109 btnColor1->setNoColorString( tr(
"Transparent" ) );
110 btnColor2->setAllowOpacity(
true );
111 btnColor2->setColorDialogTitle( tr(
"Select Ramp Color" ) );
112 btnColor2->setContext( u
"symbology"_s );
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" ) );
123 if ( mRamp.isDiscrete() )
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( u
"GradientEditor/plotHue"_s,
false ).toBool() );
186 mPlotLightnessCheckbox->setChecked( settings.
value( u
"GradientEditor/plotLightness"_s,
true ).toBool() );
187 mPlotSaturationCheckbox->setChecked( settings.
value( u
"GradientEditor/plotSaturation"_s,
false ).toBool() );
188 mPlotAlphaCheckbox->setChecked( settings.
value( u
"GradientEditor/plotAlpha"_s,
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( u
"GradientEditor/plotHue"_s, mPlotHueCheckbox->isChecked() );
205 settings.
setValue( u
"GradientEditor/plotLightness"_s, mPlotLightnessCheckbox->isChecked() );
206 settings.
setValue( u
"GradientEditor/plotSaturation"_s, mPlotSaturationCheckbox->isChecked() );
207 settings.
setValue( u
"GradientEditor/plotAlpha"_s, mPlotAlphaCheckbox->isChecked() );
214 updateColorButtons();
226void QgsGradientColorRampDialog::cboType_currentIndexChanged(
int index )
231 updateColorButtons();
238void QgsGradientColorRampDialog::btnInformation_pressed()
240 if ( mRamp.info().isEmpty() )
243 QgsDialog *dlg =
new QgsDialog(
this );
244 QLabel *label =
nullptr;
247 QTableWidget *tableInfo =
new QTableWidget( dlg );
248 tableInfo->verticalHeader()->hide();
249 tableInfo->horizontalHeader()->hide();
250 tableInfo->setRowCount( mRamp.info().count() );
251 tableInfo->setColumnCount( 2 );
254 for ( QgsStringMap::const_iterator it = rampInfo.constBegin();
255 it != rampInfo.constEnd(); ++it )
257 if ( it.key().startsWith(
"cpt-city"_L1 ) )
259 tableInfo->setItem( i, 0,
new QTableWidgetItem( it.key() ) );
260 tableInfo->setItem( i, 1,
new QTableWidgetItem( it.value() ) );
261 tableInfo->resizeRowToContents( i );
264 tableInfo->resizeColumnToContents( 0 );
265 tableInfo->horizontalHeader()->setStretchLastSection(
true );
266 tableInfo->setRowCount( i );
267 tableInfo->setFixedHeight( tableInfo->rowHeight( 0 ) * i + 5 );
268 dlg->
layout()->addWidget( tableInfo );
269 dlg->resize( 600, 250 );
271 dlg->
layout()->addSpacing( 5 );
274 QString gradientFile = mRamp.info().value( u
"cpt-city-gradient"_s );
275 if ( !gradientFile.isNull() )
277 QString fileName = gradientFile;
279 if ( !QFile::exists( fileName ) )
281 fileName = gradientFile;
282 fileName.replace(
"<cpt-city>"_L1,
"http://soliton.vm.bytemark.co.uk/pub/cpt-city"_L1 );
284 label =
new QLabel( tr(
"Gradient file : %1" ).arg( fileName ), dlg );
285 label->setTextInteractionFlags( Qt::TextBrowserInteraction );
286 dlg->
layout()->addSpacing( 5 );
287 dlg->
layout()->addWidget( label );
291 QString licenseFile = mRamp.info().value( u
"cpt-city-license"_s );
292 if ( !licenseFile.isNull() )
294 QString fileName = licenseFile;
296 if ( !QFile::exists( fileName ) )
298 fileName = licenseFile;
299 fileName.replace(
"<cpt-city>"_L1,
"http://soliton.vm.bytemark.co.uk/pub/cpt-city"_L1 );
301 label =
new QLabel( tr(
"License file : %1" ).arg( fileName ), dlg );
302 label->setTextInteractionFlags( Qt::TextBrowserInteraction );
303 dlg->
layout()->addSpacing( 5 );
304 dlg->
layout()->addWidget( label );
305 if ( QFile::exists( fileName ) )
307 QTextEdit *textEdit =
new QTextEdit( dlg );
308 textEdit->setReadOnly(
true );
309 QFile file( fileName );
310 if ( file.open( QIODevice::ReadOnly | QIODevice::Text ) )
312 textEdit->setText( file.readAll() );
314 dlg->
layout()->addSpacing( 5 );
315 dlg->
layout()->addWidget( textEdit );
316 dlg->resize( 600, 500 );
324void QgsGradientColorRampDialog::updateColorButtons()
326 btnColor1->blockSignals(
true );
327 btnColor1->setColor( mRamp.color1() );
328 btnColor1->blockSignals(
false );
329 btnColor2->blockSignals(
true );
330 btnColor2->setColor( mRamp.color2() );
331 btnColor2->blockSignals(
false );
334void QgsGradientColorRampDialog::updateStopEditor()
336 mStopEditor->blockSignals(
true );
337 mStopEditor->setGradientRamp( mRamp );
338 mStopEditor->blockSignals(
false );
341void QgsGradientColorRampDialog::selectedStopChanged(
const QgsGradientStop &stop )
344 mColorWidget->blockSignals(
true );
345 mColorWidget->setColor( stop.
color );
346 mColorWidget->blockSignals(
false );
347 mPositionSpinBox->blockSignals(
true );
348 mPositionSpinBox->setValue( stop.
offset * 100 );
349 mPositionSpinBox->blockSignals(
false );
351 mStopColorSpec->setCurrentIndex( mStopColorSpec->findData(
static_cast<int>( mStopEditor->selectedStop().colorSpec() ) ) );
352 mStopDirection->setCurrentIndex( mStopDirection->findData(
static_cast<int>( mStopEditor->selectedStop().direction() ) ) );
355 if ( ( stop.
offset == 0 && stop.
color == mRamp.color1() ) || ( stop.
offset == 1.0 && stop.
color == mRamp.color2() ) )
358 mPositionSpinBox->setDisabled(
true );
359 mDeleteStopButton->setDisabled(
true );
363 mPositionSpinBox->setDisabled(
false );
364 mDeleteStopButton->setDisabled(
false );
368 mStopColorSpec->setEnabled( !( stop.
offset == 0 && stop.
color == mRamp.color1() ) );
369 mStopDirection->setEnabled( !( stop.
offset == 0 && stop.
color == mRamp.color1() ) && hasDirection( mStopEditor->selectedStop().colorSpec() ) );
374void QgsGradientColorRampDialog::colorWidgetChanged(
const QColor &color )
376 mStopEditor->setSelectedStopColor( color );
379void QgsGradientColorRampDialog::mPositionSpinBox_valueChanged(
double val )
381 mStopEditor->setSelectedStopOffset( val / 100.0 );
384void QgsGradientColorRampDialog::mPlotHueCheckbox_toggled(
bool checked )
386 mHueCurve->setVisible( checked );
390void QgsGradientColorRampDialog::mPlotLightnessCheckbox_toggled(
bool checked )
392 mLightnessCurve->setVisible( checked );
396void QgsGradientColorRampDialog::mPlotSaturationCheckbox_toggled(
bool checked )
398 mSaturationCurve->setVisible( checked );
402void QgsGradientColorRampDialog::mPlotAlphaCheckbox_toggled(
bool checked )
404 mAlphaCurve->setVisible( checked );
408void QgsGradientColorRampDialog::plotMousePress( QPointF point )
413 mCurrentPlotColorComponent = -1;
414 mCurrentPlotMarkerIndex = -1;
417 for (
int i = 0; i < mRamp.count(); ++i )
420 double currentOff = 0.0;
424 currentCol = mRamp.color1();
426 else if ( i == mRamp.count() - 1 )
429 currentCol = mRamp.color2();
433 currentOff = mRamp.stops().at( i - 1 ).offset;
434 currentCol = mRamp.stops().at( i - 1 ).color;
438 if ( mPlotHueCheckbox->isChecked() )
440 currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.hslHueF(), 2.0 );
441 if ( currentDist < minDist )
443 minDist = currentDist;
444 mCurrentPlotColorComponent = 0;
445 mCurrentPlotMarkerIndex = i;
448 if ( mPlotLightnessCheckbox->isChecked() )
450 currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.lightnessF(), 2.0 );
451 if ( currentDist < minDist )
453 minDist = currentDist;
454 mCurrentPlotColorComponent = 1;
455 mCurrentPlotMarkerIndex = i;
458 if ( mPlotSaturationCheckbox->isChecked() )
460 currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.hslSaturationF(), 2.0 );
461 if ( currentDist < minDist )
463 minDist = currentDist;
464 mCurrentPlotColorComponent = 2;
465 mCurrentPlotMarkerIndex = i;
468 if ( mPlotAlphaCheckbox->isChecked() )
470 currentDist = std::pow( point.x() - currentOff, 2.0 ) + std::pow( point.y() - currentCol.alphaF(), 2.0 );
471 if ( currentDist < minDist )
473 minDist = currentDist;
474 mCurrentPlotColorComponent = 3;
475 mCurrentPlotMarkerIndex = i;
481 if ( mCurrentPlotMarkerIndex >= 0 )
482 mStopEditor->selectStop( mCurrentPlotMarkerIndex );
485void QgsGradientColorRampDialog::plotMouseRelease( QPointF )
487 mCurrentPlotColorComponent = -1;
490void QgsGradientColorRampDialog::plotMouseMove( QPointF point )
492 QColor newColor = mStopEditor->selectedStop().color;
494 if ( mCurrentPlotColorComponent == 0 )
495 newColor = QColor::fromHslF( std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ), newColor.hslSaturationF(), newColor.lightnessF(), newColor.alphaF() );
496 else if ( mCurrentPlotColorComponent == 1 )
497 newColor = QColor::fromHslF( newColor.hslHueF(), newColor.hslSaturationF(), std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ), newColor.alphaF() );
498 else if ( mCurrentPlotColorComponent == 2 )
499 newColor = QColor::fromHslF( newColor.hslHueF(), std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ), newColor.lightnessF(), newColor.alphaF() );
500 else if ( mCurrentPlotColorComponent == 3 )
501 newColor = QColor::fromHslF( newColor.hslHueF(), newColor.hslSaturationF(), newColor.lightnessF(), std::clamp( point.y(), qreal( 0.0 ), qreal( 1.0 ) ) );
503 mStopEditor->setSelectedStopDetails( newColor, std::clamp( point.x(), qreal( 0.0 ), qreal( 1.0 ) ) );
506bool byX( QPointF p1, QPointF p2 )
508 return p1.x() < p2.x();
511void QgsGradientColorRampDialog::addPlotMarker(
double x,
double y,
const QColor &color,
bool isSelected )
513 QColor borderColor = color.darker( 200 );
514 borderColor.setAlpha( 255 );
516 QColor brushColor = color;
517 brushColor.setAlpha( 255 );
519 QwtPlotMarker *marker =
new QwtPlotMarker();
520 marker->setSymbol(
new QwtSymbol( QwtSymbol::Ellipse, QBrush( brushColor ), QPen( borderColor, isSelected ? 2 : 1 ), QSize( 8, 8 ) ) );
521 marker->setValue( x, y );
522 marker->attach( mPlot );
523 marker->setRenderHint( QwtPlotItem::RenderAntialiased,
true );
527void QgsGradientColorRampDialog::addMarkersForColor(
double x,
const QColor &color,
bool isSelected )
529 if ( mPlotHueCheckbox->isChecked() )
530 addPlotMarker( x, color.hslHueF(), color, isSelected && mCurrentPlotColorComponent == 0 );
531 if ( mPlotLightnessCheckbox->isChecked() )
532 addPlotMarker( x, color.lightnessF(), color, isSelected && mCurrentPlotColorComponent == 1 );
533 if ( mPlotSaturationCheckbox->isChecked() )
534 addPlotMarker( x, color.hslSaturationF(), color, isSelected && mCurrentPlotColorComponent == 2 );
535 if ( mPlotAlphaCheckbox->isChecked() )
536 addPlotMarker( x, color.alphaF(), color, isSelected && mCurrentPlotColorComponent == 3 );
539bool QgsGradientColorRampDialog::hasDirection( QColor::Spec colorSpec )
543 case QColor::Spec::Rgb:
544 case QColor::Spec::ExtendedRgb:
545 case QColor::Spec::Cmyk:
546 case QColor::Spec::Invalid:
549 case QColor::Spec::Hsv:
550 case QColor::Spec::Hsl:
557void QgsGradientColorRampDialog::updatePlot()
560 const auto constMMarkers = mMarkers;
561 for ( QwtPlotMarker *marker : constMMarkers )
568 QPolygonF lightnessPoints;
570 QPolygonF saturationPoints;
571 QPolygonF alphaPoints;
572 lightnessPoints << QPointF( 0.0, mRamp.color1().lightnessF() );
573 huePoints << QPointF( 0.0, mRamp.color1().hslHueF() );
574 saturationPoints << QPointF( 0.0, mRamp.color1().hslSaturationF() );
575 alphaPoints << QPointF( 0.0, mRamp.color1().alphaF() );
576 addMarkersForColor( 0, mRamp.color1(), mCurrentPlotMarkerIndex == 0 );
579 const auto constStops = mRamp.stops();
580 for (
const QgsGradientStop &stop : constStops )
582 lightnessPoints << QPointF( stop.
offset, stop.
color.lightnessF() );
583 huePoints << QPointF( stop.
offset, stop.
color.hslHueF() );
584 saturationPoints << QPointF( stop.
offset, stop.
color.hslSaturationF() );
585 alphaPoints << QPointF( stop.
offset, stop.
color.alphaF() );
587 addMarkersForColor( stop.
offset, stop.
color, mCurrentPlotMarkerIndex == i );
592 for (
double p = 0.001; p < 1.0; p += 0.001 )
594 QColor
c = mRamp.color( p );
595 lightnessPoints << QPointF( p,
c.lightnessF() );
596 huePoints << QPointF( p,
c.hslHueF() );
597 saturationPoints << QPointF( p,
c.hslSaturationF() );
598 alphaPoints << QPointF( p,
c.alphaF() );
601 lightnessPoints << QPointF( 1.0, mRamp.color2().lightnessF() );
602 huePoints << QPointF( 1.0, mRamp.color2().hslHueF() );
603 saturationPoints << QPointF( 1.0, mRamp.color2().hslSaturationF() );
604 alphaPoints << QPointF( 1.0, mRamp.color2().alphaF() );
605 addMarkersForColor( 1.0, mRamp.color2(), mCurrentPlotMarkerIndex == i );
607 std::sort( lightnessPoints.begin(), lightnessPoints.end(),
byX );
608 std::sort( huePoints.begin(), huePoints.end(),
byX );
609 std::sort( saturationPoints.begin(), saturationPoints.end(),
byX );
610 std::sort( alphaPoints.begin(), alphaPoints.end(),
byX );
612 mLightnessCurve->setSamples( lightnessPoints );
613 mHueCurve->setSamples( huePoints );
614 mSaturationCurve->setSamples( saturationPoints );
615 mAlphaCurve->setSamples( alphaPoints );
619void QgsGradientColorRampDialog::updateRampFromStopEditor()
621 mRamp = mStopEditor->gradientRamp();
624 mPositionSpinBox->blockSignals(
true );
625 mPositionSpinBox->setValue( mStopEditor->selectedStop().offset * 100 );
626 mPositionSpinBox->blockSignals(
false );
627 mColorWidget->blockSignals(
true );
628 mColorWidget->setColor( mStopEditor->selectedStop().color );
629 mColorWidget->blockSignals(
false );
631 mStopColorSpec->setCurrentIndex( mStopColorSpec->findData(
static_cast<int>( mStopEditor->selectedStop().colorSpec() ) ) );
632 mStopDirection->setCurrentIndex( mStopDirection->findData(
static_cast<int>( mStopEditor->selectedStop().direction() ) ) );
636 mStopColorSpec->setEnabled( !( mStopEditor->selectedStop().offset == 0 && mStopEditor->selectedStop().color == mRamp.color1() ) );
637 mStopDirection->setEnabled( !( mStopEditor->selectedStop().offset == 0 && mStopEditor->selectedStop().color == mRamp.color1() ) && hasDirection( mStopEditor->selectedStop().colorSpec() ) );
639 updateColorButtons();
647 mStopEditor->setColor1( color );
648 updateColorButtons();
653 mStopEditor->setColor2( color );
654 updateColorButtons();
657void QgsGradientColorRampDialog::showHelp()
665QgsGradientPlotEventFilter::QgsGradientPlotEventFilter( QwtPlot *plot )
669 mPlot->canvas()->installEventFilter(
this );
672bool QgsGradientPlotEventFilter::eventFilter( QObject *
object, QEvent *event )
674 if ( !mPlot->isEnabled() )
675 return QObject::eventFilter(
object, event );
677 switch ( event->type() )
679 case QEvent::MouseButtonPress:
681 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>( event );
682 if ( mouseEvent->button() == Qt::LeftButton )
684 emit mousePress( mapPoint( mouseEvent->pos() ) );
688 case QEvent::MouseMove:
690 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>( event );
691 if ( mouseEvent->buttons() & Qt::LeftButton )
694 emit mouseMove( mapPoint( mouseEvent->pos() ) );
698 case QEvent::MouseButtonRelease:
700 const QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>( event );
701 if ( mouseEvent->button() == Qt::LeftButton )
703 emit mouseRelease( mapPoint( mouseEvent->pos() ) );
711 return QObject::eventFilter(
object, event );
714QPointF QgsGradientPlotEventFilter::mapPoint( QPointF point )
const
719 return QPointF( mPlot->canvasMap( QwtPlot::xBottom ).invTransform( point.x() ), mPlot->canvasMap( QwtPlot::yLeft ).invTransform( point.y() ) );
AngularDirection
Angular directions.
@ CounterClockwise
Counter-clockwise direction.
@ Clockwise
Clockwise direction.
static QString defaultBaseDir()
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...
void convertToDiscrete(bool discrete)
Converts a gradient with existing color stops to or from discrete interpolation.
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.
Stores settings for use within QGIS.
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)