1 /**
2  * Copyright (C) 2001-2015 Klaralvdalens Datakonsult AB.  All rights reserved.
3  *
4  * This file is part of the KD Chart library.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
18  */
19 
20 #include "colorslider.h"
21 
22 #include <QPaintEvent>
23 #include <QPainter>
24 #include <QMouseEvent>
25 
26 #include <QDebug>
27 
28 class ColorSlider::Private
29 {
30 public:
31     Private( ColorSlider *q );
32     void drawSliderMarker( QPainter *painter );
33     QColor m_startColor;
34     QColor m_endColor;
35     bool m_dragging;
36     ColorSlider *qq;
37 };
38 
Private(ColorSlider * q)39 ColorSlider::Private::Private( ColorSlider *q )
40     : m_dragging( false )
41     , qq( q )
42 {
43 
44 }
45 
drawSliderMarker(QPainter * painter)46 void ColorSlider::Private::drawSliderMarker( QPainter *painter )
47 {
48     QVector< QPointF > points; points << QPointF( -0.5, 0 ) << QPointF( 0.0, 0.5 ) << QPointF( 0.5, 0 );
49     QPolygonF triangle( points );
50     painter->drawPolygon( triangle );
51 }
52 
ColorSlider(QWidget * parent)53 ColorSlider::ColorSlider( QWidget *parent )
54     : QAbstractSlider( parent )
55     , d( new Private( this ) )
56 {
57     setSizePolicy( QSizePolicy( QSizePolicy::Minimum ,QSizePolicy::Fixed) );
58     setMinimum( 0 );
59     setMaximum( 255 );
60     setValue( 25 );
61 }
62 
~ColorSlider()63 ColorSlider::~ColorSlider()
64 {
65     delete d;
66 }
67 
startColor() const68 QColor ColorSlider::startColor() const
69 {
70     return d->m_startColor;
71 }
setStartColor(const QColor & color)72 void ColorSlider::setStartColor( const QColor &color )
73 {
74     if ( d->m_startColor != color )
75     {
76         d->m_startColor = color;
77         Q_EMIT startColorChanged();
78         update();
79     }
80 }
endColor() const81 QColor ColorSlider::endColor() const
82 {
83     return d->m_endColor;
84 }
setEndColor(const QColor & color)85 void ColorSlider::setEndColor( const QColor &color )
86 {
87     if ( d->m_endColor != color )
88     {
89         d->m_endColor = color;
90         Q_EMIT startColorChanged();
91         update();
92     }
93 }
94 
paintEvent(QPaintEvent * event)95 void ColorSlider::paintEvent( QPaintEvent *event )
96 {
97     QAbstractSlider::paintEvent( event );
98     const double percentage = value() / ( double )( maximum() - minimum() );
99     QPainter painter( this );
100     QLinearGradient gradient;
101     gradient.setStart( 0, 0 );
102     gradient.setFinalStop( 1, 0 );
103     gradient.setCoordinateMode( QGradient::ObjectBoundingMode );
104     gradient.setColorAt( 0, d->m_startColor );
105     gradient.setColorAt( 1, d->m_endColor );
106     painter.setBrush( gradient );
107     painter.drawRect( event->rect() );
108 
109     painter.setBrush( Qt::white );
110     painter.save();
111     painter.translate( event->rect().width() * percentage, 0 );
112     QPen oldPen = painter.pen();
113     QPen linePen = oldPen;
114     linePen.setColor( Qt::white );
115     painter.setPen( linePen );
116     painter.drawLine( 0, 0, 0, rect().height() );
117     painter.setPen( oldPen );
118 
119     painter.save();
120     painter.translate( 0, rect().height() );
121     painter.rotate( 180 );
122     painter.scale( 15, 15 );
123     d->drawSliderMarker( &painter );
124     painter.restore();
125     painter.scale( 15, 15 );
126     d->drawSliderMarker( &painter );
127     painter.restore();
128 
129 }
130 
mousePressEvent(QMouseEvent * event)131 void ColorSlider::mousePressEvent(QMouseEvent *event )
132 {
133     if ( event->button() == Qt::LeftButton )
134     {
135         d->m_dragging = true;
136         const double relPos = qMin( 1.0, qMax( 0.0, event->localPos().x() / rect().width() ) );
137         setValue( (maximum() - minimum() ) * relPos );
138     }
139 }
140 
mouseReleaseEvent(QMouseEvent * event)141 void ColorSlider::mouseReleaseEvent(QMouseEvent *event )
142 {
143     if ( event->button() != Qt::LeftButton )
144     {
145         d->m_dragging = false;
146         const double relPos = qMin( 1.0, qMax( 0.0, event->localPos().x() / rect().width() ) );
147         setValue( (maximum() - minimum() ) * relPos );
148     }
149 }
150 
mouseMoveEvent(QMouseEvent * event)151 void ColorSlider::mouseMoveEvent( QMouseEvent *event )
152 {
153     if ( d->m_dragging )
154     {
155         const double relPos = qMin( 1.0, qMax( 0.0, event->localPos().x() / rect().width() ) );
156         setValue( (maximum() - minimum() ) * relPos );
157     }
158 }
159 
sizeHint() const160 QSize ColorSlider::sizeHint() const
161 {
162     return QSize( 300, 50 );
163 }
164