File indexing completed on 2024-05-19 04:29:50
0001 /* This file is part of the KDE project 0002 * SPDX-FileCopyrightText: 2010 Cyrille Berger <cberger@cberger.net> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "kis_multipliers_double_slider_spinbox.h" 0008 #include "kis_multipliers_double_slider_spinbox_p.h" 0009 #include <QHBoxLayout> 0010 #include <kis_debug.h> 0011 #include <klocalizedstring.h> 0012 0013 qreal KisMultipliersDoubleSliderSpinBox::Private::currentMultiplier() 0014 { 0015 return cmbMultiplier->itemData(cmbMultiplier->currentIndex()).toDouble(); 0016 } 0017 0018 void KisMultipliersDoubleSliderSpinBox::Private::updateRange() 0019 { 0020 qreal m = currentMultiplier(); 0021 slider->setRange(m * min, m * max, decimals); 0022 } 0023 0024 KisMultipliersDoubleSliderSpinBox::KisMultipliersDoubleSliderSpinBox(QWidget* _parent) 0025 : QWidget(_parent) 0026 , d(new Private) 0027 { 0028 QHBoxLayout *l = new QHBoxLayout(this); 0029 l->setContentsMargins(0, 0, 0, 0); 0030 0031 d->slider = new KisDoubleSliderSpinBox(this); 0032 d->slider->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); 0033 l->addWidget(d->slider); 0034 0035 d->cmbMultiplier = new QComboBox(this); 0036 d->cmbMultiplier->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); 0037 l->addWidget(d->cmbMultiplier); 0038 0039 addMultiplier(1.0); 0040 connect(d->slider, SIGNAL(valueChanged(qreal)), SIGNAL(valueChanged(qreal))); 0041 connect(d->cmbMultiplier, SIGNAL(activated(int)), SLOT(updateRange())); 0042 } 0043 0044 KisMultipliersDoubleSliderSpinBox::~KisMultipliersDoubleSliderSpinBox() 0045 { 0046 delete d; 0047 } 0048 0049 void KisMultipliersDoubleSliderSpinBox::addMultiplier(double v) 0050 { 0051 d->cmbMultiplier->addItem(i18n("x%1", v), v); 0052 } 0053 0054 void KisMultipliersDoubleSliderSpinBox::setRange(qreal minimum, qreal maximum, int decimals) 0055 { 0056 d->min = minimum; 0057 d->max = maximum; 0058 d->decimals = decimals; 0059 d->updateRange(); 0060 } 0061 0062 qreal KisMultipliersDoubleSliderSpinBox::value() 0063 { 0064 return d->slider->value(); 0065 } 0066 0067 void KisMultipliersDoubleSliderSpinBox::setValue(qreal value) 0068 { 0069 qreal m = d->currentMultiplier(); 0070 0071 if (value < m * d->min || value > m * d->max) { 0072 for(int i = 0; i < d->cmbMultiplier->count(); ++i) { 0073 qreal m = d->cmbMultiplier->itemData(i).toDouble(); 0074 if (value >= m * d->min && value <= m * d->max) { 0075 d->cmbMultiplier->setCurrentIndex(i); 0076 d->updateRange(); 0077 break; 0078 } 0079 } 0080 } 0081 0082 d->slider->setValue(value); 0083 } 0084 0085 void KisMultipliersDoubleSliderSpinBox::setExponentRatio(qreal dbl) 0086 { 0087 d->slider->setExponentRatio(dbl); 0088 } 0089 0090 void KisMultipliersDoubleSliderSpinBox::setPrefix(const QString& prefix) 0091 { 0092 d->slider->setPrefix(prefix); 0093 } 0094 0095 void KisMultipliersDoubleSliderSpinBox::setSuffix(const QString& suffix) 0096 { 0097 d->slider->setSuffix(suffix); 0098 } 0099 0100 void KisMultipliersDoubleSliderSpinBox::setBlockUpdateSignalOnDrag(bool block) 0101 { 0102 d->slider->setBlockUpdateSignalOnDrag(block); 0103 } 0104 0105 void KisMultipliersDoubleSliderSpinBox::setSingleStep(qreal value) 0106 { 0107 d->slider->setSingleStep(value); 0108 } 0109 0110 QSize KisMultipliersDoubleSliderSpinBox::sizeHint() const 0111 { 0112 QSize sliderhint = d->slider->sizeHint(); 0113 QSize comboboxhint = d->cmbMultiplier->sizeHint(); 0114 sliderhint.setWidth(sliderhint.width() + comboboxhint.width() + 10); 0115 sliderhint.setHeight(qMax(sliderhint.height(), comboboxhint.height())); 0116 return sliderhint; 0117 } 0118 0119 QSize KisMultipliersDoubleSliderSpinBox::minimumSizeHint() const 0120 { 0121 return sizeHint(); 0122 } 0123 0124 QSize KisMultipliersDoubleSliderSpinBox::minimumSize() const 0125 { 0126 return QWidget::minimumSize(); 0127 } 0128 0129 #include "moc_kis_multipliers_double_slider_spinbox.cpp"