File indexing completed on 2024-05-19 04:29:28

0001 /*
0002  * SPDX-FileCopyrightText: 2020 Mathias Wein <lynx.mw+kde@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisSpinboxHSXSelector.h"
0008 
0009 #include <QFormLayout>
0010 #include <QLabel>
0011 #include <QList>
0012 #include <QSignalBlocker>
0013 #include "kis_double_parse_spin_box.h"
0014 
0015 struct KisSpinboxHSXSelector::Private
0016 {
0017     QList <QLabel*> labels;
0018     QList <KisDoubleParseSpinBox*> spinBoxes;
0019     QFormLayout *layout {0};
0020     KisVisualColorModelSP selectorModel;
0021 };
0022 
0023 KisSpinboxHSXSelector::KisSpinboxHSXSelector(QWidget *parent)
0024     : QWidget(parent)
0025     , m_d(new Private)
0026 {
0027     m_d->layout = new QFormLayout(this);
0028     for (int i = 0; i < 3; i++){
0029         m_d->labels.push_back(new QLabel(this));
0030         m_d->spinBoxes.push_back(new KisDoubleParseSpinBox(this));
0031         m_d->layout->addRow(m_d->labels[i], m_d->spinBoxes[i]);
0032         connect(m_d->spinBoxes.back(), SIGNAL(valueChanged(double)), this, SLOT(slotSpinBoxChanged()));
0033     }
0034     m_d->labels[0]->setText(i18n("Hue:"));
0035     m_d->labels[1]->setText(i18n("Saturation:"));
0036     m_d->labels[2]->setText("<x>:");
0037     m_d->spinBoxes[0]->setMaximum(360.0);
0038     m_d->spinBoxes[1]->setMaximum(100.0);
0039     m_d->spinBoxes[2]->setMaximum(100.0);
0040     m_d->spinBoxes[0]->setSuffix(" °");
0041     m_d->spinBoxes[1]->setSuffix(" %");
0042     m_d->spinBoxes[2]->setSuffix(" %");
0043 }
0044 
0045 KisSpinboxHSXSelector::~KisSpinboxHSXSelector()
0046 {
0047 }
0048 
0049 void KisSpinboxHSXSelector::setModel(KisVisualColorModelSP model)
0050 {
0051     if (m_d->selectorModel) {
0052         m_d->selectorModel->disconnect(this);
0053         disconnect(m_d->selectorModel.data());
0054     }
0055     m_d->selectorModel = model;
0056     if (model) {
0057         connect(model.data(), SIGNAL(sigColorModelChanged()), this, SLOT(slotColorModelChanged()));
0058         slotColorModelChanged();
0059         if (model->isHSXModel()) {
0060             slotChannelValuesChanged(model->channelValues());
0061         }
0062     }
0063 }
0064 
0065 void KisSpinboxHSXSelector::slotColorModelChanged()
0066 {
0067     if (!m_d->selectorModel) {
0068         return;
0069     }
0070 
0071     if (m_d->selectorModel->isHSXModel()) {
0072         switch (m_d->selectorModel->colorModel()) {
0073         case KisVisualColorModel::HSV:
0074             m_d->labels[2]->setText(i18n("Value:"));
0075             break;
0076         case KisVisualColorModel::HSL:
0077             m_d->labels[2]->setText(i18n("Lightness:"));
0078             break;
0079         case KisVisualColorModel::HSI:
0080             m_d->labels[2]->setText(i18n("Intensity:"));
0081             break;
0082         case KisVisualColorModel::HSY:
0083             m_d->labels[2]->setText(i18n("Luma:"));
0084             break;
0085         default:
0086             break;
0087         }
0088         connect(m_d->selectorModel.data(), SIGNAL(sigChannelValuesChanged(QVector4D,quint32)),
0089                 this, SLOT(slotChannelValuesChanged(QVector4D)), Qt::UniqueConnection);
0090         connect(this, SIGNAL(sigChannelValuesChanged(QVector4D)),
0091                 m_d->selectorModel.data(), SLOT(slotSetChannelValues(QVector4D)), Qt::UniqueConnection);
0092     } else {
0093         m_d->selectorModel->disconnect(SIGNAL(sigChannelValuesChanged(QVector4D,quint32)), this);
0094         disconnect(SIGNAL(sigChannelValuesChanged(QVector4D)));
0095     }
0096 }
0097 
0098 void KisSpinboxHSXSelector::slotChannelValuesChanged(const QVector4D &values)
0099 {
0100     const QSignalBlocker s1(m_d->spinBoxes[0]), s2(m_d->spinBoxes[1]), s3(m_d->spinBoxes[2]);
0101     m_d->spinBoxes[0]->setValue(values[0] * 360.0);
0102     m_d->spinBoxes[1]->setValue(values[1] * 100.0);
0103     m_d->spinBoxes[2]->setValue(values[2] * 100.0);
0104 }
0105 
0106 void KisSpinboxHSXSelector::slotSpinBoxChanged()
0107 {
0108     QVector4D hsx(m_d->spinBoxes[0]->value() / 360.0,
0109                   m_d->spinBoxes[1]->value() / 100.0,
0110                   m_d->spinBoxes[2]->value() / 100.0,
0111                   0);
0112     emit sigChannelValuesChanged(hsx);
0113 }