File indexing completed on 2025-02-02 04:21:07
0001 /* 0002 * dlg_border_selection.cc - part of Krita 0003 * 0004 * SPDX-FileCopyrightText: 2006 Michael Thaler <michael.thaler@physik.tu-muenchen.de> 0005 * SPDX-FileCopyrightText: 2013 Juan Palacios <jpalaciosdev@gmail.com> 0006 * 0007 * SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #include "dlg_border_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 WdgBorderSelection::WdgBorderSelection(QWidget* parent, KisViewManager *view, KisOperationConfigurationSP config) 0020 : KisOperationUIWidget(i18n("Border Selection"), parent) 0021 , m_width(config->getInt("x-radius", 1)) 0022 , m_antialiasing(config->getBool("antialiasing", false)) 0023 { 0024 Q_ASSERT(view); 0025 KisImageWSP image = view->image(); 0026 Q_ASSERT(image); 0027 m_resolution = image->yRes(); 0028 0029 setupUi(this); 0030 0031 spbWidth->setValue(m_width); 0032 spbWidth->setFocus(); 0033 spbWidth->setVisible(true); 0034 spbWidthDouble->setVisible(false); 0035 0036 cmbUnit->addItems(KoUnit::listOfUnitNameForUi()); 0037 cmbUnit->setCurrentIndex(KoUnit(KoUnit::Pixel).indexInListForUi()); 0038 0039 // ensure that both spinboxes request the same horizontal size 0040 KisSizeGroup *spbGroup = new KisSizeGroup(this); 0041 spbGroup->addWidget(spbWidth); 0042 spbGroup->addWidget(spbWidthDouble); 0043 0044 connect(spbWidth, SIGNAL(valueChanged(int)), this, SLOT(slotWidthChanged(int))); 0045 connect(spbWidthDouble, SIGNAL(valueChanged(double)), this, SLOT(slotWidthChanged(double))); 0046 connect(cmbUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUnitChanged(int))); 0047 connect(chkAntialiasing, SIGNAL(toggled(bool)), this, SLOT(slotAntialiasingChanged(bool))); 0048 slotUpdateAntialiasingAvailability(); 0049 } 0050 0051 void WdgBorderSelection::slotWidthChanged(int width) 0052 { 0053 slotWidthChanged((double) width); 0054 } 0055 0056 void WdgBorderSelection::slotWidthChanged(double width) 0057 { 0058 const KoUnit selectedUnit = KoUnit::fromListForUi(cmbUnit->currentIndex()); 0059 const double resWidth = (selectedUnit == KoUnit(KoUnit::Pixel)) ? width : (width * m_resolution); 0060 m_width = qRound(selectedUnit.fromUserValue(resWidth)); 0061 slotUpdateAntialiasingAvailability(); 0062 } 0063 0064 void WdgBorderSelection::slotUnitChanged(int index) 0065 { 0066 updateWidthUIValue(m_width); 0067 0068 const KoUnit selectedUnit = KoUnit::fromListForUi(index); 0069 if (selectedUnit != KoUnit(KoUnit::Pixel)) { 0070 spbWidth->setVisible(false); 0071 spbWidthDouble->setVisible(true); 0072 } else { 0073 spbWidth->setVisible(true); 0074 spbWidthDouble->setVisible(false); 0075 } 0076 } 0077 0078 void WdgBorderSelection::slotAntialiasingChanged(bool value) 0079 { 0080 m_antialiasing = value; 0081 } 0082 0083 void WdgBorderSelection::slotUpdateAntialiasingAvailability() 0084 { 0085 const bool antialiasingEnabled = m_width > 1; 0086 0087 if (antialiasingEnabled) { 0088 chkAntialiasing->setChecked(m_antialiasing); 0089 } else { 0090 bool tmp_antialiasing = m_antialiasing; 0091 chkAntialiasing->setChecked(false); 0092 m_antialiasing = tmp_antialiasing; 0093 } 0094 0095 chkAntialiasing->setEnabled(antialiasingEnabled); 0096 } 0097 0098 void WdgBorderSelection::updateWidthUIValue(double value) 0099 { 0100 const KoUnit selectedUnit = KoUnit::fromListForUi(cmbUnit->currentIndex()); 0101 if (selectedUnit != KoUnit(KoUnit::Pixel)) { 0102 spbWidthDouble->blockSignals(true); 0103 spbWidthDouble->setValue(selectedUnit.toUserValue(value / m_resolution)); 0104 spbWidthDouble->blockSignals(false); 0105 } else { 0106 const int finalValue = (selectedUnit == KoUnit(KoUnit::Point)) ? qRound(value / m_resolution) : value; 0107 spbWidth->blockSignals(true); 0108 spbWidth->setValue(selectedUnit.toUserValue(finalValue)); 0109 spbWidth->blockSignals(false); 0110 } 0111 } 0112 0113 void WdgBorderSelection::getConfiguration(KisOperationConfigurationSP config) 0114 { 0115 config->setProperty("x-radius", m_width); 0116 config->setProperty("y-radius", m_width); 0117 config->setProperty("antialiasing", m_antialiasing); 0118 } 0119