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
52 BucketToolProperties properties = mBucketTool->settings();
53
54 auto toleranceInfo = properties.getInfo(BucketToolProperties::COLORTOLERANCE_VALUE);
55 auto expandInfo = properties.getInfo(BucketToolProperties::FILLEXPAND_VALUE);
56 auto thicknessInfo = properties.getInfo(BucketToolProperties::FILLTHICKNESS_VALUE);
57
58 ui->colorToleranceSlider->init(tr("Color tolerance"), SpinSlider::GROWTH_TYPE::LINEAR, toleranceInfo.minInt(), toleranceInfo.maxInt());
59 ui->expandSlider->init(tr("Expand fill"), SpinSlider::GROWTH_TYPE::LINEAR, expandInfo.minInt(), expandInfo.maxInt());
60 ui->strokeThicknessSlider->init(tr("Stroke thickness"), SpinSlider::GROWTH_TYPE::LOG, thicknessInfo.minReal(), thicknessInfo.maxReal());
61
62 ui->expandSpinBox->setMaximum(expandInfo.maxInt());
63 ui->strokeThicknessSpinBox->setMaximum(thicknessInfo.maxReal());
64 ui->strokeThicknessSpinBox->setMinimum(thicknessInfo.minReal());
65 ui->colorToleranceSpinbox->setMaximum(toleranceInfo.maxInt());
66
67 ui->referenceLayerComboBox->addItem(tr("Current layer", "Reference Layer Options"), 0);
68 ui->referenceLayerComboBox->addItem(tr("All layers", "Reference Layer Options"), 1);
69 ui->referenceLayerComboBox->setToolTip(tr("Refers to the layer that used to flood fill from"));
70
71 ui->blendModeComboBox->addItem(tr("Overlay", "Blend Mode dropdown option"), 0);
72 ui->blendModeComboBox->addItem(tr("Replace", "Blend Mode dropdown option"), 1);
73 ui->blendModeComboBox->addItem(tr("Behind", "Blend Mode dropdown option"), 2);
74 ui->blendModeComboBox->setToolTip(tr("Defines how the fill will behave when the new color is not opaque"));
75
76 makeConnectionsFromUIToModel();
77 makeConnectionsFromModelToUI();
78
79 clearFocusOnFinished(ui->colorToleranceSpinbox);
80 clearFocusOnFinished(ui->expandSpinBox);
81
82 updatePropertyVisibility();
83}
84
85void BucketOptionsWidget::updateUI()
86{
87 updatePropertyVisibility();
88
89 BucketToolProperties properties = mBucketTool->settings();
90
91 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLTHICKNESS_VALUE)) {
92 mBucketTool->setStrokeThickness(properties.fillThickness());
93 }
94
95 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_ENABLED)) {
96 mBucketTool->setFillExpandEnabled(properties.fillExpandEnabled());
97 }
98
99 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_VALUE)) {
100 mBucketTool->setFillExpand(properties.fillExpandAmount());
101 }
102
103 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE)) {
104 mBucketTool->setFillReferenceMode(properties.fillReferenceMode());
105 }
106
107 if (mBucketTool->isPropertyEnabled(BucketToolProperties::FILLMODE_VALUE)) {
108 mBucketTool->setFillMode(properties.fillMode());
109 }
110
111 if (mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_VALUE)) {
112 mBucketTool->setColorTolerance(properties.tolerance());
113 }
114
115 if (mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_ENABLED)) {
116 mBucketTool->setColorToleranceEnabled(properties.colorToleranceEnabled());
117 }
118}
119
120void BucketOptionsWidget::makeConnectionsFromModelToUI()
121{
122 connect(mBucketTool, &BucketTool::toleranceChanged, this, [=](int value) {
123 setColorTolerance(value);
124 });
125
126 connect(mBucketTool, &BucketTool::toleranceEnabledChanged, this, [=](bool enabled) {
127 setColorToleranceEnabled(enabled);
128 });
129
130 connect(mBucketTool, &BucketTool::fillExpandChanged, this, [=](int value) {
131 setFillExpand(value);
132 });
133
134 connect(mBucketTool, &BucketTool::fillExpandEnabledChanged, this, [=](bool enabled) {
135 setFillExpandEnabled(enabled);
136 });
137
138 connect(mBucketTool, &BucketTool::fillReferenceModeChanged, this, [=](int value) {
139 setFillReferenceMode(value);
140 });
141
142 connect(mBucketTool, &BucketTool::fillModeChanged, this, [=](int value) {
143 setFillMode(value);
144 });
145
146 connect(mBucketTool, &BucketTool::strokeThicknessChanged, this, [=](qreal value) {
147 setStrokeWidth(value);
148 });
149}
150
151void BucketOptionsWidget::makeConnectionsFromUIToModel()
152{
153 connect(ui->colorToleranceSlider, &SpinSlider::valueChanged, [=](int value) {
154 mBucketTool->setColorTolerance(value);
155 });
156 connect(ui->colorToleranceSpinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [=](int value) {
157 mBucketTool->setColorTolerance(value);
158 });
159
160 connect(ui->colorToleranceCheckbox, &QCheckBox::toggled, [=](bool enabled) {
161 mBucketTool->setColorToleranceEnabled(enabled);
162 });
163
164 connect(ui->expandSlider, &SpinSlider::valueChanged, [=](int value) {
165 mBucketTool->setFillExpand(value);
166 });
167
168 connect(ui->expandSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [=](int value) {
169 mBucketTool->setFillExpand(value);
170 });
171
172 connect(ui->expandCheckbox, &QCheckBox::toggled, [=](bool enabled) {
173 mBucketTool->setFillExpandEnabled(enabled);
174 });
175
176 connect(ui->referenceLayerComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int value) {
177 mBucketTool->setFillReferenceMode(value);
178 });
179
180 connect(ui->blendModeComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int value) {
181 mBucketTool->setFillMode(value);
182 });
183
184 connect(ui->strokeThicknessSlider, &SpinSlider::valueChanged, [=](qreal value) {
185 mBucketTool->setStrokeThickness(value);
186 });
187
188 connect(ui->strokeThicknessSpinBox, static_cast<void (QDoubleSpinBox::*)(qreal)>(&QDoubleSpinBox::valueChanged), [=](qreal value) {
189 mBucketTool->setStrokeThickness(value);
190 });
191}
192
193void BucketOptionsWidget::updatePropertyVisibility()
194{
195 ui->strokeThicknessSlider->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLTHICKNESS_VALUE));
196 ui->strokeThicknessSpinBox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLTHICKNESS_VALUE));
197 ui->colorToleranceCheckbox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_ENABLED));
198 ui->colorToleranceSlider->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_VALUE));
199 ui->colorToleranceSpinbox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::COLORTOLERANCE_VALUE));
200 ui->expandCheckbox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_ENABLED));
201 ui->expandSlider->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_VALUE));
202 ui->expandSpinBox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLEXPAND_VALUE));
203 ui->referenceLayerComboBox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE));
204 ui->referenceLayerDescLabel->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLLAYERREFERENCEMODE_VALUE));
205 ui->blendModeComboBox->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLMODE_VALUE));
206 ui->blendModeLabel->setVisible(mBucketTool->isPropertyEnabled(BucketToolProperties::FILLMODE_VALUE));
207}
208
209void BucketOptionsWidget::onLayerChanged(int)
210{
211 updatePropertyVisibility();
212}
213
214void BucketOptionsWidget::setColorTolerance(int tolerance)
215{
216 QSignalBlocker b(ui->colorToleranceSlider);
217 ui->colorToleranceSlider->setValue(tolerance);
218
219 QSignalBlocker b2(ui->colorToleranceSpinbox);
220 ui->colorToleranceSpinbox->setValue(tolerance);
221}
222
223void BucketOptionsWidget::setColorToleranceEnabled(bool enabled)
224{
225 QSignalBlocker b(ui->colorToleranceCheckbox);
226 ui->colorToleranceCheckbox->setChecked(enabled);
227}
228
229void BucketOptionsWidget::setFillMode(int mode)
230{
231 QSignalBlocker b(ui->blendModeComboBox);
232 ui->blendModeComboBox->setCurrentIndex(mode);
233}
234
235void BucketOptionsWidget::setFillExpandEnabled(bool enabled)
236{
237 QSignalBlocker b(ui->expandCheckbox);
238 ui->expandCheckbox->setChecked(enabled);
239}
240
241void BucketOptionsWidget::setFillExpand(int value)
242{
243 QSignalBlocker b(ui->expandSlider);
244 ui->expandSlider->setValue(value);
245
246 QSignalBlocker b2(ui->expandSpinBox);
247 ui->expandSpinBox->setValue(value);
248}
249
250void BucketOptionsWidget::setFillReferenceMode(int referenceMode)
251{
252 QSignalBlocker b(ui->referenceLayerComboBox);
253 ui->referenceLayerComboBox->setCurrentIndex(referenceMode);
254}
255
256void BucketOptionsWidget::setStrokeWidth(qreal value)
257{
258 QSignalBlocker b(ui->strokeThicknessSlider);
259 ui->strokeThicknessSlider->setValue(value);
260
261 QSignalBlocker b2(ui->strokeThicknessSpinBox);
262 ui->strokeThicknessSpinBox->setValue(value);
263}
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)
BucketToolProperties
Definition: toolproperties.h:490
Generated on Tue Jan 6 2026 11:38:51 for Pencil2D by doxygen 1.9.6 based on revision f91a96748ec6712509b9b0ff47979db9c34d556f