57 lines
1.3 KiB
C++
57 lines
1.3 KiB
C++
|
#include "fancyslider.h"
|
||
|
#include "qboxlayout.h"
|
||
|
|
||
|
#include <cmath>
|
||
|
|
||
|
FancySlider::FancySlider(QWidget *parent)
|
||
|
: QWidget{parent}
|
||
|
{
|
||
|
QHBoxLayout* hbox = new QHBoxLayout(this);
|
||
|
hbox->setMargin(0);
|
||
|
hbox->setContentsMargins(0, 0, 0, 0);
|
||
|
setLayout(hbox);
|
||
|
|
||
|
slider = new QSlider();
|
||
|
slider->setOrientation(Qt::Orientation::Horizontal);
|
||
|
slider->setMaximum(sliderResolution);
|
||
|
|
||
|
box = new QDoubleSpinBox();
|
||
|
label = new QLabel();
|
||
|
|
||
|
layout()->addWidget(slider);
|
||
|
layout()->addWidget(box);
|
||
|
layout()->addWidget(label);
|
||
|
|
||
|
connect(box, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &FancySlider::setValue);
|
||
|
connect(slider, &QSlider::valueChanged, this, [&](int v)
|
||
|
{
|
||
|
setValue(((v / (double)sliderResolution) * (max - min)) + min);
|
||
|
});
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
void FancySlider::setValue(double v)
|
||
|
{
|
||
|
if (v != value)
|
||
|
{
|
||
|
value = v;
|
||
|
updateValues();
|
||
|
|
||
|
emit valueChanged(value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void FancySlider::updateValues()
|
||
|
{
|
||
|
box->setMaximum(max);
|
||
|
box->setMinimum(min);
|
||
|
if (value != box->value())
|
||
|
box->setValue(value);
|
||
|
|
||
|
slider->setValue(((value - min) / (max - min)) * sliderResolution);
|
||
|
|
||
|
box->setSingleStep((max-min) / sliderResolution);
|
||
|
box->setDecimals(std::ceil(-std::log10(box->singleStep())));
|
||
|
}
|