File indexing completed on 2024-06-02 04:32:22

0001 /*
0002  *  dlg_feather_selection.cc - part of Krita
0003  *
0004  *  SPDX-FileCopyrightText: 2009 Edward Apap <schumifer@hotmail.com>
0005  *  SPDX-FileCopyrightText: 2013 Juan Palacios <jpalaciosdev@gmail.com>
0006  *
0007  *  SPDX-License-Identifier: GPL-2.0-or-later
0008  */
0009 
0010 #include "dlg_feather_selection.h"
0011 
0012 #include <KoUnit.h>
0013 #include <kis_size_group.h>
0014 #include <KisViewManager.h>
0015 #include <kis_image.h>
0016 #include <operations/kis_operation_configuration.h>
0017 
0018 
0019 WdgFeatherSelection::WdgFeatherSelection(QWidget* parent, KisViewManager* view, KisOperationConfigurationSP config)
0020     : KisOperationUIWidget(i18n("Feather Selection"), parent)
0021     , m_radius(config->getInt("radius", 5))
0022 {
0023     Q_ASSERT(view);
0024     KisImageWSP image = view->image();
0025     Q_ASSERT(image);
0026     m_resolution = image->yRes();
0027 
0028     setupUi(this);
0029 
0030     spbRadius->setValue(m_radius);
0031     spbRadius->setFocus();
0032     spbRadius->setVisible(true);
0033     spbRadiusDouble->setVisible(false);
0034 
0035     cmbUnit->addItems(KoUnit::listOfUnitNameForUi());
0036     cmbUnit->setCurrentIndex(KoUnit(KoUnit::Pixel).indexInListForUi());
0037 
0038     // ensure that both spinboxes request the same horizontal size
0039     KisSizeGroup *spbGroup = new KisSizeGroup(this);
0040     spbGroup->addWidget(spbRadius);
0041     spbGroup->addWidget(spbRadiusDouble);
0042 
0043     connect(spbRadius, SIGNAL(valueChanged(int)), this, SLOT(slotRadiusChanged(int)));
0044     connect(spbRadiusDouble, SIGNAL(valueChanged(double)), this, SLOT(slotRadiusChanged(double)));
0045     connect(cmbUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUnitChanged(int)));
0046 }
0047 
0048 void WdgFeatherSelection::slotRadiusChanged(int radius)
0049 {
0050     slotRadiusChanged((double) radius);
0051 }
0052 
0053 void WdgFeatherSelection::slotRadiusChanged(double radius)
0054 {
0055     const KoUnit selectedUnit = KoUnit::fromListForUi(cmbUnit->currentIndex());
0056     const double resRadius = (selectedUnit == KoUnit(KoUnit::Pixel)) ? radius : (radius * m_resolution);
0057     m_radius = qRound(selectedUnit.fromUserValue(resRadius));
0058 }
0059 
0060 void WdgFeatherSelection::slotUnitChanged(int index)
0061 {
0062     updateRadiusUIValue(m_radius);
0063 
0064     const KoUnit selectedUnit = KoUnit::fromListForUi(index);
0065     if (selectedUnit != KoUnit(KoUnit::Pixel)) {
0066         spbRadius->setVisible(false);
0067         spbRadiusDouble->setVisible(true);
0068     } else {
0069         spbRadius->setVisible(true);
0070         spbRadiusDouble->setVisible(false);
0071     }
0072 }
0073 
0074 void WdgFeatherSelection::updateRadiusUIValue(double value)
0075 {
0076     const KoUnit selectedUnit = KoUnit::fromListForUi(cmbUnit->currentIndex());
0077     if (selectedUnit != KoUnit(KoUnit::Pixel)) {
0078         spbRadiusDouble->blockSignals(true);
0079         spbRadiusDouble->setValue(selectedUnit.toUserValue(value / m_resolution));
0080         spbRadiusDouble->blockSignals(false);
0081     } else {
0082         const int finalValue = (selectedUnit == KoUnit(KoUnit::Point)) ? qRound(value / m_resolution) : value;
0083         spbRadius->blockSignals(true);
0084         spbRadius->setValue(selectedUnit.toUserValue(finalValue));
0085         spbRadius->blockSignals(false);
0086     }
0087 }
0088 
0089 void WdgFeatherSelection::getConfiguration(KisOperationConfigurationSP config)
0090 {
0091     config->setProperty("radius", m_radius);
0092 }