18 #include <QToolButton>
21 #include <QGridLayout>
23 #include <QRadioButton>
26 #include "spinslider.h"
27 #include "toolmanager.h"
28 #include "tooloptionwidget.h"
32 #include "layermanager.h"
34 ToolOptionWidget::ToolOptionWidget( QWidget* parent ) :
BaseDockWidget( parent )
36 setWindowTitle( tr(
"Options",
"Window title of tool options like pen width, feather etc.." ) );
39 ToolOptionWidget::~ToolOptionWidget()
43 void ToolOptionWidget::initUI()
48 void ToolOptionWidget::updateUI()
50 BaseTool* currentTool = editor()->tools()->currentTool();
51 Q_ASSERT( currentTool );
55 mSizeSlider->setVisible( currentTool->isPropertyEnabled( WIDTH ) );
56 mBrushSpinBox->setVisible( currentTool->isPropertyEnabled( WIDTH) );
57 mFeatherSlider->setVisible( currentTool->isPropertyEnabled( FEATHER ) );
58 mUseFeatherBox->setVisible( currentTool->isPropertyEnabled( FEATHER ) );
59 mFeatherSpinBox->setVisible( currentTool->isPropertyEnabled( FEATHER) );
60 mUseBezierBox->setVisible( currentTool->isPropertyEnabled( BEZIER ) );
61 mUsePressureBox->setVisible( currentTool->isPropertyEnabled( PRESSURE ) );
62 mMakeInvisibleBox->setVisible( currentTool->isPropertyEnabled( INVISIBILITY ) );
63 mPreserveAlphaBox->setVisible( currentTool->isPropertyEnabled( PRESERVEALPHA ) );
64 mUseAABox->setVisible(currentTool->isPropertyEnabled( ANTI_ALIASING ) );
65 mInpolLevelsBox->setVisible(currentTool->isPropertyEnabled( INTERPOLATION ) );
66 mToleranceSlider->setVisible(currentTool->isPropertyEnabled( TOLERANCE ) );
67 mToleranceSpinBox->setVisible(currentTool->isPropertyEnabled( TOLERANCE ) );
68 mFillContour->setVisible( currentTool->isPropertyEnabled( FILLCONTOUR ) );
74 setPenWidth( p.width );
75 setPenFeather( p.feather );
76 setUseFeather( p.useFeather );
77 setPressure( p.pressure );
78 setPenInvisibility( p.invisibility );
79 setPreserveAlpha( p.preserveAlpha );
80 setVectorMergeEnabled( p.vectorMergeEnabled );
82 setInpolLevel(p.inpolLevel);
83 setTolerance(p.tolerance);
84 setFillContour(p.useFillContour);
87 void ToolOptionWidget::createUI()
89 setMinimumWidth( 115 );
92 QFrame* optionGroup =
new QFrame();
93 QGridLayout* pLayout =
new QGridLayout();
94 pLayout->setMargin( 8 );
95 pLayout->setSpacing( 8 );
97 QSettings settings( PENCIL2D, PENCIL2D );
99 mSizeSlider =
new SpinSlider( tr(
"Brush" ), SpinSlider::EXPONENT, SpinSlider::INTEGER, 1, 200,
this );
100 mSizeSlider->setValue( settings.value(
"brushWidth" ).toDouble() );
101 mSizeSlider->setToolTip( tr(
"Set Pen Width <br><b>[SHIFT]+drag</b><br>for quick adjustment" ) );
103 mBrushSpinBox =
new QSpinBox(
this);
104 mBrushSpinBox->setRange(1,200);
105 mBrushSpinBox->setValue(settings.value(
"brushWidth" ).toDouble() );
107 mFeatherSlider =
new SpinSlider( tr(
"Feather" ), SpinSlider::LOG, SpinSlider::INTEGER, 2, 64,
this );
108 mFeatherSlider->setValue( settings.value(
"brushFeather" ).toDouble() );
109 mFeatherSlider->setToolTip( tr(
"Set Pen Feather <br><b>[CTRL]+drag</b><br>for quick adjustment" ) );
111 mFeatherSpinBox =
new QSpinBox(
this);
112 mFeatherSpinBox->setRange(2,64);
113 mFeatherSpinBox->setValue(settings.value(
"brushFeather" ).toDouble() );
115 mUseFeatherBox =
new QCheckBox( tr(
"Use Feather" ) );
116 mUseFeatherBox->setToolTip( tr(
"Enable or disable feathering" ) );
117 mUseFeatherBox->setFont( QFont(
"Helvetica", 10 ) );
118 mUseFeatherBox->setChecked( settings.value(
"brushUseFeather" ).toBool() );
120 mUseBezierBox =
new QCheckBox( tr(
"Bezier" ) );
121 mUseBezierBox->setToolTip( tr(
"Bezier curve fitting" ) );
122 mUseBezierBox->setFont( QFont(
"Helvetica", 10 ) );
123 mUseBezierBox->setChecked(
false );
125 mUsePressureBox =
new QCheckBox( tr(
"Pressure" ) );
126 mUsePressureBox->setToolTip( tr(
"Size with pressure" ) );
127 mUsePressureBox->setFont( QFont(
"Helvetica", 10 ) );
128 mUsePressureBox->setChecked(
true );
130 mUseAABox =
new QCheckBox( tr(
"Anti-Aliasing" ) );
131 mUseAABox->setToolTip( tr(
"Enable Anti-Aliasing" ) );
132 mUseAABox->setFont( QFont(
"Helvetica", 10 ) );
133 mUseAABox->setChecked(
true );
135 mFillContour =
new QCheckBox( tr(
"Fill Contour",
"ToolOptions" ) );
136 mFillContour->setToolTip( tr(
"Contour will be filled" ) );
137 mFillContour->setFont( QFont(
"Helvetica", 10 ) );
138 mFillContour->setChecked(
true );
140 mInpolLevelsBox =
new QGroupBox ( tr(
"Stabilization level" ) );
141 mInpolLevelsBox->setFlat(
true);
142 mInpolLevelsBox->setFont(QFont(
"Helvetica", 10 ) );
143 mInpolLevelsBox->setStyleSheet(
150 "subcontrol-origin: margin;"
152 "padding: 0.7em 3px 0 3px;"
155 mNoInpol =
new QRadioButton ( tr(
"" ) );
156 mNoInpol->setToolTip( tr(
"No line interpolation" ) );
157 mNoInpol->setFont( QFont(
"Helvetica", 10) );
158 mNoInpol->setChecked (
true );
160 mSimpleInpol =
new QRadioButton (tr(
"" ) );
161 mSimpleInpol->setToolTip( tr(
"Simple line interpolation" ) );
162 mSimpleInpol->setChecked (
false );
164 mStrongInpol =
new QRadioButton (tr(
"" ) );
165 mStrongInpol->setToolTip( tr(
"Strong line interpolation" ) );
166 mStrongInpol->setChecked (
false );
173 QGridLayout* inpolLayout =
new QGridLayout();
174 inpolLayout->addWidget( mNoInpol, 16, 0, 2, 1 );
175 inpolLayout->addWidget( mSimpleInpol, 16, 1, 2, 1 );
176 inpolLayout->addWidget( mStrongInpol, 16, 2, 2, 1 );
178 mInpolLevelsBox->setLayout(inpolLayout);
179 inpolLayout->setSpacing(2);
181 mToleranceSlider =
new SpinSlider( tr(
"Color Tolerance" ), SpinSlider::LINEAR, SpinSlider::INTEGER, 1, 100,
this );
182 mToleranceSlider->setValue( settings.value(
"Tolerance" ).toInt() );
183 mToleranceSlider->setToolTip( tr(
"The extend to which the color variation will be treated as being equal" ) );
185 mToleranceSpinBox =
new QSpinBox(
this);
186 mToleranceSpinBox->setRange(1,100);
187 mToleranceSpinBox->setValue(settings.value(
"Tolerance" ).toInt() );
189 mMakeInvisibleBox =
new QCheckBox( tr(
"Invisible" ) );
190 mMakeInvisibleBox->setToolTip( tr(
"Make invisible" ) );
191 mMakeInvisibleBox->setFont( QFont(
"Helvetica", 10 ) );
192 mMakeInvisibleBox->setChecked(
false );
194 mPreserveAlphaBox =
new QCheckBox( tr(
"Alpha" ) );
195 mPreserveAlphaBox->setToolTip( tr(
"Preserve Alpha" ) );
196 mPreserveAlphaBox->setFont( QFont(
"Helvetica", 10 ) );
197 mPreserveAlphaBox->setChecked(
false );
199 mVectorMergeBox =
new QCheckBox( tr(
"Merge" ) );
200 mVectorMergeBox->setToolTip( tr(
"Merge vector lines when they are close together" ) );
201 mVectorMergeBox->setFont( QFont(
"Helvetica", 10 ) );
202 mVectorMergeBox->setChecked(
false );
204 pLayout->addWidget( mSizeSlider, 1, 0, 1, 2 );
205 pLayout->addWidget( mBrushSpinBox, 1, 2, 1, 2);
206 pLayout->addWidget( mFeatherSlider, 2, 0, 1, 2 );
207 pLayout->addWidget( mFeatherSpinBox, 2, 2, 1, 2 );
208 pLayout->addWidget( mUseFeatherBox, 3, 0, 1, 2 );
209 pLayout->addWidget( mUseBezierBox, 4, 0, 1, 2 );
210 pLayout->addWidget( mUsePressureBox, 5, 0, 1, 2 );
211 pLayout->addWidget( mUseAABox, 6, 0, 1, 2);
212 pLayout->addWidget( mPreserveAlphaBox, 7, 0, 1, 2 );
213 pLayout->addWidget( mMakeInvisibleBox, 8, 0, 1, 2 );
214 pLayout->addWidget( mVectorMergeBox, 9, 0, 1, 2 );
215 pLayout->addWidget( mInpolLevelsBox, 10, 0, 1, 4);
216 pLayout->addWidget( mToleranceSlider, 1, 0, 1, 2);
217 pLayout->addWidget( mToleranceSpinBox, 1, 2, 1, 2);
218 pLayout->addWidget( mFillContour, 1, 0, 1, 2);
220 pLayout->setRowStretch( 17, 1 );
222 optionGroup->setLayout( pLayout );
224 setWidget( optionGroup );
227 void ToolOptionWidget::makeConnectionToEditor(
Editor* editor )
229 auto toolManager = editor->tools();
231 connect( mUseBezierBox, &QCheckBox::clicked, toolManager, &ToolManager::setBezier );
232 connect( mUsePressureBox, &QCheckBox::clicked, toolManager, &ToolManager::setPressure );
233 connect( mMakeInvisibleBox, &QCheckBox::clicked, toolManager, &ToolManager::setInvisibility );
234 connect( mPreserveAlphaBox, &QCheckBox::clicked, toolManager, &ToolManager::setPreserveAlpha );
236 connect( mSizeSlider, &SpinSlider::valueChanged, toolManager, &ToolManager::setWidth );
237 connect( mFeatherSlider, &SpinSlider::valueChanged, toolManager, &ToolManager::setFeather );
239 connect( mBrushSpinBox,
static_cast<void (QSpinBox::*)(
int)
>(&QSpinBox::valueChanged), toolManager, &ToolManager::setWidth );
240 connect( mFeatherSpinBox,
static_cast<void (QSpinBox::*)(
int)
>(&QSpinBox::valueChanged), toolManager, &ToolManager::setFeather );
242 connect( mUseFeatherBox, &QCheckBox::clicked, toolManager, &ToolManager::setUseFeather );
244 connect( mVectorMergeBox, &QCheckBox::clicked, toolManager, &ToolManager::setVectorMergeEnabled );
245 connect( mUseAABox, &QCheckBox::clicked, toolManager, &ToolManager::setAA );
247 connect( mNoInpol, &QRadioButton::clicked, toolManager, &ToolManager::noInpolSelected);
248 connect( mSimpleInpol, &QRadioButton::clicked, toolManager, &ToolManager::SimplepolSelected);
249 connect( mStrongInpol, &QRadioButton::clicked, toolManager, &ToolManager::StrongpolSelected);
250 connect( mExtremeInpol, &QRadioButton::clicked, toolManager, &ToolManager::ExtremepolSelected);
252 connect( mToleranceSlider, &SpinSlider::valueChanged, toolManager, &ToolManager::setTolerance);
253 connect( mToleranceSpinBox,
static_cast<void (QSpinBox::*)(
int)
>(&QSpinBox::valueChanged), toolManager, &ToolManager::setTolerance);
255 connect( mFillContour, &QCheckBox::clicked, toolManager, &ToolManager::setUseFillContour );
257 connect( toolManager, &ToolManager::toolChanged,
this, &ToolOptionWidget::onToolChanged );
258 connect( toolManager, &ToolManager::toolPropertyChanged,
this, &ToolOptionWidget::onToolPropertyChanged );
261 void ToolOptionWidget::onToolPropertyChanged( ToolType, ToolPropertyType ePropertyType )
263 const Properties& p = editor()->tools()->currentTool()->properties;
265 switch ( ePropertyType )
268 setPenWidth( p.width );
271 setPenFeather( p.feather );
274 setUseFeather( p.useFeather );
277 setPressure( p.pressure );
280 setPenInvisibility( p.invisibility );
283 setPreserveAlpha( p.preserveAlpha );
286 setVectorMergeEnabled(p.vectorMergeEnabled);
292 setInpolLevel(p.inpolLevel);
295 setTolerance(p.tolerance);
298 setFillContour(p.useFillContour);
305 void ToolOptionWidget::visibilityOnLayer()
307 auto currentLayerType = editor()->layers()->currentLayer()->type();
308 auto propertyType = editor()->tools()->currentTool()->type();
310 if (currentLayerType == Layer::VECTOR)
312 switch (propertyType)
315 mSizeSlider->setVisible(
false);
316 mBrushSpinBox->setVisible(
false);
317 mUsePressureBox->setVisible(
false);
320 mToleranceSlider->setVisible(
false);
321 mToleranceSpinBox->setVisible(
false);
322 mUseAABox->setVisible(
false);
328 switch (propertyType)
331 mFillContour->setVisible(
false);
334 mMakeInvisibleBox->setVisible(
false);
341 void ToolOptionWidget::onToolChanged( ToolType )
346 void ToolOptionWidget::setPenWidth( qreal width )
349 mSizeSlider->setEnabled(
true );
350 mSizeSlider->setValue( width );
353 mBrushSpinBox->setEnabled(
true );
354 mBrushSpinBox->setValue( width );
357 void ToolOptionWidget::setPenFeather( qreal featherValue )
360 mFeatherSlider->setEnabled(
true );
361 mFeatherSlider->setValue( featherValue );
364 mFeatherSpinBox->setEnabled(
true );
365 mFeatherSpinBox->setValue( featherValue );
368 void ToolOptionWidget::setUseFeather(
bool useFeather)
371 mUseFeatherBox->setEnabled(
true);
372 mUseFeatherBox->setChecked(useFeather);
375 void ToolOptionWidget::setPenInvisibility(
int x )
378 mMakeInvisibleBox->setEnabled(
true );
379 mMakeInvisibleBox->setChecked( x > 0 );
382 void ToolOptionWidget::setPressure(
int x )
385 mUsePressureBox->setEnabled(
true );
386 mUsePressureBox->setChecked( x > 0 );
389 void ToolOptionWidget::setPreserveAlpha(
int x )
391 qDebug() <<
"Setting - Preserve Alpha=" << x;
394 mPreserveAlphaBox->setEnabled(
true );
395 mPreserveAlphaBox->setChecked( x > 0 );
398 void ToolOptionWidget::setVectorMergeEnabled(
int x)
400 qDebug() <<
"Setting - Vector Merge Enabled=" << x;
403 mVectorMergeBox->setEnabled(
true );
404 mVectorMergeBox->setChecked( x > 0 );
407 void ToolOptionWidget::setAA(
int x)
409 qDebug() <<
"Setting - Pen AA Enabled=" << x;
412 mUseAABox->setEnabled(
true );
413 mUseAABox->setVisible(
false );
415 auto layerType = editor()->layers()->currentLayer()->type();
417 if (layerType == Layer::BITMAP)
420 mUseAABox->setEnabled(
false);
421 mUseAABox->setVisible(
false);
423 mUseAABox->setVisible(
true);
425 mUseAABox->setChecked( x > 0 );
429 void ToolOptionWidget::setInpolLevel(
int x)
431 qDebug() <<
"Setting - Interpolation level:" << x;
437 mNoInpol->setChecked(
true);
440 mSimpleInpol->setChecked(
true);
442 mStrongInpol->setChecked(
true);
444 mExtremeInpol->setChecked(
true);
445 }
else if (x == -1) {
446 mNoInpol->setChecked(
true);
450 void ToolOptionWidget::setTolerance(
int tolerance)
453 mToleranceSlider->setEnabled(
true );
454 mToleranceSlider->setValue( tolerance );
457 mToleranceSpinBox->setEnabled(
true );
458 mToleranceSpinBox->setValue( tolerance );
461 void ToolOptionWidget::setFillContour(
int useFill)
464 mFillContour->setEnabled(
true);
465 mFillContour->setChecked(useFill > 0);
468 void ToolOptionWidget::disableAllOptions()
471 mBrushSpinBox->hide();
472 mFeatherSlider->hide();
473 mFeatherSpinBox->hide();
474 mUseFeatherBox->hide();
475 mUseBezierBox->hide();
476 mUsePressureBox->hide();
477 mMakeInvisibleBox->hide();
478 mPreserveAlphaBox->hide();
479 mVectorMergeBox->hide();
481 mInpolLevelsBox->hide();
482 mToleranceSlider->hide();
483 mToleranceSpinBox->hide();
484 mFillContour->hide();