Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgspainteffectregistry.cpp 3 : : ------------------------ 4 : : begin : January 2015 5 : : copyright : (C) 2015 Nyall Dawson 6 : : email : nyall dot dawson at gmail dot 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 : : #include "qgspainteffectregistry.h" 17 : : #include "qgsblureffect.h" 18 : : #include "qgsshadoweffect.h" 19 : : #include "qgseffectstack.h" 20 : : #include "qgsgloweffect.h" 21 : : #include "qgstransformeffect.h" 22 : : #include "qgscoloreffect.h" 23 : : #include "qgsapplication.h" 24 : : 25 : 45 : QgsPaintEffectAbstractMetadata::QgsPaintEffectAbstractMetadata( const QString &name, const QString &visibleName ) 26 : 45 : : mName( name ) 27 : 45 : , mVisibleName( visibleName ) 28 : 45 : { 29 : : 30 : 45 : } 31 : : 32 : 5 : QgsPaintEffectRegistry::QgsPaintEffectRegistry() 33 : : { 34 : : //init registry with known effects 35 : 10 : addEffectType( new QgsPaintEffectMetadata( QStringLiteral( "blur" ), QObject::tr( "Blur" ), 36 : : QgsBlurEffect::create, nullptr ) ); 37 : 10 : addEffectType( new QgsPaintEffectMetadata( QStringLiteral( "dropShadow" ), QObject::tr( "Drop Shadow" ), 38 : : QgsDropShadowEffect::create, nullptr ) ); 39 : 10 : addEffectType( new QgsPaintEffectMetadata( QStringLiteral( "innerShadow" ), QObject::tr( "Inner Shadow" ), 40 : : QgsInnerShadowEffect::create, nullptr ) ); 41 : 10 : addEffectType( new QgsPaintEffectMetadata( QStringLiteral( "effectStack" ), QObject::tr( "Stack" ), 42 : : QgsEffectStack::create, nullptr ) ); 43 : 10 : addEffectType( new QgsPaintEffectMetadata( QStringLiteral( "outerGlow" ), QObject::tr( "Outer Glow" ), 44 : : QgsOuterGlowEffect::create, nullptr ) ); 45 : 10 : addEffectType( new QgsPaintEffectMetadata( QStringLiteral( "innerGlow" ), QObject::tr( "Inner Glow" ), 46 : : QgsInnerGlowEffect::create, nullptr ) ); 47 : 10 : addEffectType( new QgsPaintEffectMetadata( QStringLiteral( "drawSource" ), QObject::tr( "Source" ), 48 : : QgsDrawSourceEffect::create, nullptr ) ); 49 : 10 : addEffectType( new QgsPaintEffectMetadata( QStringLiteral( "transform" ), QObject::tr( "Transform" ), 50 : : QgsTransformEffect::create, nullptr ) ); 51 : 10 : addEffectType( new QgsPaintEffectMetadata( QStringLiteral( "color" ), QObject::tr( "Colorise" ), 52 : : QgsColorEffect::create, nullptr ) ); 53 : 5 : } 54 : : 55 : 5 : QgsPaintEffectRegistry::~QgsPaintEffectRegistry() 56 : : { 57 : 5 : qDeleteAll( mMetadata ); 58 : 5 : } 59 : : 60 : 0 : QgsPaintEffectAbstractMetadata *QgsPaintEffectRegistry::effectMetadata( const QString &name ) const 61 : : { 62 : 0 : if ( mMetadata.contains( name ) ) 63 : 0 : return mMetadata.value( name ); 64 : : else 65 : 0 : return nullptr; 66 : 0 : } 67 : : 68 : 45 : bool QgsPaintEffectRegistry::addEffectType( QgsPaintEffectAbstractMetadata *metadata ) 69 : : { 70 : 45 : if ( !metadata || mMetadata.contains( metadata->name() ) ) 71 : 0 : return false; 72 : : 73 : 45 : mMetadata[metadata->name()] = metadata; 74 : 45 : return true; 75 : 45 : } 76 : : 77 : 245 : QgsPaintEffect *QgsPaintEffectRegistry::createEffect( const QString &name, const QVariantMap &properties ) const 78 : : { 79 : 245 : if ( !mMetadata.contains( name ) ) 80 : 0 : return nullptr; 81 : : 82 : 245 : QgsPaintEffect *effect = mMetadata[name]->createPaintEffect( properties ); 83 : 245 : return effect; 84 : 245 : } 85 : : 86 : 245 : QgsPaintEffect *QgsPaintEffectRegistry::createEffect( const QDomElement &element ) const 87 : : { 88 : 245 : if ( element.isNull() ) 89 : : { 90 : 0 : return nullptr; 91 : : } 92 : : 93 : 490 : QString type = element.attribute( QStringLiteral( "type" ) ); 94 : : 95 : 245 : QgsPaintEffect *effect = QgsApplication::paintEffectRegistry()->createEffect( type ); 96 : 245 : if ( !effect ) 97 : 0 : return nullptr; 98 : : 99 : 245 : effect->readProperties( element ); 100 : 245 : return effect; 101 : 245 : } 102 : : 103 : 0 : QStringList QgsPaintEffectRegistry::effects() const 104 : : { 105 : 0 : QStringList lst; 106 : 0 : QMap<QString, QgsPaintEffectAbstractMetadata *>::ConstIterator it = mMetadata.begin(); 107 : 0 : for ( ; it != mMetadata.end(); ++it ) 108 : : { 109 : 0 : lst.append( it.key() ); 110 : 0 : } 111 : 0 : return lst; 112 : 0 : } 113 : : 114 : 78 : QgsPaintEffect *QgsPaintEffectRegistry::defaultStack() 115 : : { 116 : : //NOTE - also remember to update isDefaultStack below if making changes to this list 117 : 78 : QgsEffectStack *stack = new QgsEffectStack(); 118 : 78 : QgsDropShadowEffect *dropShadow = new QgsDropShadowEffect(); 119 : 78 : dropShadow->setEnabled( false ); 120 : 78 : stack->appendEffect( dropShadow ); 121 : 78 : QgsOuterGlowEffect *outerGlow = new QgsOuterGlowEffect(); 122 : 78 : outerGlow->setEnabled( false ); 123 : 78 : stack->appendEffect( outerGlow ); 124 : 78 : stack->appendEffect( new QgsDrawSourceEffect() ); 125 : 78 : QgsInnerShadowEffect *innerShadow = new QgsInnerShadowEffect(); 126 : 78 : innerShadow->setEnabled( false ); 127 : 78 : stack->appendEffect( innerShadow ); 128 : 78 : QgsInnerGlowEffect *innerGlow = new QgsInnerGlowEffect(); 129 : 78 : innerGlow->setEnabled( false ); 130 : 78 : stack->appendEffect( innerGlow ); 131 : 78 : return stack; 132 : 0 : } 133 : : 134 : 50 : bool QgsPaintEffectRegistry::isDefaultStack( QgsPaintEffect *effect ) 135 : : { 136 : 50 : QgsEffectStack *effectStack = dynamic_cast< QgsEffectStack * >( effect ); 137 : 50 : if ( !effectStack ) 138 : 0 : return false; 139 : : 140 : 50 : if ( effectStack->count() != 5 ) 141 : 15 : return false; 142 : : 143 : 110 : for ( int i = 0; i < 5; ++i ) 144 : : { 145 : : //only the third effect should be enabled 146 : 100 : if ( effectStack->effect( i )->enabled() != ( i == 2 ) ) 147 : 25 : return false; 148 : 75 : } 149 : : 150 : 10 : if ( !dynamic_cast< QgsDropShadowEffect * >( effectStack->effect( 0 ) ) ) 151 : 0 : return false; 152 : 10 : if ( !dynamic_cast< QgsOuterGlowEffect * >( effectStack->effect( 1 ) ) ) 153 : 0 : return false; 154 : 10 : if ( !dynamic_cast< QgsDrawSourceEffect * >( effectStack->effect( 2 ) ) ) 155 : 10 : return false; 156 : 0 : if ( !dynamic_cast< QgsInnerShadowEffect * >( effectStack->effect( 3 ) ) ) 157 : 0 : return false; 158 : 0 : if ( !dynamic_cast< QgsInnerGlowEffect * >( effectStack->effect( 4 ) ) ) 159 : 0 : return false; 160 : : 161 : 0 : QgsDrawSourceEffect *sourceEffect = static_cast< QgsDrawSourceEffect * >( effectStack->effect( 2 ) ); 162 : 0 : if ( !qgsDoubleNear( sourceEffect->opacity(), 1.0 ) ) 163 : 0 : return false; 164 : 0 : if ( sourceEffect->blendMode() != QPainter::CompositionMode_SourceOver ) 165 : 0 : return false; 166 : : 167 : : //we don't go as far as to check disabled effect's properties 168 : 0 : return true; 169 : 50 : }