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 }