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"