1 /***************************************************************************
2                              qgsdial.cpp
3                              -------------------
4     begin                : July 2013
5     copyright            : (C) 2013 by Daniel Vaz
6     email                : danielvaz at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include "qgsdial.h"
19 #include "qgslogger.h"
20 
21 #include <QPaintEvent>
22 #include <QPainter>
23 #include <QRect>
24 #include <cmath>
25 
QgsDial(QWidget * parent)26 QgsDial::QgsDial( QWidget *parent ) : QDial( parent )
27 {
28   setMinimumSize( QSize( 50, 50 ) );
29 }
30 
paintEvent(QPaintEvent * event)31 void QgsDial::paintEvent( QPaintEvent *event )
32 {
33   QDial::paintEvent( event );
34   QPainter painter( this );
35   const QRect rect = geometry();
36   painter.setPen( QPen( palette().color( QPalette::WindowText ) ) );
37   painter.drawText( QRectF( 0, rect.height() * 0.65, rect.width(), rect.height() ),
38                     Qt::AlignHCenter, variantValue().toString(), nullptr );
39   painter.end();
40 }
41 
setMinimum(const QVariant & min)42 void QgsDial::setMinimum( const QVariant &min )
43 {
44   mMin = min;
45   update();
46 }
47 
setMaximum(const QVariant & max)48 void QgsDial::setMaximum( const QVariant &max )
49 {
50   mMax = max;
51   update();
52 }
53 
setSingleStep(const QVariant & step)54 void QgsDial::setSingleStep( const QVariant &step )
55 {
56   mStep = step;
57   update();
58 }
59 
setValue(const QVariant & value)60 void QgsDial::setValue( const QVariant &value )
61 {
62   mValue = value;
63   update();
64 }
65 
update()66 void QgsDial::update()
67 {
68   if ( mMin.isNull() || mMax.isNull() || mStep.isNull() )
69     return;
70 
71   if ( mValue.isNull() )
72     mValue = mMin;
73 
74   if ( mMin.type() == QVariant::Int &&
75        mMax.type() == QVariant::Int &&
76        mStep.type() == QVariant::Int &&
77        mValue.type() == QVariant::Int )
78   {
79     QDial::setMinimum( mMin.toInt() );
80     QDial::setMaximum( mMax.toInt() );
81     QDial::setSingleStep( mStep.toInt() );
82     QDial::setValue( mValue.toInt() );
83   }
84 
85   if ( mMin.type() == QVariant::Double &&
86        mMax.type() == QVariant::Double &&
87        mStep.type() == QVariant::Double &&
88        mValue.type() == QVariant::Double )
89   {
90     if ( minimum() != 0 )
91       QDial::setMinimum( 0 );
92 
93     const int max = std::ceil( ( mMax.toDouble() - mMin.toDouble() ) / mStep.toDouble() );
94     if ( maximum() != max )
95       QDial::setMaximum( max );
96 
97     if ( singleStep() != 1 )
98       QDial::setSingleStep( 1 );
99 
100     QDial::setValue( std::ceil( ( mValue.toDouble() - mMin.toDouble() ) / mStep.toDouble() ) );
101   }
102 
103   connect( this, static_cast < void ( QDial::* )( int ) > ( &QDial::valueChanged ), this, &QgsDial::onValueChanged );
104 }
105 
variantValue() const106 QVariant QgsDial::variantValue() const
107 {
108   return mValue;
109 }
110 
onValueChanged(int value)111 void QgsDial::onValueChanged( int value )
112 {
113   if ( mMin.isNull() || mMax.isNull() || mStep.isNull() )
114   {
115     mValue = QVariant();
116   }
117   else if ( mMin.type() == QVariant::Int &&
118             mMax.type() == QVariant::Int &&
119             mStep.type() == QVariant::Int &&
120             mValue.type() == QVariant::Int )
121   {
122     mValue = value;
123   }
124   else if ( mMin.type() == QVariant::Double &&
125             mMax.type() == QVariant::Double &&
126             mStep.type() == QVariant::Double &&
127             mValue.type() == QVariant::Double )
128   {
129     mValue = QVariant( mMin.toDouble() + value * mStep.toDouble() );
130   }
131   emit valueChanged( mValue );
132 }
133