All Classes Namespaces Functions Variables Enumerations Properties Pages
tooloptionwidget.cpp
1 /*
2 
3 Pencil2D - Traditional Animation Software
4 Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5 Copyright (C) 2012-2020 Matthew Chiawen Chang
6 
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; version 2 of the License.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15 
16 */
17 #include "tooloptionwidget.h"
18 #include "ui_tooloptions.h"
19 
20 #include <QSettings>
21 #include <QDebug>
22 
23 #include "spinslider.h"
24 #include "editor.h"
25 #include "util.h"
26 #include "layer.h"
27 #include "layermanager.h"
28 #include "toolmanager.h"
29 
30 ToolOptionWidget::ToolOptionWidget(QWidget* parent) : BaseDockWidget(parent)
31 {
32  setWindowTitle(tr("Options", "Window title of tool option panel like pen width, feather etc.."));
33 
34  QWidget* innerWidget = new QWidget;
35  setWidget(innerWidget);
36  ui = new Ui::ToolOptions;
37  ui->setupUi(innerWidget);
38 }
39 
40 ToolOptionWidget::~ToolOptionWidget()
41 {
42  delete ui;
43 }
44 
45 void ToolOptionWidget::initUI()
46 {
47  QSettings settings(PENCIL2D, PENCIL2D);
48 
49  ui->sizeSlider->init(tr("Width"), SpinSlider::EXPONENT, SpinSlider::INTEGER, 1, 200);
50  ui->sizeSlider->setValue(settings.value("brushWidth", "3").toDouble());
51  ui->brushSpinBox->setValue(settings.value("brushWidth", "3").toDouble());
52 
53  ui->featherSlider->init(tr("Feather"), SpinSlider::LOG, SpinSlider::INTEGER, 1, 99);
54  ui->featherSlider->setValue(settings.value("brushFeather", "5").toDouble());
55  ui->featherSpinBox->setValue(settings.value("brushFeather", "5").toDouble());
56 
57  ui->toleranceSlider->init(tr("Color Tolerance"), SpinSlider::LINEAR, SpinSlider::INTEGER, 0, 100);
58  ui->toleranceSlider->setValue(settings.value("Tolerance", "50").toInt());
59  ui->toleranceSpinBox->setValue(settings.value("Tolerance", "50").toInt());
60 }
61 
62 void ToolOptionWidget::updateUI()
63 {
64  BaseTool* currentTool = editor()->tools()->currentTool();
65  Q_ASSERT(currentTool);
66 
67  disableAllOptions();
68 
69  setVisibility(currentTool);
70 
71  const Properties& p = currentTool->properties;
72 
73  setPenWidth(p.width);
74  setPenFeather(p.feather);
75  setUseFeather(p.useFeather);
76  setPressure(p.pressure);
77  setPenInvisibility(p.invisibility);
78  setPreserveAlpha(p.preserveAlpha);
79  setVectorMergeEnabled(p.vectorMergeEnabled);
80  setAA(p.useAA);
81  setStabilizerLevel(p.stabilizerLevel);
82  setTolerance(static_cast<int>(p.tolerance));
83  setFillContour(p.useFillContour);
84 }
85 
86 void ToolOptionWidget::createUI()
87 {}
88 
89 void ToolOptionWidget::makeConnectionToEditor(Editor* editor)
90 {
91  auto toolManager = editor->tools();
92 
93  connect(ui->useBezierBox, &QCheckBox::clicked, toolManager, &ToolManager::setBezier);
94  connect(ui->usePressureBox, &QCheckBox::clicked, toolManager, &ToolManager::setPressure);
95  connect(ui->makeInvisibleBox, &QCheckBox::clicked, toolManager, &ToolManager::setInvisibility);
96  connect(ui->preserveAlphaBox, &QCheckBox::clicked, toolManager, &ToolManager::setPreserveAlpha);
97 
98  connect(ui->sizeSlider, &SpinSlider::valueChanged, toolManager, &ToolManager::setWidth);
99  connect(ui->featherSlider, &SpinSlider::valueChanged, toolManager, &ToolManager::setFeather);
100 
101  auto spinboxValueChanged = static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged);
102  connect(ui->brushSpinBox, spinboxValueChanged, toolManager, &ToolManager::setWidth);
103  clearFocusOnFinished(ui->brushSpinBox);
104  connect(ui->featherSpinBox, spinboxValueChanged, toolManager, &ToolManager::setFeather);
105  clearFocusOnFinished(ui->featherSpinBox);
106 
107  connect(ui->useFeatherBox, &QCheckBox::clicked, toolManager, &ToolManager::setUseFeather);
108 
109  connect(ui->vectorMergeBox, &QCheckBox::clicked, toolManager, &ToolManager::setVectorMergeEnabled);
110  connect(ui->useAABox, &QCheckBox::clicked, toolManager, &ToolManager::setAA);
111 
112  connect(ui->inpolLevelsCombo, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), toolManager, &ToolManager::setStabilizerLevel);
113 
114  connect(ui->toleranceSlider, &SpinSlider::valueChanged, toolManager, &ToolManager::setTolerance);
115  connect(ui->toleranceSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), toolManager, &ToolManager::setTolerance);
116  clearFocusOnFinished(ui->toleranceSpinBox);
117 
118  connect(ui->fillContourBox, &QCheckBox::clicked, toolManager, &ToolManager::setUseFillContour);
119 
120  connect(toolManager, &ToolManager::toolChanged, this, &ToolOptionWidget::onToolChanged);
121  connect(toolManager, &ToolManager::toolPropertyChanged, this, &ToolOptionWidget::onToolPropertyChanged);
122 }
123 
124 void ToolOptionWidget::onToolPropertyChanged(ToolType, ToolPropertyType ePropertyType)
125 {
126  const Properties& p = editor()->tools()->currentTool()->properties;
127 
128  switch (ePropertyType)
129  {
130  case WIDTH: setPenWidth(p.width); break;
131  case FEATHER: setPenFeather(p.feather); break;
132  case USEFEATHER: setUseFeather(p.useFeather); break;
133  case PRESSURE: setPressure(p.pressure); break;
134  case INVISIBILITY: setPenInvisibility(p.invisibility); break;
135  case PRESERVEALPHA: setPreserveAlpha(p.preserveAlpha); break;
136  case VECTORMERGE: setVectorMergeEnabled(p.vectorMergeEnabled); break;
137  case ANTI_ALIASING: setAA(p.useAA); break;
138  case STABILIZATION: setStabilizerLevel(p.stabilizerLevel); break;
139  case TOLERANCE: setTolerance(static_cast<int>(p.tolerance)); break;
140  case FILLCONTOUR: setFillContour(p.useFillContour); break;
141  case BEZIER: setBezier(p.bezier_state); break;
142  default:
143  Q_ASSERT(false);
144  break;
145  }
146 }
147 
148 void ToolOptionWidget::setVisibility(BaseTool* tool)
149 {
150  ui->sizeSlider->setVisible(tool->isPropertyEnabled(WIDTH));
151  ui->brushSpinBox->setVisible(tool->isPropertyEnabled(WIDTH));
152  ui->featherSlider->setVisible(tool->isPropertyEnabled(FEATHER));
153  ui->featherSpinBox->setVisible(tool->isPropertyEnabled(FEATHER));
154  ui->useFeatherBox->setVisible(tool->isPropertyEnabled(USEFEATHER));
155  ui->useBezierBox->setVisible(tool->isPropertyEnabled(BEZIER));
156  ui->usePressureBox->setVisible(tool->isPropertyEnabled(PRESSURE));
157  ui->makeInvisibleBox->setVisible(tool->isPropertyEnabled(INVISIBILITY));
158  ui->preserveAlphaBox->setVisible(tool->isPropertyEnabled(PRESERVEALPHA));
159  ui->useAABox->setVisible(tool->isPropertyEnabled(ANTI_ALIASING));
160  ui->stabilizerLabel->setVisible(tool->isPropertyEnabled(STABILIZATION));
161  ui->inpolLevelsCombo->setVisible(tool->isPropertyEnabled(STABILIZATION));
162  ui->toleranceSlider->setVisible(tool->isPropertyEnabled(TOLERANCE));
163  ui->toleranceSpinBox->setVisible(tool->isPropertyEnabled(TOLERANCE));
164  ui->fillContourBox->setVisible(tool->isPropertyEnabled(FILLCONTOUR));
165 
166  auto currentLayerType = editor()->layers()->currentLayer()->type();
167  auto propertyType = editor()->tools()->currentTool()->type();
168 
169  if (currentLayerType == Layer::VECTOR)
170  {
171  switch (propertyType)
172  {
173  case SMUDGE:
174  ui->sizeSlider->setVisible(false);
175  ui->brushSpinBox->setVisible(false);
176  ui->usePressureBox->setVisible(false);
177  ui->featherSlider->setVisible(false);
178  ui->featherSpinBox->setVisible(false);
179  ui->useFeatherBox->setVisible(false);
180  break;
181  case PENCIL:
182  ui->sizeSlider->setVisible(false);
183  ui->brushSpinBox->setVisible(false);
184  ui->usePressureBox->setVisible(false);
185  break;
186  case BUCKET:
187  ui->sizeSlider->setLabel(tr("Stroke Thickness"));
188  ui->toleranceSlider->setVisible(false);
189  ui->toleranceSpinBox->setVisible(false);
190  break;
191  default:
192  ui->sizeSlider->setLabel(tr("Width"));
193  ui->toleranceSlider->setVisible(false);
194  ui->toleranceSpinBox->setVisible(false);
195  ui->useAABox->setVisible(false);
196  break;
197  }
198  }
199  else
200  {
201  switch (propertyType)
202  {
203  case PENCIL:
204  ui->fillContourBox->setVisible(false);
205  break;
206  case BUCKET:
207  ui->brushSpinBox->setVisible(false);
208  ui->sizeSlider->setVisible(false);
209  break;
210  default:
211  ui->makeInvisibleBox->setVisible(false);
212  break;
213  }
214  }
215 }
216 
217 void ToolOptionWidget::onToolChanged(ToolType)
218 {
219  updateUI();
220 }
221 
222 void ToolOptionWidget::setPenWidth(qreal width)
223 {
224  QSignalBlocker b(ui->sizeSlider);
225  ui->sizeSlider->setEnabled(true);
226  ui->sizeSlider->setValue(width);
227 
228  QSignalBlocker b2(ui->brushSpinBox);
229  ui->brushSpinBox->setEnabled(true);
230  ui->brushSpinBox->setValue(width);
231 }
232 
233 void ToolOptionWidget::setPenFeather(qreal featherValue)
234 {
235  QSignalBlocker b(ui->featherSlider);
236  ui->featherSlider->setEnabled(true);
237  ui->featherSlider->setValue(featherValue);
238 
239  QSignalBlocker b2(ui->featherSpinBox);
240  ui->featherSpinBox->setEnabled(true);
241  ui->featherSpinBox->setValue(featherValue);
242 }
243 
244 void ToolOptionWidget::setUseFeather(bool useFeather)
245 {
246  QSignalBlocker b(ui->useFeatherBox);
247  ui->useFeatherBox->setEnabled(true);
248  ui->useFeatherBox->setChecked(useFeather);
249 }
250 
251 void ToolOptionWidget::setPenInvisibility(int x)
252 {
253  QSignalBlocker b(ui->makeInvisibleBox);
254  ui->makeInvisibleBox->setEnabled(true);
255  ui->makeInvisibleBox->setChecked(x > 0);
256 }
257 
258 void ToolOptionWidget::setPressure(int x)
259 {
260  QSignalBlocker b(ui->usePressureBox);
261  ui->usePressureBox->setEnabled(true);
262  ui->usePressureBox->setChecked(x > 0);
263 }
264 
265 void ToolOptionWidget::setPreserveAlpha(int x)
266 {
267  QSignalBlocker b(ui->preserveAlphaBox);
268  ui->preserveAlphaBox->setEnabled(true);
269  ui->preserveAlphaBox->setChecked(x > 0);
270 }
271 
272 void ToolOptionWidget::setVectorMergeEnabled(int x)
273 {
274  QSignalBlocker b(ui->vectorMergeBox);
275  ui->vectorMergeBox->setEnabled(true);
276  ui->vectorMergeBox->setChecked(x > 0);
277 }
278 
279 void ToolOptionWidget::setAA(int x)
280 {
281  QSignalBlocker b(ui->useAABox);
282  ui->useAABox->setEnabled(true);
283  ui->useAABox->setVisible(false);
284 
285  auto layerType = editor()->layers()->currentLayer()->type();
286 
287  if (layerType == Layer::BITMAP)
288  {
289  if (x == -1)
290  {
291  ui->useAABox->setEnabled(false);
292  ui->useAABox->setVisible(false);
293  }
294  else
295  {
296  ui->useAABox->setVisible(true);
297  }
298  ui->useAABox->setChecked(x > 0);
299  }
300 }
301 
302 void ToolOptionWidget::setStabilizerLevel(int x)
303 {
304  ui->inpolLevelsCombo->setCurrentIndex(qBound(0, x, ui->inpolLevelsCombo->count() - 1));
305 }
306 
307 void ToolOptionWidget::setTolerance(int tolerance)
308 {
309  QSignalBlocker b(ui->toleranceSlider);
310  ui->toleranceSlider->setEnabled(true);
311  ui->toleranceSlider->setValue(tolerance);
312 
313  QSignalBlocker b2(ui->toleranceSpinBox);
314  ui->toleranceSpinBox->setEnabled(true);
315  ui->toleranceSpinBox->setValue(tolerance);
316 }
317 
318 void ToolOptionWidget::setFillContour(int useFill)
319 {
320  QSignalBlocker b(ui->fillContourBox);
321  ui->fillContourBox->setEnabled(true);
322  ui->fillContourBox->setChecked(useFill > 0);
323 }
324 
325 void ToolOptionWidget::setBezier(bool useBezier)
326 {
327  QSignalBlocker b(ui->useBezierBox);
328  ui->useBezierBox->setChecked(useBezier);
329 }
330 
331 void ToolOptionWidget::disableAllOptions()
332 {
333  ui->sizeSlider->hide();
334  ui->brushSpinBox->hide();
335  ui->featherSlider->hide();
336  ui->featherSpinBox->hide();
337  ui->useFeatherBox->hide();
338  ui->useBezierBox->hide();
339  ui->usePressureBox->hide();
340  ui->makeInvisibleBox->hide();
341  ui->preserveAlphaBox->hide();
342  ui->vectorMergeBox->hide();
343  ui->useAABox->hide();
344  ui->inpolLevelsCombo->hide();
345  ui->toleranceSlider->hide();
346  ui->toleranceSpinBox->hide();
347  ui->fillContourBox->hide();
348 }
QString tr(const char *sourceText, const char *disambiguation, int n)
void valueChanged(int i)
void valueChanged(double d)
void clicked(bool checked)
void activated(int index)
void setWidget(QWidget *widget)
void setWindowTitle(const QString &)
QWidget(QWidget *parent, Qt::WindowFlags f)
Definition: editor.h:51
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)