File indexing completed on 2024-05-19 04:29:25

0001 /*
0002  *  SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_spacing_selection_widget.h"
0008 
0009 #include <QCheckBox>
0010 #include <QHBoxLayout>
0011 
0012 #include "klocalizedstring.h"
0013 
0014 #include "kis_signals_blocker.h"
0015 #include "kis_slider_spin_box.h"
0016 
0017 
0018 
0019 struct KisSpacingSelectionWidget::Private
0020 {
0021     Private(KisSpacingSelectionWidget *_q)
0022         : q(_q)
0023     {
0024     }
0025 
0026     KisSpacingSelectionWidget *q;
0027 
0028     KisDoubleSliderSpinBox *slider {0};
0029     QCheckBox *autoButton {0};
0030 
0031     qreal oldSliderValue {0.1};
0032 
0033     void slotSpacingChanged(qreal value);
0034     void slotAutoSpacing(bool value);
0035 };
0036 
0037 
0038 KisSpacingSelectionWidget::KisSpacingSelectionWidget(QWidget *parent)
0039     : QWidget(parent),
0040       m_d(new Private(this))
0041 {
0042     m_d->slider = new KisDoubleSliderSpinBox(this);
0043     m_d->slider->setRange(0.02, 10.0, 2);
0044     m_d->slider->setExponentRatio(3);
0045     m_d->slider->setSingleStep(0.01);
0046     m_d->slider->setValue(0.1);
0047     m_d->slider->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed));
0048 
0049 
0050     m_d->autoButton = new QCheckBox(this);
0051     m_d->autoButton->setText(i18nc("@action:button", "Auto"));
0052     m_d->autoButton->setToolTip(i18nc("@info:tooltip", "In auto mode the spacing of the brush will be calculated automatically depending on its size"));
0053     m_d->autoButton->setCheckable(true);
0054     m_d->autoButton->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
0055 
0056     QHBoxLayout *layout = new QHBoxLayout(this);
0057     layout->addWidget(m_d->autoButton);
0058     layout->addWidget(m_d->slider);
0059     layout->setMargin(0);
0060 
0061     connect(m_d->slider, SIGNAL(valueChanged(qreal)), SLOT(slotSpacingChanged(qreal)));
0062     connect(m_d->autoButton, SIGNAL(toggled(bool)), SLOT(slotAutoSpacing(bool)));
0063 }
0064 
0065 KisSpacingSelectionWidget::~KisSpacingSelectionWidget()
0066 {
0067 }
0068 
0069 qreal KisSpacingSelectionWidget::spacing() const
0070 {
0071     return autoSpacingActive() ? 0.1 : m_d->slider->value();
0072 }
0073 
0074 bool KisSpacingSelectionWidget::autoSpacingActive() const
0075 {
0076     return m_d->autoButton->isChecked();
0077 }
0078 
0079 qreal KisSpacingSelectionWidget::autoSpacingCoeff() const
0080 {
0081     return autoSpacingActive() ? m_d->slider->value() : 1.0;
0082 }
0083 
0084 void KisSpacingSelectionWidget::setSpacing(bool isAuto, qreal spacing)
0085 {
0086     KisSignalsBlocker b1(m_d->autoButton);
0087     KisSignalsBlocker b2(m_d->slider);
0088 
0089     m_d->autoButton->setChecked(isAuto);
0090     m_d->slider->setValue(spacing);
0091 }
0092 
0093 void KisSpacingSelectionWidget::Private::slotSpacingChanged(qreal value)
0094 {
0095     Q_UNUSED(value);
0096     emit q->sigSpacingChanged();
0097 }
0098 
0099 void KisSpacingSelectionWidget::Private::slotAutoSpacing(bool value)
0100 {
0101     qreal newSliderValue = 0.0;
0102 
0103     if (value) {
0104         newSliderValue = 1.0;
0105         oldSliderValue = slider->value();
0106     } else {
0107         newSliderValue = oldSliderValue;
0108     }
0109 
0110     {
0111         KisSignalsBlocker b(slider);
0112         slider->setValue(newSliderValue);
0113     }
0114 
0115     emit q->sigSpacingChanged();
0116 }
0117 
0118 #include "moc_kis_spacing_selection_widget.moc"