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 <ext, 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"