YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
sliderWithTarget.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-FileCopyrightText: 2006-2010 RobotCub Consortium
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6
7#include "sliderWithTarget.h"
8#include <QKeyEvent>
9#include <QPainter>
10#include <QStyle>
11#include <cmath>
12
13//just because old VS2010 does not implement round() function in cmath
14double my_round(double number)
15{
16 return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
17}
18
19SliderWithTarget::SliderWithTarget(QWidget * parent) : QSlider(Qt::Horizontal, nullptr)
20{
21 sliderCurrentLabel = new QLabel(this);
22 sliderCurrentLabel->setObjectName(QStringLiteral("sliderLabel"));
23 sliderCurrentLabel->setGeometry(QRect(0, 0, 100, 20));
24 sliderCurrentLabel->setMinimumSize(QSize(40, 20));
25 sliderCurrentLabel->setMaximumSize(QSize(16777215, 20));
26 sliderCurrentLabel->setAlignment(Qt::AlignCenter);
27 sliderCurrentLabel->setStyleSheet("background-color: rgba(0,0,0,0%)");
28
29 sliderTargetLabel = new QLabel(this);
30 sliderTargetLabel->setObjectName(QStringLiteral("sliderTargetLabel"));
31 sliderTargetLabel->setGeometry(QRect(0, 0, 100, 20));
32 sliderTargetLabel->setMinimumSize(QSize(40, 20));
33 sliderTargetLabel->setMaximumSize(QSize(16777215, 20));
34 sliderTargetLabel->setAlignment(Qt::AlignCenter);
35 sliderTargetLabel->setStyleSheet("background-color: rgba(0,0,0,0%)");
36
38 target=-1e50; //default value is intensionally set out of the slider
39 width_at_target = this->width() - 30;
40 isDouble = false;
41}
42
44{
45 sliderStep = step;
46}
47
49{
50 return sliderStep;
51}
52
54{
55 isDouble = b;
56}
57
59{
60 return isDouble;
61}
62
64{
65 if (isDouble)
66 {
67 //QSlider::setValue(round(val*sliderStep));
68 QSlider::setValue(my_round(val*sliderStep));
69 }
70 else
71 {
72 QSlider::setValue(val);
73 }
74}
75
77{
78 target = t;
79 width_at_target= this->width()-30;
80 this->update(); //force the repaint of the widget
81}
82
84{
85 target = -1e50;
86 width_at_target = this->width() - 30;
87 this->update(); //force the repaint of the widget
88}
89
90void SliderWithTarget::paintEvent(QPaintEvent *e)
91{
92 QSlider::paintEvent(e);
93 double w = this->width() - 30;
94 int totValues = this->maximum() + abs(this->minimum());
95
97 {
98 QPainter p(this);
99 double newX = ((double)w / (double)totValues) * (target*sliderStep + abs(this->minimum()));
100 QRect r(newX, 17, 30, 15);
101 p.fillRect(r, QBrush(QColor(128, 128, 255, 128)));
102 p.drawRect(r);
103 }
104 if (enableViewLabel)
105 {
106 double value = this->value();
107 double newX = ((double)w / (double)totValues) * ((double)value + abs(this->minimum()));
108 QString label_text = QString("%L1").arg((double)value / sliderStep, 0, 'f', number_of_decimals);
109 sliderCurrentLabel->setText(label_text);
110 sliderCurrentLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
111 //these adjustment are required to have the label properly aligned and
112 //to avoid overflow
113 if (newX<0) newX = 0;
114 if (newX>w-30) newX = w-30;
115 sliderCurrentLabel->setGeometry(newX, -10, 60, 20);
116 }
118 {
119 double newX = ((double)w / (double)totValues) * ((double)target + abs(this->minimum()));
120 QString label_text = QString("Ref:%L1").arg((double)target, 0, 'f', number_of_decimals);
121 sliderTargetLabel->setText(label_text);
122 sliderTargetLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
123 //these adjustment are required to have the label properly aligned and
124 //to avoid overflow
125 if (newX < 0) newX = 0;
126 if (newX > w - 30) newX = w - 30;
127 sliderTargetLabel->setGeometry(newX, +10, 60, 20);
128 }
129 else
130 {
131 sliderTargetLabel->setText("");
132 }
133}
134
135void SliderWithTarget::mousePressEvent(QMouseEvent * event)
136{
137 if (event->button() == Qt::LeftButton)
138 {
139 double myx = event->x();
140 QStyleOptionSlider opt;
141 initStyleOption(&opt);
142 QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
143
144 //throw aways clicks that are not on the handle
146 {
147 if (myx<sr.left()+3 || myx>sr.right()-3)
148 {
149 return;
150 }
151 }
152
153 //setValue(minimum() + ((maximum() - minimum()) * myx) / width());
154 event->accept();
155 }
156 QSlider::mousePressEvent(event);
157}
158
void mousePressEvent(QMouseEvent *event) override
void setIsDouble(bool b)
void updateSliderTarget(double val)
void setSliderStep(double val)
void paintEvent(QPaintEvent *ev) override
SliderWithTarget(QWidget *parent=0)
void setValue(double val)
QLabel * sliderCurrentLabel
double my_round(double number)