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"