1 /***************************************************************************
2     qgspainteffectwidget.cpp
3     ------------------------
4     begin                : January 2015
5     copyright            : (C) 2015 by Nyall Dawson
6     email                : nyall dot dawson at gmail.com
7  ***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 
16 
17 #include "qgspainteffectwidget.h"
18 #include "qgslogger.h"
19 #include "qgspainteffect.h"
20 #include "qgsshadoweffect.h"
21 #include "qgsblureffect.h"
22 #include "qgsgloweffect.h"
23 #include "qgstransformeffect.h"
24 #include "qgscoloreffect.h"
25 #include "qgsstyle.h"
26 #include "qgscolorramp.h"
27 #include "qgscolorrampbutton.h"
28 
29 //
30 // draw source
31 //
32 
QgsDrawSourceWidget(QWidget * parent)33 QgsDrawSourceWidget::QgsDrawSourceWidget( QWidget *parent )
34   : QgsPaintEffectWidget( parent )
35 
36 {
37   setupUi( this );
38   connect( mDrawModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsDrawSourceWidget::mDrawModeComboBox_currentIndexChanged );
39   connect( mBlendCmbBx, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsDrawSourceWidget::mBlendCmbBx_currentIndexChanged );
40   initGui();
41 }
42 
43 
setPaintEffect(QgsPaintEffect * effect)44 void QgsDrawSourceWidget::setPaintEffect( QgsPaintEffect *effect )
45 {
46   if ( !effect || effect->type() != QLatin1String( "drawSource" ) )
47     return;
48 
49   mEffect = static_cast<QgsDrawSourceEffect *>( effect );
50   initGui();
51 
52   connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsDrawSourceWidget::opacityChanged );
53 }
54 
initGui()55 void QgsDrawSourceWidget::initGui()
56 {
57   if ( !mEffect )
58   {
59     return;
60   }
61 
62   blockSignals( true );
63 
64   mOpacityWidget->setOpacity( mEffect->opacity() );
65   mBlendCmbBx->setBlendMode( mEffect->blendMode() );
66   mDrawModeComboBox->setDrawMode( mEffect->drawMode() );
67 
68   blockSignals( false );
69 }
70 
blockSignals(const bool block)71 void QgsDrawSourceWidget::blockSignals( const bool block )
72 {
73   mOpacityWidget->blockSignals( block );
74   mBlendCmbBx->blockSignals( block );
75   mDrawModeComboBox->blockSignals( block );
76 }
77 
opacityChanged(double value)78 void QgsDrawSourceWidget::opacityChanged( double value )
79 {
80   if ( !mEffect )
81     return;
82 
83   mEffect->setOpacity( value );
84   emit changed();
85 }
86 
mDrawModeComboBox_currentIndexChanged(int index)87 void QgsDrawSourceWidget::mDrawModeComboBox_currentIndexChanged( int index )
88 {
89   Q_UNUSED( index )
90 
91   if ( !mEffect )
92     return;
93 
94   mEffect->setDrawMode( mDrawModeComboBox->drawMode() );
95   emit changed();
96 }
97 
mBlendCmbBx_currentIndexChanged(int index)98 void QgsDrawSourceWidget::mBlendCmbBx_currentIndexChanged( int index )
99 {
100   Q_UNUSED( index )
101 
102   if ( !mEffect )
103     return;
104 
105   mEffect->setBlendMode( mBlendCmbBx->blendMode() );
106   emit changed();
107 }
108 
109 
110 //
111 // blur
112 //
113 
QgsBlurWidget(QWidget * parent)114 QgsBlurWidget::QgsBlurWidget( QWidget *parent )
115   : QgsPaintEffectWidget( parent )
116 
117 {
118   setupUi( this );
119   connect( mBlurTypeCombo, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsBlurWidget::mBlurTypeCombo_currentIndexChanged );
120   connect( mBlurStrengthSpnBx, static_cast< void ( QDoubleSpinBox::* )( double ) >( &QDoubleSpinBox::valueChanged ), this, &QgsBlurWidget::mBlurStrengthSpnBx_valueChanged );
121   connect( mBlurUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsBlurWidget::mBlurUnitWidget_changed );
122   connect( mDrawModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsBlurWidget::mDrawModeComboBox_currentIndexChanged );
123   connect( mBlendCmbBx, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsBlurWidget::mBlendCmbBx_currentIndexChanged );
124 
125   mBlurTypeCombo->addItem( tr( "Stack Blur (fast, doesn't support high dpi)" ), QgsBlurEffect::StackBlur );
126   mBlurTypeCombo->addItem( tr( "Gaussian Blur (quality, supports high dpi)" ), QgsBlurEffect::GaussianBlur );
127 
128   mBlurUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderMapUnits
129                              << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches );
130 
131   initGui();
132   connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsBlurWidget::opacityChanged );
133 }
134 
135 
setPaintEffect(QgsPaintEffect * effect)136 void QgsBlurWidget::setPaintEffect( QgsPaintEffect *effect )
137 {
138   if ( !effect || effect->type() != QLatin1String( "blur" ) )
139     return;
140 
141   mEffect = static_cast<QgsBlurEffect *>( effect );
142   initGui();
143 }
144 
initGui()145 void QgsBlurWidget::initGui()
146 {
147   if ( !mEffect )
148   {
149     return;
150   }
151 
152   blockSignals( true );
153 
154   mBlurTypeCombo->setCurrentIndex( mBlurTypeCombo->findData( mEffect->blurMethod() ) );
155   mBlurStrengthSpnBx->setValue( mEffect->blurLevel() );
156   mOpacityWidget->setOpacity( mEffect->opacity() );
157   mBlendCmbBx->setBlendMode( mEffect->blendMode() );
158   mDrawModeComboBox->setDrawMode( mEffect->drawMode() );
159 
160   mBlurUnitWidget->setUnit( mEffect->blurUnit() );
161   mBlurUnitWidget->setMapUnitScale( mEffect->blurMapUnitScale() );
162 
163   blockSignals( false );
164 }
165 
blockSignals(const bool block)166 void QgsBlurWidget::blockSignals( const bool block )
167 {
168   mBlurTypeCombo->blockSignals( block );
169   mBlurStrengthSpnBx->blockSignals( block );
170   mOpacityWidget->blockSignals( block );
171   mBlendCmbBx->blockSignals( block );
172   mDrawModeComboBox->blockSignals( block );
173 }
174 
mBlurTypeCombo_currentIndexChanged(int index)175 void QgsBlurWidget::mBlurTypeCombo_currentIndexChanged( int index )
176 {
177   if ( !mEffect )
178     return;
179 
180   const QgsBlurEffect::BlurMethod method = ( QgsBlurEffect::BlurMethod ) mBlurTypeCombo->itemData( index ).toInt();
181   mEffect->setBlurMethod( method );
182 
183   //also update max radius
184   switch ( method )
185   {
186     case QgsBlurEffect::StackBlur:
187       mBlurStrengthSpnBx->setMaximum( 16 );
188       break;
189     case QgsBlurEffect::GaussianBlur:
190       mBlurStrengthSpnBx->setMaximum( 200 );
191       break;
192   }
193 
194   emit changed();
195 }
196 
mBlurStrengthSpnBx_valueChanged(double value)197 void QgsBlurWidget::mBlurStrengthSpnBx_valueChanged( double value )
198 {
199   if ( !mEffect )
200     return;
201 
202   mEffect->setBlurLevel( value );
203   emit changed();
204 }
205 
mBlurUnitWidget_changed()206 void QgsBlurWidget::mBlurUnitWidget_changed()
207 {
208   if ( !mEffect )
209   {
210     return;
211   }
212 
213   mEffect->setBlurUnit( mBlurUnitWidget->unit() );
214   mEffect->setBlurMapUnitScale( mBlurUnitWidget->getMapUnitScale() );
215   emit changed();
216 }
217 
opacityChanged(double value)218 void QgsBlurWidget::opacityChanged( double value )
219 {
220   if ( !mEffect )
221     return;
222 
223   mEffect->setOpacity( value );
224   emit changed();
225 }
226 
mDrawModeComboBox_currentIndexChanged(int index)227 void QgsBlurWidget::mDrawModeComboBox_currentIndexChanged( int index )
228 {
229   Q_UNUSED( index )
230 
231   if ( !mEffect )
232     return;
233 
234   mEffect->setDrawMode( mDrawModeComboBox->drawMode() );
235   emit changed();
236 }
237 
mBlendCmbBx_currentIndexChanged(int index)238 void QgsBlurWidget::mBlendCmbBx_currentIndexChanged( int index )
239 {
240   Q_UNUSED( index )
241 
242   if ( !mEffect )
243     return;
244 
245   mEffect->setBlendMode( mBlendCmbBx->blendMode() );
246   emit changed();
247 }
248 
249 
250 //
251 // Drop Shadow
252 //
253 
QgsShadowEffectWidget(QWidget * parent)254 QgsShadowEffectWidget::QgsShadowEffectWidget( QWidget *parent )
255   : QgsPaintEffectWidget( parent )
256 
257 {
258   setupUi( this );
259   connect( mShadowOffsetAngleSpnBx, static_cast< void ( QSpinBox::* )( int ) >( &QSpinBox::valueChanged ), this, &QgsShadowEffectWidget::mShadowOffsetAngleSpnBx_valueChanged );
260   connect( mShadowOffsetAngleDial, &QDial::valueChanged, this, &QgsShadowEffectWidget::mShadowOffsetAngleDial_valueChanged );
261   connect( mShadowOffsetSpnBx, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsShadowEffectWidget::mShadowOffsetSpnBx_valueChanged );
262   connect( mOffsetUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsShadowEffectWidget::mOffsetUnitWidget_changed );
263   connect( mShadowColorBtn, &QgsColorButton::colorChanged, this, &QgsShadowEffectWidget::mShadowColorBtn_colorChanged );
264   connect( mDrawModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsShadowEffectWidget::mDrawModeComboBox_currentIndexChanged );
265   connect( mShadowBlendCmbBx, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsShadowEffectWidget::mShadowBlendCmbBx_currentIndexChanged );
266   connect( mShadowRadiuSpnBx, static_cast< void ( QDoubleSpinBox::* )( double ) >( &QDoubleSpinBox::valueChanged ), this, &QgsShadowEffectWidget::mShadowRadiuSpnBx_valueChanged );
267   connect( mBlurUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsShadowEffectWidget::mBlurUnitWidget_changed );
268 
269   mShadowColorBtn->setAllowOpacity( false );
270   mShadowColorBtn->setColorDialogTitle( tr( "Select Shadow Color" ) );
271   mShadowColorBtn->setContext( QStringLiteral( "symbology" ) );
272   mShadowOffsetAngleSpnBx->setClearValue( 0 );
273 
274   mOffsetUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderMapUnits
275                                << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches );
276   mBlurUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderMapUnits
277                              << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches );
278 
279   initGui();
280 
281   connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsShadowEffectWidget::opacityChanged );
282 }
283 
setPaintEffect(QgsPaintEffect * effect)284 void QgsShadowEffectWidget::setPaintEffect( QgsPaintEffect *effect )
285 {
286   if ( !effect || ( effect->type() != QLatin1String( "dropShadow" ) && effect->type() != QLatin1String( "innerShadow" ) ) )
287     return;
288 
289   mEffect = static_cast<QgsShadowEffect *>( effect );
290   initGui();
291 }
292 
initGui()293 void QgsShadowEffectWidget::initGui()
294 {
295   if ( !mEffect )
296   {
297     return;
298   }
299 
300   blockSignals( true );
301 
302   mShadowOffsetAngleSpnBx->setValue( mEffect->offsetAngle() );
303   mShadowOffsetAngleDial->setValue( mEffect->offsetAngle() );
304   mShadowOffsetSpnBx->setValue( mEffect->offsetDistance() );
305   mOffsetUnitWidget->setUnit( mEffect->offsetUnit() );
306   mOffsetUnitWidget->setMapUnitScale( mEffect->offsetMapUnitScale() );
307   mShadowRadiuSpnBx->setValue( mEffect->blurLevel() );
308   mBlurUnitWidget->setUnit( mEffect->blurUnit() );
309   mBlurUnitWidget->setMapUnitScale( mEffect->blurMapUnitScale() );
310   mOpacityWidget->setOpacity( mEffect->opacity() );
311   mShadowColorBtn->setColor( mEffect->color() );
312   mShadowBlendCmbBx->setBlendMode( mEffect->blendMode() );
313   mDrawModeComboBox->setDrawMode( mEffect->drawMode() );
314 
315   blockSignals( false );
316 }
317 
blockSignals(const bool block)318 void QgsShadowEffectWidget::blockSignals( const bool block )
319 {
320   mShadowOffsetAngleSpnBx->blockSignals( block );
321   mShadowOffsetAngleDial->blockSignals( block );
322   mShadowOffsetSpnBx->blockSignals( block );
323   mOffsetUnitWidget->blockSignals( block );
324   mShadowRadiuSpnBx->blockSignals( block );
325   mBlurUnitWidget->blockSignals( block );
326   mOpacityWidget->blockSignals( block );
327   mShadowColorBtn->blockSignals( block );
328   mShadowBlendCmbBx->blockSignals( block );
329   mDrawModeComboBox->blockSignals( block );
330 }
331 
mShadowOffsetAngleSpnBx_valueChanged(int value)332 void QgsShadowEffectWidget::mShadowOffsetAngleSpnBx_valueChanged( int value )
333 {
334   mShadowOffsetAngleDial->blockSignals( true );
335   mShadowOffsetAngleDial->setValue( value );
336   mShadowOffsetAngleDial->blockSignals( false );
337 
338   if ( !mEffect )
339     return;
340 
341   mEffect->setOffsetAngle( value );
342   emit changed();
343 }
344 
mShadowOffsetAngleDial_valueChanged(int value)345 void QgsShadowEffectWidget::mShadowOffsetAngleDial_valueChanged( int value )
346 {
347   mShadowOffsetAngleSpnBx->setValue( value );
348 }
349 
mShadowOffsetSpnBx_valueChanged(double value)350 void QgsShadowEffectWidget::mShadowOffsetSpnBx_valueChanged( double value )
351 {
352   if ( !mEffect )
353     return;
354 
355   mEffect->setOffsetDistance( value );
356   emit changed();
357 }
358 
mOffsetUnitWidget_changed()359 void QgsShadowEffectWidget::mOffsetUnitWidget_changed()
360 {
361   if ( !mEffect )
362   {
363     return;
364   }
365 
366   mEffect->setOffsetUnit( mOffsetUnitWidget->unit() );
367   mEffect->setOffsetMapUnitScale( mOffsetUnitWidget->getMapUnitScale() );
368   emit changed();
369 }
370 
opacityChanged(double value)371 void QgsShadowEffectWidget::opacityChanged( double value )
372 {
373   if ( !mEffect )
374     return;
375 
376   mEffect->setOpacity( value );
377   emit changed();
378 }
379 
mShadowColorBtn_colorChanged(const QColor & color)380 void QgsShadowEffectWidget::mShadowColorBtn_colorChanged( const QColor &color )
381 {
382   if ( !mEffect )
383     return;
384 
385   mEffect->setColor( color );
386   emit changed();
387 }
388 
mShadowRadiuSpnBx_valueChanged(double value)389 void QgsShadowEffectWidget::mShadowRadiuSpnBx_valueChanged( double value )
390 {
391   if ( !mEffect )
392     return;
393 
394   mEffect->setBlurLevel( value );
395   emit changed();
396 }
397 
mBlurUnitWidget_changed()398 void QgsShadowEffectWidget::mBlurUnitWidget_changed()
399 {
400   if ( !mEffect )
401   {
402     return;
403   }
404 
405   mEffect->setBlurUnit( mBlurUnitWidget->unit() );
406   mEffect->setBlurMapUnitScale( mBlurUnitWidget->getMapUnitScale() );
407   emit changed();
408 }
409 
mDrawModeComboBox_currentIndexChanged(int index)410 void QgsShadowEffectWidget::mDrawModeComboBox_currentIndexChanged( int index )
411 {
412   Q_UNUSED( index )
413 
414   if ( !mEffect )
415     return;
416 
417   mEffect->setDrawMode( mDrawModeComboBox->drawMode() );
418   emit changed();
419 }
420 
mShadowBlendCmbBx_currentIndexChanged(int index)421 void QgsShadowEffectWidget::mShadowBlendCmbBx_currentIndexChanged( int index )
422 {
423   Q_UNUSED( index )
424 
425   if ( !mEffect )
426     return;
427 
428   mEffect->setBlendMode( mShadowBlendCmbBx->blendMode() );
429   emit changed();
430 }
431 
432 
433 
434 //
435 // glow
436 //
437 
QgsGlowWidget(QWidget * parent)438 QgsGlowWidget::QgsGlowWidget( QWidget *parent )
439   : QgsPaintEffectWidget( parent )
440 
441 {
442   setupUi( this );
443   connect( mSpreadSpnBx, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsGlowWidget::mSpreadSpnBx_valueChanged );
444   connect( mSpreadUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsGlowWidget::mSpreadUnitWidget_changed );
445   connect( mColorBtn, &QgsColorButton::colorChanged, this, &QgsGlowWidget::mColorBtn_colorChanged );
446   connect( mBlendCmbBx, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsGlowWidget::mBlendCmbBx_currentIndexChanged );
447   connect( mDrawModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsGlowWidget::mDrawModeComboBox_currentIndexChanged );
448   connect( mBlurRadiusSpnBx, static_cast< void ( QDoubleSpinBox::* )( double ) >( &QDoubleSpinBox::valueChanged ), this, &QgsGlowWidget::mBlurRadiusSpnBx_valueChanged );
449   connect( mBlurUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsGlowWidget::mBlurUnitWidget_changed );
450 
451   mColorBtn->setAllowOpacity( false );
452   mColorBtn->setColorDialogTitle( tr( "Select Glow Color" ) );
453   mColorBtn->setContext( QStringLiteral( "symbology" ) );
454 
455   mSpreadUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderMapUnits
456                                << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches );
457   mBlurUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderMapUnits
458                              << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches );
459 
460   btnColorRamp->setShowGradientOnly( true );
461 
462   initGui();
463 
464   connect( btnColorRamp, &QgsColorRampButton::colorRampChanged, this, &QgsGlowWidget::applyColorRamp );
465   connect( radioSingleColor, &QAbstractButton::toggled, this, &QgsGlowWidget::colorModeChanged );
466   connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsGlowWidget::opacityChanged );
467 }
468 
setPaintEffect(QgsPaintEffect * effect)469 void QgsGlowWidget::setPaintEffect( QgsPaintEffect *effect )
470 {
471   if ( !effect || ( effect->type() != QLatin1String( "outerGlow" ) && effect->type() != QLatin1String( "innerGlow" ) ) )
472     return;
473 
474   mEffect = static_cast<QgsGlowEffect *>( effect );
475   initGui();
476 }
477 
initGui()478 void QgsGlowWidget::initGui()
479 {
480   if ( !mEffect )
481   {
482     return;
483   }
484 
485   blockSignals( true );
486 
487   mSpreadSpnBx->setValue( mEffect->spread() );
488   mSpreadUnitWidget->setUnit( mEffect->spreadUnit() );
489   mSpreadUnitWidget->setMapUnitScale( mEffect->spreadMapUnitScale() );
490   mBlurRadiusSpnBx->setValue( mEffect->blurLevel() );
491   mBlurUnitWidget->setUnit( mEffect->blurUnit() );
492   mBlurUnitWidget->setMapUnitScale( mEffect->blurMapUnitScale() );
493   mOpacityWidget->setOpacity( mEffect->opacity() );
494   mColorBtn->setColor( mEffect->color() );
495   mBlendCmbBx->setBlendMode( mEffect->blendMode() );
496 
497   if ( mEffect->ramp() )
498   {
499     btnColorRamp->setColorRamp( mEffect->ramp() );
500   }
501 
502   radioSingleColor->setChecked( mEffect->colorType() == QgsGlowEffect::SingleColor );
503   mColorBtn->setEnabled( mEffect->colorType() == QgsGlowEffect::SingleColor );
504   radioColorRamp->setChecked( mEffect->colorType() == QgsGlowEffect::ColorRamp );
505   btnColorRamp->setEnabled( mEffect->colorType() == QgsGlowEffect::ColorRamp );
506   mDrawModeComboBox->setDrawMode( mEffect->drawMode() );
507 
508   blockSignals( false );
509 }
510 
blockSignals(const bool block)511 void QgsGlowWidget::blockSignals( const bool block )
512 {
513   mSpreadSpnBx->blockSignals( block );
514   mSpreadUnitWidget->blockSignals( block );
515   mBlurRadiusSpnBx->blockSignals( block );
516   mOpacityWidget->blockSignals( block );
517   mColorBtn->blockSignals( block );
518   mBlendCmbBx->blockSignals( block );
519   btnColorRamp->blockSignals( block );
520   radioSingleColor->blockSignals( block );
521   radioColorRamp->blockSignals( block );
522   mDrawModeComboBox->blockSignals( block );
523 }
524 
colorModeChanged()525 void QgsGlowWidget::colorModeChanged()
526 {
527   if ( !mEffect )
528   {
529     return;
530   }
531 
532   if ( radioSingleColor->isChecked() )
533   {
534     mEffect->setColorType( QgsGlowEffect::SingleColor );
535   }
536   else
537   {
538     mEffect->setColorType( QgsGlowEffect::ColorRamp );
539     mEffect->setRamp( btnColorRamp->colorRamp() );
540   }
541   emit changed();
542 }
543 
mSpreadSpnBx_valueChanged(double value)544 void QgsGlowWidget::mSpreadSpnBx_valueChanged( double value )
545 {
546   if ( !mEffect )
547     return;
548 
549   mEffect->setSpread( value );
550   emit changed();
551 }
552 
mSpreadUnitWidget_changed()553 void QgsGlowWidget::mSpreadUnitWidget_changed()
554 {
555   if ( !mEffect )
556   {
557     return;
558   }
559 
560   mEffect->setSpreadUnit( mSpreadUnitWidget->unit() );
561   mEffect->setSpreadMapUnitScale( mSpreadUnitWidget->getMapUnitScale() );
562   emit changed();
563 }
564 
opacityChanged(double value)565 void QgsGlowWidget::opacityChanged( double value )
566 {
567   if ( !mEffect )
568     return;
569 
570   mEffect->setOpacity( value );
571   emit changed();
572 }
573 
mColorBtn_colorChanged(const QColor & color)574 void QgsGlowWidget::mColorBtn_colorChanged( const QColor &color )
575 {
576   if ( !mEffect )
577     return;
578 
579   mEffect->setColor( color );
580   emit changed();
581 }
582 
mBlurRadiusSpnBx_valueChanged(double value)583 void QgsGlowWidget::mBlurRadiusSpnBx_valueChanged( double value )
584 {
585   if ( !mEffect )
586     return;
587 
588   mEffect->setBlurLevel( value );
589   emit changed();
590 }
591 
mBlurUnitWidget_changed()592 void QgsGlowWidget::mBlurUnitWidget_changed()
593 {
594   if ( !mEffect )
595   {
596     return;
597   }
598 
599   mEffect->setBlurUnit( mBlurUnitWidget->unit() );
600   mEffect->setBlurMapUnitScale( mBlurUnitWidget->getMapUnitScale() );
601   emit changed();
602 }
603 
mBlendCmbBx_currentIndexChanged(int index)604 void QgsGlowWidget::mBlendCmbBx_currentIndexChanged( int index )
605 {
606   Q_UNUSED( index )
607 
608   if ( !mEffect )
609     return;
610 
611   mEffect->setBlendMode( mBlendCmbBx->blendMode() );
612   emit changed();
613 }
614 
mDrawModeComboBox_currentIndexChanged(int index)615 void QgsGlowWidget::mDrawModeComboBox_currentIndexChanged( int index )
616 {
617   Q_UNUSED( index )
618 
619   if ( !mEffect )
620     return;
621 
622   mEffect->setDrawMode( mDrawModeComboBox->drawMode() );
623   emit changed();
624 }
625 
applyColorRamp()626 void QgsGlowWidget::applyColorRamp()
627 {
628   if ( !mEffect )
629   {
630     return;
631   }
632 
633   QgsColorRamp *ramp = btnColorRamp->colorRamp();
634   if ( !ramp )
635     return;
636 
637   mEffect->setRamp( ramp );
638   emit changed();
639 }
640 
641 //
642 // transform
643 //
644 
QgsTransformWidget(QWidget * parent)645 QgsTransformWidget::QgsTransformWidget( QWidget *parent )
646   : QgsPaintEffectWidget( parent )
647 
648 {
649   setupUi( this );
650   connect( mDrawModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsTransformWidget::mDrawModeComboBox_currentIndexChanged );
651   connect( mSpinTranslateX, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsTransformWidget::mSpinTranslateX_valueChanged );
652   connect( mSpinTranslateY, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsTransformWidget::mSpinTranslateY_valueChanged );
653   connect( mTranslateUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsTransformWidget::mTranslateUnitWidget_changed );
654   connect( mReflectXCheckBox, &QCheckBox::stateChanged, this, &QgsTransformWidget::mReflectXCheckBox_stateChanged );
655   connect( mReflectYCheckBox, &QCheckBox::stateChanged, this, &QgsTransformWidget::mReflectYCheckBox_stateChanged );
656   connect( mSpinShearX, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsTransformWidget::mSpinShearX_valueChanged );
657   connect( mSpinShearY, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsTransformWidget::mSpinShearY_valueChanged );
658   connect( mSpinScaleX, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsTransformWidget::mSpinScaleX_valueChanged );
659   connect( mSpinScaleY, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsTransformWidget::mSpinScaleY_valueChanged );
660   connect( mRotationSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsTransformWidget::mRotationSpinBox_valueChanged );
661 
662   mTranslateUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderMapUnits
663                                   << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches );
664   mSpinTranslateX->setClearValue( 0 );
665   mSpinTranslateY->setClearValue( 0 );
666   mRotationSpinBox->setClearValue( 0 );
667   mSpinShearX->setClearValue( 0 );
668   mSpinShearY->setClearValue( 0 );
669   mSpinScaleX->setClearValue( 100.0 );
670   mSpinScaleY->setClearValue( 100.0 );
671 
672   initGui();
673 }
674 
675 
setPaintEffect(QgsPaintEffect * effect)676 void QgsTransformWidget::setPaintEffect( QgsPaintEffect *effect )
677 {
678   if ( !effect || effect->type() != QLatin1String( "transform" ) )
679     return;
680 
681   mEffect = static_cast<QgsTransformEffect *>( effect );
682   initGui();
683 }
684 
initGui()685 void QgsTransformWidget::initGui()
686 {
687   if ( !mEffect )
688   {
689     return;
690   }
691 
692   blockSignals( true );
693 
694   mReflectXCheckBox->setChecked( mEffect->reflectX() );
695   mReflectYCheckBox->setChecked( mEffect->reflectY() );
696   mDrawModeComboBox->setDrawMode( mEffect->drawMode() );
697   mSpinTranslateX->setValue( mEffect->translateX() );
698   mSpinTranslateY->setValue( mEffect->translateY() );
699   mTranslateUnitWidget->setUnit( mEffect->translateUnit() );
700   mTranslateUnitWidget->setMapUnitScale( mEffect->translateMapUnitScale() );
701   mSpinShearX->setValue( mEffect->shearX() );
702   mSpinShearY->setValue( mEffect->shearY() );
703   mSpinScaleX->setValue( mEffect->scaleX() * 100.0 );
704   mSpinScaleY->setValue( mEffect->scaleY() * 100.0 );
705   mRotationSpinBox->setValue( mEffect->rotation() );
706 
707   blockSignals( false );
708 }
709 
blockSignals(const bool block)710 void QgsTransformWidget::blockSignals( const bool block )
711 {
712   mDrawModeComboBox->blockSignals( block );
713   mTranslateUnitWidget->blockSignals( block );
714   mSpinTranslateX->blockSignals( block );
715   mSpinTranslateY->blockSignals( block );
716   mReflectXCheckBox->blockSignals( block );
717   mReflectYCheckBox->blockSignals( block );
718   mSpinShearX->blockSignals( block );
719   mSpinShearY->blockSignals( block );
720   mSpinScaleX->blockSignals( block );
721   mSpinScaleY->blockSignals( block );
722   mRotationSpinBox->blockSignals( block );
723 }
724 
725 
mDrawModeComboBox_currentIndexChanged(int index)726 void QgsTransformWidget::mDrawModeComboBox_currentIndexChanged( int index )
727 {
728   Q_UNUSED( index )
729 
730   if ( !mEffect )
731     return;
732 
733   mEffect->setDrawMode( mDrawModeComboBox->drawMode() );
734   emit changed();
735 }
736 
mSpinTranslateX_valueChanged(double value)737 void QgsTransformWidget::mSpinTranslateX_valueChanged( double value )
738 {
739   if ( !mEffect )
740     return;
741 
742   mEffect->setTranslateX( value );
743   emit changed();
744 }
745 
mSpinTranslateY_valueChanged(double value)746 void QgsTransformWidget::mSpinTranslateY_valueChanged( double value )
747 {
748   if ( !mEffect )
749     return;
750 
751   mEffect->setTranslateY( value );
752   emit changed();
753 }
754 
mTranslateUnitWidget_changed()755 void QgsTransformWidget::mTranslateUnitWidget_changed()
756 {
757   if ( !mEffect )
758   {
759     return;
760   }
761 
762   mEffect->setTranslateUnit( mTranslateUnitWidget->unit() );
763   mEffect->setTranslateMapUnitScale( mTranslateUnitWidget->getMapUnitScale() );
764   emit changed();
765 }
766 
mReflectXCheckBox_stateChanged(int state)767 void QgsTransformWidget::mReflectXCheckBox_stateChanged( int state )
768 {
769   if ( !mEffect )
770     return;
771 
772   mEffect->setReflectX( state == Qt::Checked );
773   emit changed();
774 }
775 
mReflectYCheckBox_stateChanged(int state)776 void QgsTransformWidget::mReflectYCheckBox_stateChanged( int state )
777 {
778   if ( !mEffect )
779     return;
780 
781   mEffect->setReflectY( state == Qt::Checked );
782   emit changed();
783 }
784 
mSpinShearX_valueChanged(double value)785 void QgsTransformWidget::mSpinShearX_valueChanged( double value )
786 {
787   if ( !mEffect )
788     return;
789 
790   mEffect->setShearX( value );
791   emit changed();
792 }
793 
mSpinShearY_valueChanged(double value)794 void QgsTransformWidget::mSpinShearY_valueChanged( double value )
795 {
796   if ( !mEffect )
797     return;
798 
799   mEffect->setShearY( value );
800   emit changed();
801 }
802 
mSpinScaleX_valueChanged(double value)803 void QgsTransformWidget::mSpinScaleX_valueChanged( double value )
804 {
805   if ( !mEffect )
806     return;
807 
808   mEffect->setScaleX( value / 100.0 );
809   emit changed();
810 }
811 
mSpinScaleY_valueChanged(double value)812 void QgsTransformWidget::mSpinScaleY_valueChanged( double value )
813 {
814   if ( !mEffect )
815     return;
816 
817   mEffect->setScaleY( value / 100.0 );
818   emit changed();
819 }
820 
mRotationSpinBox_valueChanged(double value)821 void QgsTransformWidget::mRotationSpinBox_valueChanged( double value )
822 {
823   if ( !mEffect )
824     return;
825 
826   mEffect->setRotation( value );
827   emit changed();
828 }
829 
830 
831 //
832 // color effect
833 //
834 
QgsColorEffectWidget(QWidget * parent)835 QgsColorEffectWidget::QgsColorEffectWidget( QWidget *parent )
836   : QgsPaintEffectWidget( parent )
837 
838 {
839   setupUi( this );
840   connect( mBlendCmbBx, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsColorEffectWidget::mBlendCmbBx_currentIndexChanged );
841   connect( mDrawModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsColorEffectWidget::mDrawModeComboBox_currentIndexChanged );
842   connect( mBrightnessSpinBox, static_cast< void ( QSpinBox::* )( int ) >( &QSpinBox::valueChanged ), this, &QgsColorEffectWidget::mBrightnessSpinBox_valueChanged );
843   connect( mContrastSpinBox, static_cast< void ( QSpinBox::* )( int ) >( &QSpinBox::valueChanged ), this, &QgsColorEffectWidget::mContrastSpinBox_valueChanged );
844   connect( mSaturationSpinBox, static_cast< void ( QSpinBox::* )( int ) >( &QSpinBox::valueChanged ), this, &QgsColorEffectWidget::mSaturationSpinBox_valueChanged );
845   connect( mColorizeStrengthSpinBox, static_cast< void ( QSpinBox::* )( int ) >( &QSpinBox::valueChanged ), this, &QgsColorEffectWidget::mColorizeStrengthSpinBox_valueChanged );
846   connect( mColorizeCheck, &QCheckBox::stateChanged, this, &QgsColorEffectWidget::mColorizeCheck_stateChanged );
847   connect( mColorizeColorButton, &QgsColorButton::colorChanged, this, &QgsColorEffectWidget::mColorizeColorButton_colorChanged );
848   connect( mGrayscaleCombo, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsColorEffectWidget::mGrayscaleCombo_currentIndexChanged );
849 
850   mBrightnessSpinBox->setClearValue( 0 );
851   mContrastSpinBox->setClearValue( 0 );
852   mSaturationSpinBox->setClearValue( 0 );
853   mColorizeStrengthSpinBox->setClearValue( 100 );
854   mColorizeColorButton->setAllowOpacity( false );
855 
856   mGrayscaleCombo->addItem( tr( "Off" ), QgsImageOperation::GrayscaleOff );
857   mGrayscaleCombo->addItem( tr( "By Lightness" ), QgsImageOperation::GrayscaleLightness );
858   mGrayscaleCombo->addItem( tr( "By Luminosity" ), QgsImageOperation::GrayscaleLuminosity );
859   mGrayscaleCombo->addItem( tr( "By Average" ), QgsImageOperation::GrayscaleAverage );
860 
861   initGui();
862 
863   connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsColorEffectWidget::opacityChanged );
864 }
865 
setPaintEffect(QgsPaintEffect * effect)866 void QgsColorEffectWidget::setPaintEffect( QgsPaintEffect *effect )
867 {
868   if ( !effect || effect->type() != QLatin1String( "color" ) )
869     return;
870 
871   mEffect = static_cast<QgsColorEffect *>( effect );
872   initGui();
873 }
874 
initGui()875 void QgsColorEffectWidget::initGui()
876 {
877   if ( !mEffect )
878   {
879     return;
880   }
881 
882   blockSignals( true );
883 
884   mSliderBrightness->setValue( mEffect->brightness() );
885   mSliderContrast->setValue( mEffect->contrast() );
886   mSliderSaturation->setValue( ( mEffect->saturation() - 1.0 ) * 100.0 );
887   mColorizeCheck->setChecked( mEffect->colorizeOn() );
888   mSliderColorizeStrength->setValue( mEffect->colorizeStrength() );
889   mColorizeColorButton->setColor( mEffect->colorizeColor() );
890   const int grayscaleIdx = mGrayscaleCombo->findData( QVariant( ( int ) mEffect->grayscaleMode() ) );
891   mGrayscaleCombo->setCurrentIndex( grayscaleIdx == -1 ? 0 : grayscaleIdx );
892   mOpacityWidget->setOpacity( mEffect->opacity() );
893   mBlendCmbBx->setBlendMode( mEffect->blendMode() );
894   mDrawModeComboBox->setDrawMode( mEffect->drawMode() );
895   enableColorizeControls( mEffect->colorizeOn() );
896 
897   blockSignals( false );
898 }
899 
blockSignals(const bool block)900 void QgsColorEffectWidget::blockSignals( const bool block )
901 {
902   mBrightnessSpinBox->blockSignals( block );
903   mContrastSpinBox->blockSignals( block );
904   mSaturationSpinBox->blockSignals( block );
905   mColorizeStrengthSpinBox->blockSignals( block );
906   mColorizeCheck->blockSignals( block );
907   mColorizeColorButton->blockSignals( block );
908   mGrayscaleCombo->blockSignals( block );
909   mOpacityWidget->blockSignals( block );
910   mBlendCmbBx->blockSignals( block );
911   mDrawModeComboBox->blockSignals( block );
912 }
913 
enableColorizeControls(const bool enable)914 void QgsColorEffectWidget::enableColorizeControls( const bool enable )
915 {
916   mSliderColorizeStrength->setEnabled( enable );
917   mColorizeStrengthSpinBox->setEnabled( enable );
918   mColorizeColorButton->setEnabled( enable );
919 }
920 
opacityChanged(double value)921 void QgsColorEffectWidget::opacityChanged( double value )
922 {
923   if ( !mEffect )
924     return;
925 
926   mEffect->setOpacity( value );
927   emit changed();
928 }
929 
mBlendCmbBx_currentIndexChanged(int index)930 void QgsColorEffectWidget::mBlendCmbBx_currentIndexChanged( int index )
931 {
932   Q_UNUSED( index )
933 
934   if ( !mEffect )
935     return;
936 
937   mEffect->setBlendMode( mBlendCmbBx->blendMode() );
938   emit changed();
939 }
940 
mDrawModeComboBox_currentIndexChanged(int index)941 void QgsColorEffectWidget::mDrawModeComboBox_currentIndexChanged( int index )
942 {
943   Q_UNUSED( index )
944 
945   if ( !mEffect )
946     return;
947 
948   mEffect->setDrawMode( mDrawModeComboBox->drawMode() );
949   emit changed();
950 }
951 
mBrightnessSpinBox_valueChanged(int value)952 void QgsColorEffectWidget::mBrightnessSpinBox_valueChanged( int value )
953 {
954   if ( !mEffect )
955     return;
956 
957   mEffect->setBrightness( value );
958   emit changed();
959 }
960 
mContrastSpinBox_valueChanged(int value)961 void QgsColorEffectWidget::mContrastSpinBox_valueChanged( int value )
962 {
963   if ( !mEffect )
964     return;
965 
966   mEffect->setContrast( value );
967   emit changed();
968 }
969 
mSaturationSpinBox_valueChanged(int value)970 void QgsColorEffectWidget::mSaturationSpinBox_valueChanged( int value )
971 {
972   if ( !mEffect )
973     return;
974 
975   mEffect->setSaturation( value / 100.0 + 1 );
976   emit changed();
977 }
978 
mColorizeStrengthSpinBox_valueChanged(int value)979 void QgsColorEffectWidget::mColorizeStrengthSpinBox_valueChanged( int value )
980 {
981   if ( !mEffect )
982     return;
983 
984   mEffect->setColorizeStrength( value );
985   emit changed();
986 }
987 
mColorizeCheck_stateChanged(int state)988 void QgsColorEffectWidget::mColorizeCheck_stateChanged( int state )
989 {
990   if ( !mEffect )
991     return;
992 
993   mEffect->setColorizeOn( state == Qt::Checked );
994   enableColorizeControls( state == Qt::Checked );
995   emit changed();
996 }
997 
mColorizeColorButton_colorChanged(const QColor & color)998 void QgsColorEffectWidget::mColorizeColorButton_colorChanged( const QColor &color )
999 {
1000   if ( !mEffect )
1001     return;
1002 
1003   mEffect->setColorizeColor( color );
1004   emit changed();
1005 }
1006 
mGrayscaleCombo_currentIndexChanged(int index)1007 void QgsColorEffectWidget::mGrayscaleCombo_currentIndexChanged( int index )
1008 {
1009   Q_UNUSED( index )
1010 
1011   if ( !mEffect )
1012     return;
1013 
1014   mEffect->setGrayscaleMode( ( QgsImageOperation::GrayscaleMode ) mGrayscaleCombo->currentData().toInt() );
1015   emit changed();
1016 }
1017