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 }