// SPDX-License-Identifier: MIT #include "valuecontrol.h" #include #include #include ValueControl::ValueControl(QWidget *parent) : QWidget(parent), m_slider(new QSlider(Qt::Horizontal, this)), m_number(new QSpinBox(this)) { auto *layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_slider, 1); layout->addWidget(m_number); m_slider->setMinimumWidth(100); setFocusProxy(m_number); connect(m_slider, &QSlider::valueChanged, m_number, &QSpinBox::setValue); connect(m_number, &QSpinBox::valueChanged, m_slider, &QSlider::setValue); connect(m_number, &QSpinBox::valueChanged, this, &ValueControl::valueChanged); setRange(0, 100); } void ValueControl::setRange(int minimum, int maximum) { // Block the slider while changing its range so its old value cannot clamp // the number field before both controls have the new bounds. const QSignalBlocker block(m_slider); m_slider->setRange(minimum, maximum); m_number->setRange(minimum, maximum); m_slider->setValue(m_number->value()); m_slider->setPageStep(std::max(1, (maximum - minimum) / 10)); updateRangeHint(); } void ValueControl::setSuffix(const QString &suffix) { m_number->setSuffix(suffix); updateRangeHint(); } void ValueControl::setSingleStep(int step) { m_slider->setSingleStep(step); m_number->setSingleStep(step); } void ValueControl::updateRangeHint() { m_slider->setToolTip(QString("%1–%2%3").arg(m_number->minimum()).arg(m_number->maximum()).arg(m_number->suffix())); }