File indexing completed on 2024-05-12 04:20:06

0001 /**
0002  * SPDX-FileCopyrightText: 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved.
0003  *
0004  * This file is part of the KD Chart library.
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #include "gradientdialog.h"
0010 #include "ui_gradientdialog.h"
0011 
0012 #include "colorslider.h"
0013 
0014 #include <QHBoxLayout>
0015 #include <QVBoxLayout>
0016 #include <QSpinBox>
0017 
0018 #include <QLabel>
0019 
0020 
0021 class GradientDialog::Private : public QObject
0022 {
0023     Q_OBJECT
0024 public:
0025     Private( GradientDialog *qq );
0026     ~Private() override;
0027     void init();
0028     ColorSlider *redSlider;
0029     ColorSlider *greenSlider;
0030     ColorSlider *blueSlider;
0031     QVector< QGradientStop > m_gradient;
0032     int m_currStopNr;
0033     Ui::GradientDialog *ui;
0034     GradientDialog *q;
0035 public Q_SLOTS:
0036     void changedIndex( int index );
0037     void changeStopPosition( double value );
0038     void insertItem();
0039     void deleteItem();
0040     void resetColors();
0041     void updateGradientDisplay();
0042 };
0043 
0044 GradientDialog::Private::Private( GradientDialog *qq )
0045     : m_currStopNr( 2 )
0046     , ui( new Ui::GradientDialog )
0047     , q( qq )
0048 {
0049     m_gradient << qMakePair( 0.0, QColor( Qt::red ) );
0050     m_gradient << qMakePair( 1.0, QColor( Qt::blue ) );
0051 }
0052 
0053 GradientDialog::Private::~Private()
0054 {
0055     delete ui;
0056 }
0057 
0058 void GradientDialog::Private::changeStopPosition( double value )
0059 {
0060     m_gradient[ ui->stopSelector->currentIndex() ].first = value;
0061 }
0062 
0063 void GradientDialog::Private::changedIndex( int index )
0064 {
0065     if ( index >= 0 )
0066     {
0067         ui->stopPosition->setValue( m_gradient[ index ].first );
0068         QColor stopColor = m_gradient[ index ].second;
0069         redSlider->setValue( stopColor.red() );
0070         greenSlider->setValue( stopColor.green() );
0071         blueSlider->setValue( stopColor.blue() );
0072     }
0073 }
0074 
0075 void GradientDialog::Private::insertItem()
0076 {
0077     QGradientStop newStop;
0078     newStop.first = 0.5;
0079     newStop.second = Qt::white;
0080     const int index = ui->stopSelector->currentIndex() + 1;
0081     ui->stopSelector->setCurrentIndex( - 1 );
0082     m_gradient.insert( index, newStop );
0083 
0084 
0085     QStringList newItems;
0086     newItems << tr( "stop %1" ).arg( m_currStopNr );
0087     ui->stopSelector->insertItems( index, newItems );
0088 
0089     ui->stopSelector->setCurrentIndex( index );
0090 
0091     updateGradientDisplay();
0092 
0093 }
0094 
0095 void GradientDialog::Private::deleteItem()
0096 {
0097 
0098 }
0099 
0100 void GradientDialog::Private::updateGradientDisplay()
0101 {
0102     QLinearGradient gradient;
0103     gradient.setStart( 0, 0 );
0104     gradient.setStart( 1, 0 );
0105     gradient.setCoordinateMode( QGradient::ObjectBoundingMode );
0106     for ( const QGradientStop &stop : qAsConst(m_gradient) )
0107         gradient.setColorAt( stop.first, stop.second );
0108     QPalette palette = ui->gradientDisplay->palette();
0109     palette.setBrush( QPalette::Window, gradient );
0110     ui->gradientDisplay->setPalette( palette );
0111 }
0112 
0113 void GradientDialog::Private::init()
0114 {
0115     ui->setupUi( q );
0116     QStringList list; list << tr( "stop1" ) << tr( "stop2" );
0117     ui->stopSelector->addItems( list );
0118     QHBoxLayout *redLayout = new QHBoxLayout;
0119     dynamic_cast< QVBoxLayout* >( ui->gradientStopBox->layout() )->addLayout( redLayout );
0120     QLabel *redLabel = new QLabel( "R" );
0121     QFont redFont( redLabel->font() );
0122     redFont.setUnderline( true );
0123     redLabel->setFont( redFont );
0124     redLayout->addWidget( redLabel );
0125     redSlider = new ColorSlider( q );
0126     redSlider->setStartColor( Qt::black );
0127     redSlider->setEndColor( Qt::red );
0128     QSpinBox *redSpin = new QSpinBox( q );
0129     redSpin->setMinimum( 0 );
0130     redSpin->setMaximum( 255 );
0131     redSpin->setAccelerated( true );
0132     redSpin->setValue( redSlider->value() );
0133     connect( redSpin, SIGNAL(valueChanged(int)), redSlider, SLOT(setValue(int)) );
0134     connect( redSlider, SIGNAL(valueChanged(int)), redSpin, SLOT(setValue(int)) );
0135     redLayout->addWidget( redSlider );
0136     redLayout->addWidget( redSpin );
0137 
0138     QHBoxLayout *greenLayout = new QHBoxLayout;
0139     dynamic_cast< QVBoxLayout* >( ui->gradientStopBox->layout() )->addLayout( greenLayout );
0140     QLabel *greenLabel = new QLabel( "G" );
0141     QFont greenFont( greenLabel->font() );
0142     greenFont.setUnderline( true );
0143     greenLabel->setFont( greenFont );
0144     greenLayout->addWidget( greenLabel );
0145     greenSlider = new ColorSlider( q );
0146     greenSlider->setStartColor( Qt::black );
0147     greenSlider->setEndColor( Qt::green );
0148     QSpinBox *greenSpin = new QSpinBox( q );
0149     greenSpin->setMinimum( 0 );
0150     greenSpin->setMaximum( 255 );
0151     greenSpin->setAccelerated( true );
0152     greenSpin->setValue( greenSlider->value() );
0153     connect( greenSpin, SIGNAL(valueChanged(int)), greenSlider, SLOT(setValue(int)) );
0154     connect( greenSlider, SIGNAL(valueChanged(int)), greenSpin, SLOT(setValue(int)) );
0155     greenLayout->addWidget( greenSlider );
0156     greenLayout->addWidget( greenSpin );
0157 
0158     QHBoxLayout *blueLayout = new QHBoxLayout;
0159     dynamic_cast< QVBoxLayout* >( ui->gradientStopBox->layout() )->addLayout( blueLayout );
0160     QLabel *blueLabel = new QLabel( "B" );
0161     QFont blueFont( blueLabel->font() );
0162     blueFont.setUnderline( true );
0163     blueLabel->setFont( blueFont );
0164     blueLayout->addWidget( blueLabel );
0165     blueSlider = new ColorSlider( q );
0166     blueSlider->setStartColor( Qt::black );
0167     blueSlider->setEndColor( Qt::blue );
0168     QSpinBox *blueSpin = new QSpinBox( q );
0169     blueSpin->setMinimum( 0 );
0170     blueSpin->setMaximum( 255 );
0171     blueSpin->setAccelerated( true );
0172     blueSpin->setValue( blueSlider->value() );
0173     connect( blueSpin, SIGNAL(valueChanged(int)), blueSlider, SLOT(setValue(int)) );
0174     connect( blueSlider, SIGNAL(valueChanged(int)), blueSpin, SLOT(setValue(int)) );
0175     blueLayout->addWidget( blueSlider );
0176     blueLayout->addWidget( blueSpin );
0177 
0178     updateGradientDisplay();
0179 
0180     connect( redSlider, SIGNAL(valueChanged(int)), this, SLOT(resetColors()) );
0181     connect( greenSlider, SIGNAL(valueChanged(int)), this, SLOT(resetColors()) );
0182     connect( blueSlider, SIGNAL(valueChanged(int)), this, SLOT(resetColors()) );
0183 
0184     connect( ui->newStop, SIGNAL(clicked()), this, SLOT(insertItem()) );
0185     connect( ui->deleteStop, SIGNAL(clicked()), this, SLOT(deleteItem()) );
0186     connect( ui->stopSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(changedIndex(int)) );
0187 
0188     connect( ui->stopPosition, SIGNAL(valueChanged(double)), this, SLOT(changeStopPosition(double)) );
0189 }
0190 
0191 GradientDialog::GradientDialog( QWidget *parent )
0192     : QDialog( parent )
0193     , d( new Private( this ) )
0194 {
0195     d->init();
0196 }
0197 
0198 GradientDialog::~GradientDialog()
0199 {
0200     delete d;
0201 }
0202 
0203 void GradientDialog::Private::resetColors()
0204 {
0205     const int red = redSlider->value();
0206     const int green = greenSlider->value();
0207     const int blue = blueSlider->value();
0208     QColor redSliderStartColor( 0, green, blue );
0209     QColor redSliderStopColor( 255, green, blue );
0210     redSlider->setStartColor( redSliderStartColor );
0211     redSlider->setEndColor( redSliderStopColor );
0212     m_gradient[ ui->stopSelector->currentIndex() ].second.setRed( red );
0213 
0214     QColor greenSliderStartColor( red, 0, blue );
0215     QColor greenSliderStopColor( red, 255, blue );
0216     greenSlider->setStartColor( greenSliderStartColor );
0217     greenSlider->setEndColor( greenSliderStopColor );
0218     m_gradient[ ui->stopSelector->currentIndex() ].second.setGreen( green );
0219 
0220     QColor blueSliderStartColor( red, green, 0 );
0221     QColor blueSliderStopColor( red, green, 255 );
0222     blueSlider->setStartColor( blueSliderStartColor );
0223     blueSlider->setEndColor( blueSliderStopColor );
0224     m_gradient[ ui->stopSelector->currentIndex() ].second.setBlue( blue );
0225 
0226     updateGradientDisplay();
0227 
0228 }
0229 
0230 QGradient GradientDialog::gradient() const
0231 {
0232     QLinearGradient gradient;
0233     gradient.setStart( 0, 0 );
0234     gradient.setStart( 1, 0 );
0235     gradient.setCoordinateMode( QGradient::ObjectBoundingMode );
0236     for ( const QGradientStop &stop : qAsConst(d->m_gradient) )
0237         gradient.setColorAt( stop.first, stop.second );
0238     return gradient;
0239 }
0240 void GradientDialog::setGradient( const QGradient &gradient )
0241 {
0242     d->m_gradient.clear();
0243     d->ui->stopSelector->clear();
0244     const QGradientStops stops = gradient.stops();
0245     for ( const QGradientStop &stop : stops )
0246     {
0247         d->m_gradient.append( stop );
0248     }
0249     QStringList newEntries;
0250     for ( int i = 0; i < stops.count(); ++i )
0251         newEntries << tr( "stop %1" ).arg( i );
0252     d->ui->stopSelector->addItems( newEntries );
0253     d->m_currStopNr = newEntries.count();
0254     d->updateGradientDisplay();
0255 }
0256 
0257 QGradient GradientDialog::getGradient( const QGradient &gradient, QWidget *parent, const QString &title )
0258 {
0259     GradientDialog dialog( parent );
0260     dialog.setGradient( gradient );
0261     dialog.setWindowTitle( title );
0262     dialog.exec();
0263     return dialog.gradient();
0264 }
0265 
0266 #include "gradientdialog.moc"