File indexing completed on 2024-05-19 04:21:47

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 "colorslider.h"
0010 
0011 #include <QPaintEvent>
0012 #include <QPainter>
0013 #include <QMouseEvent>
0014 
0015 #include <QDebug>
0016 
0017 class ColorSlider::Private
0018 {
0019 public:
0020     Private( ColorSlider *q );
0021     void drawSliderMarker( QPainter *painter );
0022     QColor m_startColor;
0023     QColor m_endColor;
0024     bool m_dragging;
0025     ColorSlider *qq;
0026 };
0027 
0028 ColorSlider::Private::Private( ColorSlider *q )
0029     : m_dragging( false )
0030     , qq( q )
0031 {
0032 
0033 }
0034 
0035 void ColorSlider::Private::drawSliderMarker( QPainter *painter )
0036 {
0037     QVector< QPointF > points; points << QPointF( -0.5, 0 ) << QPointF( 0.0, 0.5 ) << QPointF( 0.5, 0 );
0038     QPolygonF triangle( points );
0039     painter->drawPolygon( triangle );
0040 }
0041 
0042 ColorSlider::ColorSlider( QWidget *parent )
0043     : QAbstractSlider( parent )
0044     , d( new Private( this ) )
0045 {
0046     setSizePolicy( QSizePolicy( QSizePolicy::Minimum ,QSizePolicy::Fixed) );
0047     setMinimum( 0 );
0048     setMaximum( 255 );
0049     setValue( 25 );
0050 }
0051 
0052 ColorSlider::~ColorSlider()
0053 {
0054     delete d;
0055 }
0056 
0057 QColor ColorSlider::startColor() const
0058 {
0059     return d->m_startColor;
0060 }
0061 void ColorSlider::setStartColor( const QColor &color )
0062 {
0063     if ( d->m_startColor != color )
0064     {
0065         d->m_startColor = color;
0066         Q_EMIT startColorChanged();
0067         update();
0068     }
0069 }
0070 QColor ColorSlider::endColor() const
0071 {
0072     return d->m_endColor;
0073 }
0074 void ColorSlider::setEndColor( const QColor &color )
0075 {
0076     if ( d->m_endColor != color )
0077     {
0078         d->m_endColor = color;
0079         Q_EMIT startColorChanged();
0080         update();
0081     }
0082 }
0083 
0084 void ColorSlider::paintEvent( QPaintEvent *event )
0085 {
0086     QAbstractSlider::paintEvent( event );
0087     const double percentage = value() / ( double )( maximum() - minimum() );
0088     QPainter painter( this );
0089     QLinearGradient gradient;
0090     gradient.setStart( 0, 0 );
0091     gradient.setFinalStop( 1, 0 );
0092     gradient.setCoordinateMode( QGradient::ObjectBoundingMode );
0093     gradient.setColorAt( 0, d->m_startColor );
0094     gradient.setColorAt( 1, d->m_endColor );
0095     painter.setBrush( gradient );
0096     painter.drawRect( event->rect() );
0097 
0098     painter.setBrush( Qt::white );
0099     painter.save();
0100     painter.translate( event->rect().width() * percentage, 0 );
0101     QPen oldPen = painter.pen();
0102     QPen linePen = oldPen;
0103     linePen.setColor( Qt::white );
0104     painter.setPen( linePen );
0105     painter.drawLine( 0, 0, 0, rect().height() );
0106     painter.setPen( oldPen );
0107 
0108     painter.save();
0109     painter.translate( 0, rect().height() );
0110     painter.rotate( 180 );
0111     painter.scale( 15, 15 );
0112     d->drawSliderMarker( &painter );
0113     painter.restore();
0114     painter.scale( 15, 15 );
0115     d->drawSliderMarker( &painter );
0116     painter.restore();
0117 
0118 }
0119 
0120 void ColorSlider::mousePressEvent(QMouseEvent *event )
0121 {
0122     if ( event->button() == Qt::LeftButton )
0123     {
0124         d->m_dragging = true;
0125         const double relPos = qMin( 1.0, qMax( 0.0, event->position().x() / rect().width() ) );
0126         setValue( (maximum() - minimum() ) * relPos );
0127     }
0128 }
0129 
0130 void ColorSlider::mouseReleaseEvent(QMouseEvent *event )
0131 {
0132     if ( event->button() != Qt::LeftButton )
0133     {
0134         d->m_dragging = false;
0135         const double relPos = qMin( 1.0, qMax( 0.0, event->position().x() / rect().width() ) );
0136         setValue( (maximum() - minimum() ) * relPos );
0137     }
0138 }
0139 
0140 void ColorSlider::mouseMoveEvent( QMouseEvent *event )
0141 {
0142     if ( d->m_dragging )
0143     {
0144         const double relPos = qMin( 1.0, qMax( 0.0, event->position().x() / rect().width() ) );
0145         setValue( (maximum() - minimum() ) * relPos );
0146     }
0147 }
0148 
0149 QSize ColorSlider::sizeHint() const
0150 {
0151     return QSize( 300, 50 );
0152 }