Pencil2D Animation
Download Community News Docs Contribute
  • Overview
  • Articles
  • Code
  •  
  • Class List
  • Class Index
  • Class Hierarchy
  • Class Members
  • File List
Loading...
Searching...
No Matches
  • app
  • src
bucketoptionswidget.cpp
1/*
2
3Pencil2D - Traditional Animation Software
4Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5Copyright (C) 2012-2020 Matthew Chiawen Chang
6
7This program is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public License
9as published by the Free Software Foundation; version 2 of the License.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16*/
17#include "bucketoptionswidget.h"
18#include "ui_bucketoptionswidget.h"
19
20#include <QDebug>
21
22#include "spinslider.h"
23
24#include "layer.h"
25#include "editor.h"
26#include "layermanager.h"
27#include "toolmanager.h"
28#include "util.h"
29
30#include "stroketool.h"
31#include "buckettool.h"
32
33BucketOptionsWidget::BucketOptionsWidget(Editor* editor, QWidget* parent) :
34 BaseWidget(parent),
35 ui(new Ui::BucketOptionsWidget),
36 mEditor(editor)
37{
38 ui->setupUi(this);
39
40 initUI();
41}
42
43BucketOptionsWidget::~BucketOptionsWidget()
44{
45 delete ui;
46}
47
48void BucketOptionsWidget::initUI()
49{
50 mBucketTool = static_cast<BucketTool*>(mEditor->tools()->getTool(BUCKET));
51 mSettings = mBucketTool->settings();
52
53 auto toleranceInfo = mSettings.getInfo(BucketToolProperties::COLORTOLERANCE_VALUE);
54 auto expandInfo = mSettings.getInfo(BucketToolProperties::FILLEXPAND_VALUE);
55 auto thicknessInfo = mSettings.getInfo(BucketToolProperties::FILLTHICKNESS_VALUE);
56
57 ui->colorToleranceSlider->init(tr("Color tolerance"), SpinSlider::GROWTH_TYPE::LINEAR, toleranceInfo.minInt(), toleranceInfo.maxInt());
58 ui->expandSlider->init(tr("Expand fill"), SpinSlider::GROWTH_TYPE::LINEAR, expandInfo.minInt(), expandInfo.maxInt());
59 ui->strokeThicknessSlider->init(tr("Stroke thickness"), SpinSlider::GROWTH_TYPE::LOG, thicknessInfo.minReal(), thicknessInfo.maxReal());
60
61 ui->expandSpinBox->setMaximum(expandInfo.maxInt());
62 ui->strokeThicknessSpinBox->setMaximum(thicknessInfo.maxReal());
63 ui->strokeThicknessSpinBox->setMinimum(thicknessInfo.minReal());
64 ui->colorToleranceSpinbox->setMaximum(toleranceInfo.maxInt());
65
66 ui->referenceLayerComboBox->addItem(tr("Current layer", "Reference Layer Options"), 0);
67 ui->referenceLayerComboBox->addItem(tr("All layers", "Reference Layer Options"), 1);
68 ui->referenceLayerComboBox->setToolTip(tr("Refers to the layer that used to flood fill from"));
69
70 ui->blendModeComboBox->addItem(tr("Overlay", "Blend Mode dropdown option"), 0);
71 ui->blendModeComboBox->addItem(tr("Replace", "Blend Mode dropdown option"), 1);
72 ui->blendModeComboBox->addItem(tr("Behind", "Blend Mode dropdown option"), 2);
73 ui->blendModeComboBox->setToolTip(tr("Defines how the fill will behave when the new color is not opaque"));
74
75 makeConnectionsFromUIToModel();
76 makeConnectionsFromModelToUI();
77
78 clearFocusOnFinished(ui->colorToleranceSpinbox);
79 clearFocusOnFinished(ui->expandSpinBox);
80
81 updatePropertyVisibility();
82}
83
84void BucketOptionsWidget::updateUI()
85{
86 updatePropertyVisibility();
87
88 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLTHICKNESS_VALUE)) {
89 mBucketTool->setStrokeThickness(mSettings.fillThickness());
90 }
91
92 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_ENABLED)) {
93 mBucketTool->setFillExpandEnabled(mSettings.fillExpandEnabled());
94 }
95
96 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_VALUE)) {
97 mBucketTool->setFillExpand(mSettings.fillExpandAmount());
98 }
99
100 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE)) {
101 mBucketTool->setFillReferenceMode(mSettings.fillReferenceMode());
102 }
103
104 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLMODE_VALUE)) {
105 mBucketTool->setFillMode(mSettings.fillMode());
106 }
107
108 if (mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_VALUE)) {
109 mBucketTool->setColorTolerance(mSettings.tolerance());
110 }
111
112 if (mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_ENABLED)) {
113 mBucketTool->setColorToleranceEnabled(mSettings.colorToleranceEnabled());
114 }
115}
116
117void BucketOptionsWidget::makeConnectionsFromModelToUI()
118{
119 connect(mBucketTool, &BucketTool::toleranceChanged, this, [=](int value) {
120 setColorTolerance(value);
121 });
122
123 connect(mBucketTool, &BucketTool::toleranceEnabledChanged, this, [=](bool enabled) {
124 setColorToleranceEnabled(enabled);
125 });
126
127 connect(mBucketTool, &BucketTool::fillExpandChanged, this, [=](int value) {
128 setFillExpand(value);
129 });
130
131 connect(mBucketTool, &BucketTool::fillExpandEnabledChanged, this, [=](bool enabled) {
132 setFillExpandEnabled(enabled);
133 });
134
135 connect(mBucketTool, &BucketTool::fillReferenceModeChanged, this, [=](int value) {
136 setFillReferenceMode(value);
137 });
138
139 connect(mBucketTool, &BucketTool::fillModeChanged, this, [=](int value) {
140 setFillMode(value);
141 });
142
143 connect(mBucketTool, &BucketTool::strokeThicknessChanged, this, [=](qreal value) {
144 setStrokeWidth(value);
145 });
146}
147
148void BucketOptionsWidget::makeConnectionsFromUIToModel()
149{
150 connect(ui->colorToleranceSlider, &SpinSlider::valueChanged, [=](int value) {
151 mBucketTool->setColorTolerance(value);
152 });
153 connect(ui->colorToleranceSpinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [=](int value) {
154 mBucketTool->setColorTolerance(value);
155 });
156
157 connect(ui->colorToleranceCheckbox, &QCheckBox::toggled, [=](bool enabled) {
158 mBucketTool->setColorToleranceEnabled(enabled);
159 });
160
161 connect(ui->expandSlider, &SpinSlider::valueChanged, [=](int value) {
162 mBucketTool->setFillExpand(value);
163 });
164
165 connect(ui->expandSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [=](int value) {
166 mBucketTool->setFillExpand(value);
167 });
168
169 connect(ui->expandCheckbox, &QCheckBox::toggled, [=](bool enabled) {
170 mBucketTool->setFillExpandEnabled(enabled);
171 });
172
173 connect(ui->referenceLayerComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int value) {
174 mBucketTool->setFillReferenceMode(value);
175 });
176
177 connect(ui->blendModeComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int value) {
178 mBucketTool->setFillMode(value);
179 });
180
181 connect(ui->strokeThicknessSlider, &SpinSlider::valueChanged, [=](qreal value) {
182 mBucketTool->setStrokeThickness(value);
183 });
184
185 connect(ui->strokeThicknessSpinBox, static_cast<void (QDoubleSpinBox::*)(qreal)>(&QDoubleSpinBox::valueChanged), [=](qreal value) {
186 mBucketTool->setStrokeThickness(value);
187 });
188}
189
190void BucketOptionsWidget::updatePropertyVisibility()
191{
192 ui->strokeThicknessSlider->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLTHICKNESS_VALUE));
193 ui->strokeThicknessSpinBox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLTHICKNESS_VALUE));
194 ui->colorToleranceCheckbox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_ENABLED));
195 ui->colorToleranceSlider->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_VALUE));
196 ui->colorToleranceSpinbox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_VALUE));
197 ui->expandCheckbox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_ENABLED));
198 ui->expandSlider->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_VALUE));
199 ui->expandSpinBox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_VALUE));
200 ui->referenceLayerComboBox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE));
201 ui->referenceLayerDescLabel->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE));
202 ui->blendModeComboBox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLMODE_VALUE));
203 ui->blendModeLabel->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLMODE_VALUE));
204}
205
206void BucketOptionsWidget::onLayerChanged(int)
207{
208 updatePropertyVisibility();
209}
210
211void BucketOptionsWidget::setColorTolerance(int tolerance)
212{
213 QSignalBlocker b(ui->colorToleranceSlider);
214 ui->colorToleranceSlider->setValue(tolerance);
215
216 QSignalBlocker b2(ui->colorToleranceSpinbox);
217 ui->colorToleranceSpinbox->setValue(tolerance);
218}
219
220void BucketOptionsWidget::setColorToleranceEnabled(bool enabled)
221{
222 QSignalBlocker b(ui->colorToleranceCheckbox);
223 ui->colorToleranceCheckbox->setChecked(enabled);
224}
225
226void BucketOptionsWidget::setFillMode(int mode)
227{
228 QSignalBlocker b(ui->blendModeComboBox);
229 ui->blendModeComboBox->setCurrentIndex(mode);
230}
231
232void BucketOptionsWidget::setFillExpandEnabled(bool enabled)
233{
234 QSignalBlocker b(ui->expandCheckbox);
235 ui->expandCheckbox->setChecked(enabled);
236}
237
238void BucketOptionsWidget::setFillExpand(int value)
239{
240 QSignalBlocker b(ui->expandSlider);
241 ui->expandSlider->setValue(value);
242
243 QSignalBlocker b2(ui->expandSpinBox);
244 ui->expandSpinBox->setValue(value);
245}
246
247void BucketOptionsWidget::setFillReferenceMode(int referenceMode)
248{
249 QSignalBlocker b(ui->referenceLayerComboBox);
250 ui->referenceLayerComboBox->setCurrentIndex(referenceMode);
251}
252
253void BucketOptionsWidget::setStrokeWidth(qreal value)
254{
255 QSignalBlocker b(ui->strokeThicknessSlider);
256 ui->strokeThicknessSlider->setValue(value);
257
258 QSignalBlocker b2(ui->strokeThicknessSpinBox);
259 ui->strokeThicknessSpinBox->setValue(value);
260}
BaseWidget
Definition: basewidget.h:24
BucketOptionsWidget
Definition: bucketoptionswidget.h:35
BucketTool
Definition: buckettool.h:30
Editor
Definition: editor.h:71
QAbstractButton::toggled
void toggled(bool checked)
QComboBox
QComboBox::currentIndexChanged
void currentIndexChanged(int index)
QDoubleSpinBox
QDoubleSpinBox::valueChanged
void valueChanged(double d)
QObject::connect
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
QSignalBlocker
QSpinBox
QSpinBox::valueChanged
void valueChanged(int i)
QWidget
QWidget::enabled
enabled
QWidget::setupUi
void setupUi(QWidget *widget)
Generated on Wed Dec 24 2025 23:46:01 for Pencil2D by doxygen 1.9.6 based on revision 1be63043db1f7fc0545528fc3b6d5098a552755b