Krita Source Code Documentation
Loading...
Searching...
No Matches
KisWdgOptionsBrush.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Boudewijn Rempt <boud@valdyas.org>
3 * SPDX-FileCopyrightText: 2019 Iván SantaMaría <ghevan@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9
10#include <KisViewManager.h>
11#include <kis_image.h>
12#include <KoProperties.h>
13#include <KisDocument.h>
14
19
21 : KisConfigWidget(parent)
22 , m_currentDimensions(0)
23 , m_layersCount(0)
24 , m_view(0)
25{
26 setupUi(this);
27 connect(this->brushStyle, SIGNAL(currentIndexChanged(int)), SLOT(slotEnableSelectionMethod(int)));
28 connect(this->dimensionSpin, SIGNAL(valueChanged(int)), SLOT(slotActivateDimensionRanks()));
29 connect(this->colorAsMask, SIGNAL(toggled(bool)), this->preserveAlpha, SLOT(setEnabled(bool)));
30
31 connect(this->spacingWidget, SIGNAL(sigSpacingChanged()), this, SIGNAL(sigConfigurationUpdated()));
32 connect(this->nameLineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(sigConfigurationUpdated()));
33 connect(this->colorAsMask, SIGNAL(toggled(bool)), this, SIGNAL(sigConfigurationUpdated()));
34 connect(this->preserveAlpha, SIGNAL(toggled(bool)), this, SIGNAL(sigConfigurationUpdated()));
35 connect(this->brushStyle, SIGNAL(currentIndexChanged(int)), this, SIGNAL(sigConfigurationUpdated()));
36 connect(this->dimensionSpin, SIGNAL(valueChanged(int)), this, SIGNAL(sigConfigurationUpdated()));
37 //todo: connect ranks to sigConfigurationUpdated?
38
39 slotEnableSelectionMethod(brushStyle->currentIndex());
40
42 for (int i = 0; i < this->dimensionSpin->maximum(); i++) {
43 bp = new BrushPipeSelectionModeHelper(0, i);
44 connect(bp, SIGNAL(sigRankChanged(int)), SLOT(slotRecalculateRanks(int)));
45 dimRankLayout->addWidget(bp);
46 }
47
49}
50
52{
53 spacingWidget->setSpacing(false, cfg->getDouble(KEY_SPACING));
54 if (!cfg->getString(KEY_NAME).isEmpty()) {
55 nameLineEdit->setText(cfg->getString(KEY_NAME));
56 }
57 colorAsMask->setChecked(cfg->getBool(KEY_MASK));
58 preserveAlpha->setChecked(cfg->getBool(KEY_PRESERVE_ALPHA));
59 brushStyle->setCurrentIndex(cfg->getInt(KEY_BRUSH_STYLE));
60 dimensionSpin->setValue(cfg->getInt(KEY_DIMENSIONS));
61
62 QLayoutItem *item;
64 for (int i = 0; i < dimensionSpin->maximum(); ++i) {
65 if ((item = dimRankLayout->itemAt(i)) != 0) {
66 bp = dynamic_cast<BrushPipeSelectionModeHelper*>(item->widget());
67 bp->cmbSelectionMode.setCurrentIndex(bp->cmbSelectionMode.findData(cfg->getInt(KEY_SELECTION_MODE + QString::number(i))));
68 bp->rankSpinBox.setValue(cfg->getInt(KEY_RANK + QString::number(i)));
69 }
70 }
71}
72
74{
76 cfg->setProperty(KEY_SPACING, spacingWidget->spacing());
77 cfg->setProperty(KEY_NAME, nameLineEdit->text());
78 cfg->setProperty(KEY_MASK, colorAsMask->isChecked());
79 cfg->setProperty(KEY_PRESERVE_ALPHA, preserveAlpha->isChecked());
80 cfg->setProperty(KEY_BRUSH_STYLE, brushStyle->currentIndex());
81 cfg->setProperty(KEY_DIMENSIONS, dimensionSpin->value());
82
83 QLayoutItem *item;
85 for (int i = 0; i < dimensionSpin->maximum(); ++i) {
86 if ((item = dimRankLayout->itemAt(i)) != 0) {
87 bp = dynamic_cast<BrushPipeSelectionModeHelper*>(item->widget());
88 cfg->setProperty(KEY_SELECTION_MODE + QString::number(i), bp->cmbSelectionMode.currentData());
89 cfg->setProperty(KEY_RANK + QString::number(i), bp->rankSpinBox.value());
90 }
91 }
92
93 return cfg;
94}
95
97{
98 if (view) {
99 m_view = view;
100 if (m_view->image()) {
101 KoProperties properties;
102 properties.setProperty("visible", true);
103 m_layersCount = m_view->image()->root()->childNodes(QStringList("KisLayer"), properties).count();
104 } else {
105 m_layersCount = 0;
106 }
107 framesNumLbl->setText(i18nc("@label %1 number of animation frames", "Frames: %1", m_layersCount));
108
110 }
111}
112
114{
115 animStyleGroup->setEnabled(value == BrushStyle::Animated);
116}
117
119{
120 QLayoutItem *item;
122 int dim = this->dimensionSpin->value();
123
124 for (int i = 0; i < qMax(dim, m_currentDimensions); i++) {
125 bool enabled = i < dim;
126 if ((item = dimRankLayout->itemAt(i))) {
127 bp = dynamic_cast<BrushPipeSelectionModeHelper*>(item->widget());
128 bp->setEnabled(enabled);
129 bp->setVisible(enabled);
130 }
131 }
132
134}
135
137{
138 int rankSum = 0;
139 int maxDim = this->dimensionSpin->maximum();
140
142 QLayoutItem *item;
143
144 for (int i = 0; i < maxDim; ++i) {
145 if ((item = dimRankLayout->itemAt(i)) != 0) {
146 bp.push_back(dynamic_cast<BrushPipeSelectionModeHelper*>(item->widget()));
147 rankSum += bp.at(i)->rankSpinBox.value();
148 }
149 }
150
151 BrushPipeSelectionModeHelper *currentBrushHelper;
152 BrushPipeSelectionModeHelper *callerBrushHelper = bp.at(rankDimension);
153 QVectorIterator<BrushPipeSelectionModeHelper*> bpIterator(bp);
154
155 while (rankSum > m_layersCount && bpIterator.hasNext()) {
156 currentBrushHelper = bpIterator.next();
157
158 if (currentBrushHelper != callerBrushHelper) {
159 int currentValue = currentBrushHelper->rankSpinBox.value();
160 currentBrushHelper->rankSpinBox.setValue(currentValue - 1);
161 rankSum -= currentValue;
162 }
163 }
164
165 if (rankSum > m_layersCount) {
166 callerBrushHelper->rankSpinBox.setValue(m_layersCount);
167 }
168
169 if (rankSum == 0) {
170 bp.at(0)->rankSpinBox.setValue(m_layersCount);
171 }
172}
float value(const T *src, size_t ch)
QList< QString > QStringList
const QString KEY_MASK
const QString KEY_RANK
const QString KEY_DIMENSIONS
const QString KEY_SELECTION_MODE
const QString KEY_BRUSH_STYLE
const QString KEY_PRESERVE_ALPHA
const QString KEY_NAME
const QString KEY_SPACING
void sigConfigurationUpdated()
KisImageWSP image() const
Return the image this view is displaying.
void setView(KisViewManager *view) override
KisWdgOptionsBrush(QWidget *parent)
void slotRecalculateRanks(int rankDimension=0)
void slotEnableSelectionMethod(int value)
KisViewManager * m_view
void setConfiguration(const KisPropertiesConfigurationSP cfg) override
KisPropertiesConfigurationSP configuration() const override
void setProperty(const QString &name, const QVariant &value)
QList< KisNodeSP > childNodes(const QStringList &nodeTypes, const KoProperties &properties) const
Definition kis_node.cpp:439