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 }