Files
qad/libs/widgets/spinslider.cpp
peri4 46fd68a0fd SpinSlider and ScrollSpinBox read-only support
PIVariantEdit - support for read-only for all types
PIValueTreeEdit - drop Parent grouping, default now Groups, full grouping control, global read-only support, fix new label error
2023-04-28 19:51:22 +03:00

119 lines
2.9 KiB
C++

#include "spinslider.h"
#include <qmath.h>
SpinSlider::SpinSlider(QWidget * parent): QWidget(parent) {
min_ = val_ = 0.;
max_ = 100.;
dec_ = 1;
page = 10.;
ticks_ = 1;
direc = LeftToRight;
square = false;
slider = new QSlider();
slider->setOrientation(Qt::Horizontal);
slider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
spin = new QDoubleSpinBox();
adjust();
layout = new QBoxLayout(QBoxLayout::LeftToRight);
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(slider);
layout->addWidget(spin);
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(sliderChanged(int)));
connect(spin, SIGNAL(valueChanged(double)), this, SLOT(spinChanged(double)));
setLayout(layout);
}
SpinSlider::~SpinSlider() {
delete spin;
delete slider;
delete layout;
}
void SpinSlider::setOrientation(Qt::Orientation orient) {
slider->setOrientation(orient);
if (orient == Qt::Horizontal)
slider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
else
slider->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
}
bool SpinSlider::adaptiveStep() const {
#if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0))
return (spin->stepType() == QDoubleSpinBox::AdaptiveDecimalStepType);
#endif
return false;
}
void SpinSlider::setReadOnly(bool r) {
m_read_only = r;
spin->setReadOnly(r);
slider->setEnabled(!r);
}
void SpinSlider::setAdaptiveStep(bool on) {
#if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0))
if (on)
spin->setStepType(QDoubleSpinBox::AdaptiveDecimalStepType);
else
spin->setStepType(QDoubleSpinBox::DefaultStepType);
#endif
}
void SpinSlider::adjust() {
adjusting = true;
delim = qPow(10, dec_);
spin->setDecimals(dec_);
spin->setRange(min_, max_);
if (square)
slider->setRange(sqrt(min_ * delim), sqrt(max_ * delim));
else
slider->setRange(min_ * delim, max_ * delim);
if (val_ < min_) val_ = min_;
if (val_ > max_) val_ = max_;
spin->setValue(val_);
if (square)
slider->setValue(static_cast<int>(sqrt(val_ * delim)));
else
slider->setValue(static_cast<int>(val_ * delim));
slider->setPageStep(qRound(page * delim));
slider->setTickInterval(qRound(ticks_ * delim));
emit valueChanged(val_);
emit valueChangedInt(qRound(val_));
adjusting = false;
}
void SpinSlider::sliderChanged(int value) {
if (adjusting) return;
adjusting = true;
if (square)
spin->setValue(static_cast<double>(sqr(value) / delim));
else
spin->setValue(static_cast<double>(value) / delim);
val_ = spin->value();
emit valueChanged(val_);
emit valueChangedInt(qRound(val_));
adjusting = false;
}
void SpinSlider::spinChanged(double value) {
if (adjusting) return;
adjusting = true;
val_ = value;
if (square)
slider->setValue(static_cast<int>(sqrt(value * delim)));
else
slider->setValue(qRound(value * delim));
emit valueChanged(val_);
emit valueChangedInt(qRound(val_));
adjusting = false;
}