QGIS API Documentation 4.3.0-Master (16eddb2670e)
Loading...
Searching...
No Matches
qgspainteffectregistry.cpp
Go to the documentation of this file.
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
17
18#include "qgsapplication.h"
19#include "qgsblureffect.h"
20#include "qgscoloreffect.h"
21#include "qgseffectstack.h"
22#include "qgsgloweffect.h"
23#include "qgsshadoweffect.h"
24#include "qgstransformeffect.h"
25
26#include <QString>
27
28using namespace Qt::StringLiterals;
29
31{
32 return mCreateFunc ? mCreateFunc( map ).release() : nullptr;
33}
34
39
41{
42 //init registry with known effects
43 addEffectType( new QgsPaintEffectMetadata( u"blur"_s, QObject::tr( "Blur" ), QgsBlurEffect::create, nullptr ) );
44 addEffectType( new QgsPaintEffectMetadata( u"dropShadow"_s, QObject::tr( "Drop Shadow" ), QgsDropShadowEffect::create, nullptr ) );
45 addEffectType( new QgsPaintEffectMetadata( u"innerShadow"_s, QObject::tr( "Inner Shadow" ), QgsInnerShadowEffect::create, nullptr ) );
46 addEffectType( new QgsPaintEffectMetadata( u"effectStack"_s, QObject::tr( "Stack" ), QgsEffectStack::create, nullptr ) );
47 addEffectType( new QgsPaintEffectMetadata( u"outerGlow"_s, QObject::tr( "Outer Glow" ), QgsOuterGlowEffect::create, nullptr ) );
48 addEffectType( new QgsPaintEffectMetadata( u"innerGlow"_s, QObject::tr( "Inner Glow" ), QgsInnerGlowEffect::create, nullptr ) );
49 addEffectType( new QgsPaintEffectMetadata( u"drawSource"_s, QObject::tr( "Source" ), QgsDrawSourceEffect::create, nullptr ) );
50 addEffectType( new QgsPaintEffectMetadata( u"transform"_s, QObject::tr( "Transform" ), QgsTransformEffect::create, nullptr ) );
51 addEffectType( new QgsPaintEffectMetadata( u"color"_s, QObject::tr( "Colorise" ), QgsColorEffect::create, nullptr ) );
52}
53
55{
56 qDeleteAll( mMetadata );
57}
58
60{
61 if ( mMetadata.contains( name ) )
62 return mMetadata.value( name );
63 else
64 return nullptr;
65}
66
68{
69 if ( !metadata || mMetadata.contains( metadata->name() ) )
70 return false;
71
72 mMetadata[metadata->name()] = metadata;
73 return true;
74}
75
76std::unique_ptr<QgsPaintEffect> QgsPaintEffectRegistry::createEffect( const QString &name, const QVariantMap &properties ) const
77{
78 if ( !mMetadata.contains( name ) )
79 return nullptr;
80
81 std::unique_ptr<QgsPaintEffect> effect( mMetadata[name]->createPaintEffect( properties ) );
82 return effect;
83}
84
85std::unique_ptr<QgsPaintEffect> QgsPaintEffectRegistry::createEffect( const QDomElement &element ) const
86{
87 if ( element.isNull() )
88 {
89 return nullptr;
90 }
91
92 const QString type = element.attribute( u"type"_s );
93
94 std::unique_ptr<QgsPaintEffect> effect( QgsApplication::paintEffectRegistry()->createEffect( type ) );
95 if ( !effect )
96 return nullptr;
97
98 effect->readProperties( element );
99 return effect;
100}
101
103{
104 QStringList lst;
105 QMap<QString, QgsPaintEffectAbstractMetadata *>::ConstIterator it = mMetadata.begin();
106 for ( ; it != mMetadata.end(); ++it )
107 {
108 lst.append( it.key() );
109 }
110 return lst;
111}
112
113std::unique_ptr<QgsPaintEffect> QgsPaintEffectRegistry::defaultStack()
114{
115 //NOTE - also remember to update isDefaultStack below if making changes to this list
116 auto stack = std::make_unique<QgsEffectStack>();
117 QgsDropShadowEffect *dropShadow = new QgsDropShadowEffect();
118 dropShadow->setEnabled( false );
119 stack->appendEffect( dropShadow );
120 QgsOuterGlowEffect *outerGlow = new QgsOuterGlowEffect();
121 outerGlow->setEnabled( false );
122 stack->appendEffect( outerGlow );
123 stack->appendEffect( new QgsDrawSourceEffect() );
124 QgsInnerShadowEffect *innerShadow = new QgsInnerShadowEffect();
125 innerShadow->setEnabled( false );
126 stack->appendEffect( innerShadow );
127 QgsInnerGlowEffect *innerGlow = new QgsInnerGlowEffect();
128 innerGlow->setEnabled( false );
129 stack->appendEffect( innerGlow );
130 return stack;
131}
132
134{
135 QgsEffectStack *effectStack = dynamic_cast< QgsEffectStack * >( effect );
136 if ( !effectStack )
137 return false;
138
139 if ( effectStack->count() != 5 )
140 return false;
141
142 for ( int i = 0; i < 5; ++i )
143 {
144 //only the third effect should be enabled
145 if ( effectStack->effect( i )->enabled() != ( i == 2 ) )
146 return false;
147 }
148
149 if ( !dynamic_cast< QgsDropShadowEffect * >( effectStack->effect( 0 ) ) )
150 return false;
151 if ( !dynamic_cast< QgsOuterGlowEffect * >( effectStack->effect( 1 ) ) )
152 return false;
153 if ( !dynamic_cast< QgsDrawSourceEffect * >( effectStack->effect( 2 ) ) )
154 return false;
155 if ( !dynamic_cast< QgsInnerShadowEffect * >( effectStack->effect( 3 ) ) )
156 return false;
157 if ( !dynamic_cast< QgsInnerGlowEffect * >( effectStack->effect( 4 ) ) )
158 return false;
159
160 QgsDrawSourceEffect *sourceEffect = static_cast< QgsDrawSourceEffect * >( effectStack->effect( 2 ) );
161 if ( !qgsDoubleNear( sourceEffect->opacity(), 1.0 ) )
162 return false;
163 if ( sourceEffect->blendMode() != QPainter::CompositionMode_SourceOver )
164 return false;
165
166 //we don't go as far as to check disabled effect's properties
167 return true;
168}
static QgsPaintEffectRegistry * paintEffectRegistry()
Returns the application's paint effect registry, used for managing paint effects.
static std::unique_ptr< QgsPaintEffect > create(const QVariantMap &map)
Creates a new QgsBlurEffect effect from a properties string map.
static std::unique_ptr< QgsPaintEffect > create(const QVariantMap &map)
Creates a new QgsColorEffect effect from a properties string map.
A paint effect which draws the source picture with minor or no alterations.
QPainter::CompositionMode blendMode() const
Returns the blend mode for the effect.
double opacity() const
Returns the opacity for the effect.
static std::unique_ptr< QgsPaintEffect > create(const QVariantMap &map)
Creates a new QgsDrawSource effect from a properties string map.
A paint effect which draws an offset and optionally blurred drop shadow.
static std::unique_ptr< QgsPaintEffect > create(const QVariantMap &map)
Creates a new QgsDropShadowEffect effect from a properties string map.
A paint effect which consists of a stack of other chained paint effects.
static std::unique_ptr< QgsPaintEffect > create(const QVariantMap &map)
Creates a new QgsEffectStack effect.
int count() const
Returns count of effects contained by the stack.
QgsPaintEffect * effect(int index) const
Returns a pointer to the effect at a specified index within the stack.
A paint effect which draws a glow within a picture.
static std::unique_ptr< QgsPaintEffect > create(const QVariantMap &map)
Creates a new QgsInnerGlowEffect effect from a properties string map.
A paint effect which draws an offset and optionally blurred drop shadow within a picture.
static std::unique_ptr< QgsPaintEffect > create(const QVariantMap &map)
Creates a new QgsInnerShadowEffect effect from a properties string map.
A paint effect which draws a glow outside of a picture.
static std::unique_ptr< QgsPaintEffect > create(const QVariantMap &map)
Creates a new QgsOuterGlowEffect effect from a properties string map.
Stores metadata about a paint effect class.
QString visibleName() const
Returns the user visible string representing the paint effect class.
QString name() const
Returns the unique string representing the paint effect class.
QgsPaintEffectAbstractMetadata(const QString &name, const QString &visibleName)
Construct a new QgsPaintEffectAbstractMetadata.
Convenience metadata class that uses static functions to create an effect and its widget.
QgsPaintEffectCreateFunc mCreateFunc
QgsPaintEffect * createPaintEffect(const QVariantMap &map) override
Creates a new paint effect of the metadata's effect class.
QgsPaintEffectAbstractMetadata * effectMetadata(const QString &name) const
Returns the metadata for a specific effect.
QStringList effects() const
Returns a list of known paint effects.
std::unique_ptr< QgsPaintEffect > createEffect(const QString &name, const QVariantMap &properties=QVariantMap()) const
Creates a new paint effect given the effect name and properties map.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
bool addEffectType(QgsPaintEffectAbstractMetadata *metadata)
Registers a new effect type.
static std::unique_ptr< QgsPaintEffect > defaultStack()
Returns a new effect stack consisting of a sensible selection of default effects.
Base class for visual effects which can be applied to QPicture drawings.
void setEnabled(bool enabled)
Sets whether the effect is enabled.
bool enabled() const
Returns whether the effect is enabled.
static std::unique_ptr< QgsPaintEffect > create(const QVariantMap &map)
Creates a new QgsTransformEffect effect from a properties string map.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
Definition qgis.h:7743