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