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
16 : KisConfigWidget(parent)
17 , m_currentDimensions(0)
18 , m_layersCount(0)
19 , m_view(0)
20{
21 setupUi(this);
22 connect(this->brushStyle, SIGNAL(currentIndexChanged(int)), SLOT(slotEnableSelectionMethod(int)));
23 connect(this->dimensionSpin, SIGNAL(valueChanged(int)), SLOT(slotActivateDimensionRanks()));
24
25 slotEnableSelectionMethod(brushStyle->currentIndex());
26
28 for (int i = 0; i < this->dimensionSpin->maximum(); i++) {
29 bp = new BrushPipeSelectionModeHelper(0, i);
30 connect(bp, SIGNAL(sigRankChanged(int)), SLOT(slotRecalculateRanks(int)));
31 dimRankLayout->addWidget(bp);
32 }
33
35}
36
38{
39 spacingWidget->setSpacing(false, cfg->getDouble("spacing"));
40 if (!cfg->getString("name").isEmpty()) {
41 nameLineEdit->setText(cfg->getString("name"));
42 }
43 colorAsMask->setChecked(cfg->getBool("mask"));
44 brushStyle->setCurrentIndex(cfg->getInt("brushStyle"));
45 dimensionSpin->setValue(cfg->getInt("dimensions"));
46
47 QLayoutItem *item;
49 for (int i = 0; i < dimensionSpin->maximum(); ++i) {
50 if ((item = dimRankLayout->itemAt(i)) != 0) {
51 bp = dynamic_cast<BrushPipeSelectionModeHelper*>(item->widget());
52 bp->cmbSelectionMode.setCurrentIndex(cfg->getInt("selectionMode" + QString::number(i)));
53 bp->rankSpinBox.setValue(cfg->getInt("rank" + QString::number(i)));
54 }
55 }
56}
57
59{
61 cfg->setProperty("spacing", spacingWidget->spacing());
62 cfg->setProperty("name", nameLineEdit->text());
63 cfg->setProperty("mask", colorAsMask->isChecked());
64 cfg->setProperty("brushStyle", brushStyle->currentIndex());
65 cfg->setProperty("dimensions", dimensionSpin->value());
66
67 QLayoutItem *item;
69 for (int i = 0; i < dimensionSpin->maximum(); ++i) {
70 if ((item = dimRankLayout->itemAt(i)) != 0) {
71 bp = dynamic_cast<BrushPipeSelectionModeHelper*>(item->widget());
72 cfg->setProperty("selectionMode" + QString::number(i), bp->cmbSelectionMode.currentIndex());
73 cfg->setProperty("rank" + QString::number(i), bp->rankSpinBox.value());
74 }
75 }
76
77 return cfg;
78}
79
81{
82 if (view) {
83 m_view = view;
84 KoProperties properties;
85 properties.setProperty("visible", true);
86 m_layersCount = m_view->image()->root()->childNodes(QStringList("KisLayer"), properties).count();
87
89 }
90}
91
93{
94 if (value == 0) {
95 animStyleGroup->setEnabled(false);
96 } else {
97 animStyleGroup->setEnabled(true);
98 }
99}
100
102{
103 QLayoutItem *item;
105 int dim = this->dimensionSpin->value();
106 if (dim >= m_currentDimensions) {
107 for (int i = m_currentDimensions; i < dim; ++i) {
108 if ((item = dimRankLayout->itemAt(i)) != 0) {
109 bp = dynamic_cast<BrushPipeSelectionModeHelper*>(item->widget());
110 bp->setEnabled(true);
111 bp->show();
112 }
113 }
114 }
115 else {
116 for (int i = m_currentDimensions -1; i >= dim; --i) {
117 if ((item = dimRankLayout->itemAt(i)) != 0) {
118 bp = dynamic_cast<BrushPipeSelectionModeHelper*>(item->widget());
119 bp->setEnabled(false);
120 bp->hide();
121 }
122 }
123 }
125}
126
128{
129 int rankSum = 0;
130 int maxDim = this->dimensionSpin->maximum();
131
133 QLayoutItem *item;
134
135 for (int i = 0; i < maxDim; ++i) {
136 if ((item = dimRankLayout->itemAt(i)) != 0) {
137 bp.push_back(dynamic_cast<BrushPipeSelectionModeHelper*>(item->widget()));
138 rankSum += bp.at(i)->rankSpinBox.value();
139 }
140 }
141
142 BrushPipeSelectionModeHelper *currentBrushHelper;
143 BrushPipeSelectionModeHelper *callerBrushHelper = bp.at(rankDimension);
144 QVectorIterator<BrushPipeSelectionModeHelper*> bpIterator(bp);
145
146 while (rankSum > m_layersCount && bpIterator.hasNext()) {
147 currentBrushHelper = bpIterator.next();
148
149 if (currentBrushHelper != callerBrushHelper) {
150 int currentValue = currentBrushHelper->rankSpinBox.value();
151 currentBrushHelper->rankSpinBox.setValue(currentValue -1);
152 rankSum -= currentValue;
153 }
154 }
155
156 if (rankSum > m_layersCount) {
157 callerBrushHelper->rankSpinBox.setValue(m_layersCount);
158 }
159
160 if (rankSum == 0) {
161 bp.at(0)->rankSpinBox.setValue(m_layersCount);
162 return;
163 }
164}
float value(const T *src, size_t ch)
QList< QString > QStringList
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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