File indexing completed on 2024-05-12 04:33:23

0001 /*
0002  * SPDX-FileCopyrightText: 2007-2011 Kare Sars <kare.sars@iki .fi>
0003  * SPDX-FileCopyrightText: 2014 Gregor Mitsch : port to KDE5 frameworks
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  */
0007 
0008 #include "labeledslider.h"
0009 // Qt includes
0010 
0011 #include <QLabel>
0012 #include <QSlider>
0013 
0014 // KDE includes
0015 
0016 #include <KPluralHandlingSpinBox>
0017 #include <KSaneCore/Option>
0018 
0019 namespace KSaneIface
0020 {
0021 LabeledSlider::LabeledSlider(QWidget *parent, const QString &ltext,
0022                              int min, int max, int ste)
0023     : KSaneOptionWidget(parent, ltext)
0024 {
0025     initSlider(min, max, ste);
0026 }
0027 
0028 LabeledSlider::LabeledSlider(QWidget *parent, KSaneCore::Option *option)
0029     : KSaneOptionWidget(parent, option)
0030 {
0031     int maxValue = option->maximumValue().toInt();
0032     int minValue = option->minimumValue().toInt();
0033     int stepValue = option->stepValue().toInt();
0034 
0035     initSlider(minValue, maxValue, stepValue);
0036 
0037     KLocalizedString unitSuffix;
0038     KSaneCore::Option::OptionUnit unit = option->valueUnit();
0039     switch (unit) {
0040 
0041     case KSaneCore::Option::UnitPixel:
0042         unitSuffix = ki18ncp("SpinBox parameter unit", " Pixel", " Pixels");
0043         break;
0044     case KSaneCore::Option::UnitBit:
0045         unitSuffix = ki18ncp("SpinBox parameter unit", " Bit", " Bits");
0046         break;
0047     case KSaneCore::Option::UnitMilliMeter:
0048         unitSuffix = ki18ncp("SpinBox parameter unit (Millimeter)", " mm", " mm");
0049         break;
0050     case KSaneCore::Option::UnitDPI:
0051         unitSuffix = ki18ncp("SpinBox parameter unit (Dots Per Inch)", " DPI", " DPI");
0052         break;
0053     case KSaneCore::Option::UnitPercent:
0054         unitSuffix = ki18ncp("SpinBox parameter unit (Percentage)", " %", " %");
0055         break;
0056     case KSaneCore::Option::UnitMicroSecond:
0057         unitSuffix = ki18ncp("SpinBox parameter unit (Microseconds)", " µs", " µs");
0058         break;
0059     case KSaneCore::Option::UnitSecond:
0060         unitSuffix = ki18ncp("SpinBox parameter unit (seconds)", " s", " s");
0061         break;
0062     default:
0063         unitSuffix = KLocalizedString();
0064         break;
0065     }
0066 
0067     setSuffix(unitSuffix);
0068     setLabelText(option->title());
0069     setToolTip(option->description());
0070     connect(this, &LabeledSlider::valueChanged, option, &KSaneCore::Option::setValue);
0071     connect(option, &KSaneCore::Option::valueChanged, this, &LabeledSlider::setValue);
0072     int value = option->value().toInt();
0073     setValue(value);
0074 }
0075 
0076 LabeledSlider::~LabeledSlider()
0077 {
0078 }
0079 
0080 void LabeledSlider::initSlider(int minValue, int maxValue, int stepValue)
0081 {
0082     m_step = stepValue;
0083     if (m_step == 0) {
0084         m_step = 1;
0085     }
0086 
0087     m_slider = new QSlider(this);
0088     m_slider->setOrientation(Qt::Horizontal);
0089     m_slider->setMinimum(minValue);
0090     m_slider->setMaximum(maxValue);
0091     m_slider->setSingleStep(m_step);
0092 
0093     m_spinb = new KPluralHandlingSpinBox(this);
0094     m_spinb->setMinimum(minValue);
0095     m_spinb->setMaximum(maxValue);
0096     m_slider->setSingleStep(m_step);
0097     m_spinb->setValue(maxValue);
0098     //m_spinb->setMinimumWidth(m_spinb->sizeHint().width()+35);
0099     m_spinb->setAlignment(Qt::AlignRight);
0100     m_spinb->setValue(minValue);
0101 
0102     m_spinb->setValue(minValue);
0103     m_label->setBuddy(m_spinb);
0104 
0105     connect(m_spinb, QOverload<int>::of(&QSpinBox::valueChanged), this, &LabeledSlider::syncValues);
0106     connect(m_slider, &QSlider::valueChanged, this, &LabeledSlider::syncValues);
0107     connect(m_slider, &QSlider::sliderReleased, this, &LabeledSlider::fixValue);
0108 
0109     m_layout->addWidget(m_slider, 0, 2);
0110     m_layout->addWidget(m_spinb, 0, 1);
0111     m_layout->setColumnStretch(1, 0);
0112     m_layout->setColumnStretch(2, 50);
0113 }
0114 
0115 void LabeledSlider::setSuffix(const KLocalizedString &text)
0116 {
0117     m_spinb->setSuffix(text);
0118 }
0119 
0120 void LabeledSlider::setValue(const QVariant &val)
0121 {
0122     bool ok;
0123     int value = val.toInt(&ok);
0124     if (!ok) {
0125         return;
0126     }
0127     if (value != m_slider->value()) {
0128         m_slider->setValue(value);
0129     } else if (value != m_spinb->value()) {
0130         m_spinb->setValue(value);
0131     }
0132 }
0133 
0134 void LabeledSlider::setRange(int min, int max)
0135 {
0136     //std::cout << "min=" << min << ", max=" << max << std::endl;
0137     m_slider->setRange(min, max);
0138     m_spinb->setRange(min, max);
0139 }
0140 
0141 void LabeledSlider::setStep(int st)
0142 {
0143     m_step = st;
0144     if (m_step == 0) {
0145         m_step = 1;
0146     }
0147     m_slider->setSingleStep(m_step);
0148     m_spinb->setSingleStep(m_step);
0149 }
0150 
0151 void LabeledSlider::syncValues(int value)
0152 {
0153     if (value != m_spinb->value()) {
0154         m_spinb->setValue(value);
0155     } else if (value != m_slider->value()) {
0156         //ensure that the value m_step is followed also for the m_slider
0157         if ((value - m_slider->minimum()) % m_step != 0) {
0158             if (value > m_spinb->value()) {
0159                 m_slider->setValue(m_slider->value() + (m_step - (value - m_spinb->value())));
0160             } else {
0161                 m_slider->setValue(m_slider->value() - (m_step - (m_spinb->value() - value)));
0162             }
0163             // this function will be reentered with the signal fom the m_slider
0164         } else {
0165             m_slider->setValue(value);
0166         }
0167     } else {
0168         Q_EMIT valueChanged(value);
0169     }
0170 }
0171 
0172 void LabeledSlider::fixValue()
0173 {
0174     //ensure that the value m_step is followed also for the m_slider
0175     int rest = (m_slider->value() - m_slider->minimum()) % m_step;
0176 
0177     if (rest != 0) {
0178         if (rest > (m_step / 2)) {
0179             m_slider->setValue(m_slider->value() + (m_step - rest));
0180         } else {
0181             m_slider->setValue(m_slider->value() - rest);
0182         }
0183         m_spinb->setValue(m_slider->value());
0184     }
0185 }
0186 int LabeledSlider::value() const
0187 {
0188     return (m_slider->value());
0189 }
0190 
0191 }  // NameSpace KSaneIface
0192 
0193 #include "moc_labeledslider.cpp"