File indexing completed on 2024-05-12 16:02:04

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 #include "KisVisualColorSelector.h"
0015 
0016 struct KisSpinboxHSXSelector::Private
0017 {
0018     QList <QLabel*> labels;
0019     QList <KisDoubleParseSpinBox*> spinBoxes;
0020     QFormLayout *layout {0};
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::attachToSelector(KisVisualColorSelector *selector)
0050 {
0051     connect(selector, SIGNAL(sigColorModelChanged()), this, SLOT(slotColorModelChanged()));
0052     connect(selector, SIGNAL(sigHSXChanged(QVector3D)), this, SLOT(slotHSXChanged(QVector3D)));
0053     connect(this, SIGNAL(sigHSXChanged(QVector3D)), selector, SLOT(slotSetHSX(QVector3D)));
0054 }
0055 
0056 void KisSpinboxHSXSelector::slotColorModelChanged()
0057 {
0058     const KisVisualColorSelector *selector = qobject_cast<KisVisualColorSelector *>(sender());
0059     if (!selector) {
0060         return;
0061     }
0062 
0063     switch (selector->getColorModel()) {
0064     case KisVisualColorSelector::HSV:
0065         m_d->labels[2]->setText(i18n("Value:"));
0066         break;
0067     case KisVisualColorSelector::HSL:
0068         m_d->labels[2]->setText(i18n("Lightness:"));
0069         break;
0070     case KisVisualColorSelector::HSI:
0071         m_d->labels[2]->setText(i18n("Intensity:"));
0072         break;
0073     case KisVisualColorSelector::HSY:
0074         m_d->labels[2]->setText(i18n("Luma:"));
0075         break;
0076     default:
0077         break;
0078     }
0079 }
0080 
0081 void KisSpinboxHSXSelector::slotHSXChanged(const QVector3D &hsx)
0082 {
0083     const QSignalBlocker s1(m_d->spinBoxes[0]), s2(m_d->spinBoxes[1]), s3(m_d->spinBoxes[2]);
0084     m_d->spinBoxes[0]->setValue(hsx[0] * 360.0);
0085     m_d->spinBoxes[1]->setValue(hsx[1] * 100.0);
0086     m_d->spinBoxes[2]->setValue(hsx[2] * 100.0);
0087 }
0088 
0089 void KisSpinboxHSXSelector::slotSpinBoxChanged()
0090 {
0091     QVector3D hsx(m_d->spinBoxes[0]->value() / 360.0,
0092                   m_d->spinBoxes[1]->value() / 100.0,
0093                   m_d->spinBoxes[2]->value() / 100.0);
0094     emit sigHSXChanged(hsx);
0095 }