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