xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/screen/sliderwidget.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include "sliderwidget.h"
2*4882a593Smuzhiyun #include <QPainter>
3*4882a593Smuzhiyun #include <QMouseEvent>
4*4882a593Smuzhiyun #include <qmath.h>
5*4882a593Smuzhiyun #include <QDebug>
6*4882a593Smuzhiyun #include <QDebug>
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun class SliderWidgetPrivate
9*4882a593Smuzhiyun {
10*4882a593Smuzhiyun public:
11*4882a593Smuzhiyun     int min =0;
12*4882a593Smuzhiyun     int max=10;
13*4882a593Smuzhiyun     int value=0;
14*4882a593Smuzhiyun     qreal mousePress;
15*4882a593Smuzhiyun     qreal margin=2.0;
16*4882a593Smuzhiyun     qreal sliderWidth ;
17*4882a593Smuzhiyun     qreal sliderHeight;
18*4882a593Smuzhiyun     qreal sliderH;
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun     qreal blockHeight;
21*4882a593Smuzhiyun     qreal blockWidth;
22*4882a593Smuzhiyun     qreal minHeight;
23*4882a593Smuzhiyun     qreal maxHeight;
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun     void handBlockShowRange();
26*4882a593Smuzhiyun     void handValueRang();
27*4882a593Smuzhiyun     void handleMousepress();
28*4882a593Smuzhiyun     void handleValue();
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 
SliderWidget(QWidget * parent)32*4882a593Smuzhiyun SliderWidget::SliderWidget(QWidget *parent) : QWidget(parent),
33*4882a593Smuzhiyun     m_d(new SliderWidgetPrivate)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun     setMaximumWidth(30);
36*4882a593Smuzhiyun     setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun 
~SliderWidget()39*4882a593Smuzhiyun SliderWidget::~SliderWidget()
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun     delete m_d;
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun 
setRange(int min,int max)44*4882a593Smuzhiyun void SliderWidget::setRange(int min, int max)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun     m_d->max = max;
47*4882a593Smuzhiyun     m_d->min = min;
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun 
value()50*4882a593Smuzhiyun int SliderWidget::value()
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun     return m_d->value;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun 
setValue(int value)55*4882a593Smuzhiyun void SliderWidget::setValue(int value)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun     m_d->value =value;
58*4882a593Smuzhiyun     m_d->handleValue();
59*4882a593Smuzhiyun     this->update();
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
mousePressEvent(QMouseEvent * e)62*4882a593Smuzhiyun void SliderWidget::mousePressEvent(QMouseEvent *e)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun     mouseMoveEvent(e);
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun 
mouseMoveEvent(QMouseEvent * e)67*4882a593Smuzhiyun void SliderWidget::mouseMoveEvent(QMouseEvent *e)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun     m_d->mousePress = e->pos().y();
70*4882a593Smuzhiyun     m_d->handleMousepress();
71*4882a593Smuzhiyun     emit valueChanged(m_d->value);
72*4882a593Smuzhiyun     this->update();
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun 
paintEvent(QPaintEvent * e)75*4882a593Smuzhiyun void SliderWidget::paintEvent(QPaintEvent *e)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun     Q_UNUSED(e)
78*4882a593Smuzhiyun     QPainter painter(this);
79*4882a593Smuzhiyun     QRectF sliderRect(m_d->margin, m_d->margin, m_d->sliderWidth, m_d->sliderHeight);
80*4882a593Smuzhiyun     painter.drawRect(sliderRect);
81*4882a593Smuzhiyun     QRectF fillRect(m_d->margin, m_d->mousePress,   m_d->sliderWidth, height()-m_d->mousePress);
82*4882a593Smuzhiyun     painter.setBrush(Qt::blue);
83*4882a593Smuzhiyun     painter.drawRect(fillRect);
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun     QRectF blockRect(1, m_d->mousePress,  m_d->blockWidth, m_d->blockHeight);
86*4882a593Smuzhiyun     painter.setBrush(Qt::gray);
87*4882a593Smuzhiyun     painter.drawRect(blockRect);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
resizeEvent(QResizeEvent * e)91*4882a593Smuzhiyun void SliderWidget::resizeEvent(QResizeEvent *e)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun     QWidget::resizeEvent(e);
94*4882a593Smuzhiyun     m_d->sliderWidth = width() - m_d->margin*2;
95*4882a593Smuzhiyun     m_d->blockHeight = width()/2;
96*4882a593Smuzhiyun     m_d->sliderHeight = height()-m_d->blockHeight;
97*4882a593Smuzhiyun     m_d->blockWidth = width()-2;
98*4882a593Smuzhiyun     m_d->sliderH = height() -m_d->margin-m_d->blockHeight;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     //    qDebug()<<"sliderHeight"<<m_d->sliderHeight;
101*4882a593Smuzhiyun     //    qDebug()<<"value "<<m_d->value;
102*4882a593Smuzhiyun     //    qDebug()<<"blockHeight "<<m_d->blockHeight;
103*4882a593Smuzhiyun     //    qDebug()<<"value "<<m_d->value;
104*4882a593Smuzhiyun     //    qDebug()<<"sliderH "<<m_d->sliderH;
105*4882a593Smuzhiyun     //    qDebug()<<"max-min "<<m_d->max -m_d->min;
106*4882a593Smuzhiyun     m_d->handleValue();
107*4882a593Smuzhiyun     //    qDebug()<<"mouse : "<< m_d->mousePress;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun 
sizeHint() const110*4882a593Smuzhiyun QSize SliderWidget::sizeHint() const
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun     return QSize(25, 100);
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
handValueRang()115*4882a593Smuzhiyun void SliderWidgetPrivate::handValueRang()
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun     if(value <= min)
118*4882a593Smuzhiyun     {
119*4882a593Smuzhiyun         value =min;
120*4882a593Smuzhiyun     }else if(value >= max)
121*4882a593Smuzhiyun     {
122*4882a593Smuzhiyun         value = max;
123*4882a593Smuzhiyun     }
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun 
handBlockShowRange()126*4882a593Smuzhiyun void SliderWidgetPrivate::handBlockShowRange()
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun     //处理滑块最小位置.
129*4882a593Smuzhiyun     if(mousePress> sliderHeight)
130*4882a593Smuzhiyun     {
131*4882a593Smuzhiyun         mousePress = sliderHeight;
132*4882a593Smuzhiyun     }
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun     //处理滑块最大位置.
135*4882a593Smuzhiyun     if(mousePress <(margin))
136*4882a593Smuzhiyun     {
137*4882a593Smuzhiyun         mousePress =margin;
138*4882a593Smuzhiyun     }
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 
handleMousepress()142*4882a593Smuzhiyun void SliderWidgetPrivate::handleMousepress()
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun     handBlockShowRange();
145*4882a593Smuzhiyun     qreal dev = (max-min)/sliderH;
146*4882a593Smuzhiyun     value = (sliderHeight-mousePress)*dev + min;
147*4882a593Smuzhiyun     handValueRang();
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun 
handleValue()150*4882a593Smuzhiyun void  SliderWidgetPrivate::handleValue()
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun     qreal dev = (max-min)/sliderH ;
153*4882a593Smuzhiyun     mousePress = sliderHeight - (value-min)/dev;
154*4882a593Smuzhiyun     handBlockShowRange();
155*4882a593Smuzhiyun }
156