Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsrendererregistry.h
3 : : ---------------------
4 : : begin : November 2009
5 : : copyright : (C) 2009 by Martin Dobias
6 : : email : wonder dot sk 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 : : #ifndef QGSRENDERERREGISTRY_H
16 : : #define QGSRENDERERREGISTRY_H
17 : :
18 : : #include "qgis_core.h"
19 : : #include "qgis_sip.h"
20 : : #include <QIcon>
21 : : #include <QMap>
22 : : #include <QStringList>
23 : : #include <QDomElement>
24 : :
25 : : // #include "qgis.h"
26 : : #include "qgswkbtypes.h"
27 : :
28 : : class QgsFeatureRenderer;
29 : : class QgsReadWriteContext;
30 : : class QgsVectorLayer;
31 : : class QgsStyle;
32 : : class QgsRendererWidget SIP_EXTERNAL;
33 : :
34 : : /**
35 : : * \ingroup core
36 : : * \brief Stores metadata about one renderer class.
37 : : *
38 : : * \note It's necessary to implement createRenderer() function.
39 : : * In C++ you can use QgsRendererMetadata convenience class.
40 : : */
41 : : class CORE_EXPORT QgsRendererAbstractMetadata
42 : : {
43 : : public:
44 : :
45 : : /**
46 : : * Layer types the renderer is compatible with
47 : : * \since QGIS 2.16
48 : : */
49 : : enum LayerType
50 : : {
51 : : PointLayer = 1, //!< Compatible with point layers
52 : : LineLayer = 2, //!< Compatible with line layers
53 : : PolygonLayer = 4, //!< Compatible with polygon layers
54 : : All = PointLayer | LineLayer | PolygonLayer, //!< Compatible with all vector layers
55 : : };
56 : : Q_DECLARE_FLAGS( LayerTypes, LayerType )
57 : :
58 : : /**
59 : : * Constructor for QgsRendererAbstractMetadata, with the specified \a name.
60 : : *
61 : : * The \a visibleName argument gives a translated, user friendly string identifying the renderer type.
62 : : *
63 : : * The \a icon argument can be used to specify an icon representing the renderer.
64 : : */
65 : 60 : QgsRendererAbstractMetadata( const QString &name, const QString &visibleName, const QIcon &icon = QIcon() )
66 : 60 : : mName( name )
67 : 60 : , mVisibleName( visibleName )
68 : 60 : , mIcon( icon )
69 : 60 : {}
70 : 60 : virtual ~QgsRendererAbstractMetadata() = default;
71 : :
72 : : /**
73 : : * Returns the unique name of the renderer. This value is not translated.
74 : : * \see visibleName()
75 : : */
76 : 180 : QString name() const { return mName; }
77 : :
78 : : /**
79 : : * Returns a friendly display name of the renderer. This value is translated.
80 : : * \see name()
81 : : */
82 : : QString visibleName() const { return mVisibleName; }
83 : :
84 : : /**
85 : : * Returns an icon representing the renderer.
86 : : * \see setIcon()
87 : : */
88 : : QIcon icon() const { return mIcon; }
89 : :
90 : : /**
91 : : * Sets an \a icon representing the renderer.
92 : : * \see icon()
93 : : */
94 : : void setIcon( const QIcon &icon ) { mIcon = icon; }
95 : :
96 : : /**
97 : : * Returns flags indicating the types of layer the renderer is compatible with.
98 : : * \since QGIS 2.16
99 : : */
100 : 0 : virtual QgsRendererAbstractMetadata::LayerTypes compatibleLayerTypes() const { return All; }
101 : :
102 : : /**
103 : : * Returns new instance of the renderer given the DOM element. Returns NULLPTR on error.
104 : : * Pure virtual function: must be implemented in derived classes.
105 : : */
106 : : virtual QgsFeatureRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) = 0 SIP_FACTORY;
107 : :
108 : : /**
109 : : * Returns new instance of settings widget for the renderer. Returns NULLPTR on error.
110 : : *
111 : : * The \a oldRenderer argument may refer to previously used renderer (or it is NULLPTR).
112 : : * If not NULLPTR, it may be used to initialize GUI of the widget from the previous settings.
113 : : * The old renderer does not have to be of the same type as returned by createRenderer().
114 : : */
115 : 0 : virtual QgsRendererWidget *createRendererWidget( QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *oldRenderer ) SIP_FACTORY
116 : 0 : { Q_UNUSED( layer ) Q_UNUSED( style ); Q_UNUSED( oldRenderer ); return nullptr; }
117 : :
118 : 0 : virtual QgsFeatureRenderer *createRendererFromSld( QDomElement &elem, QgsWkbTypes::GeometryType geomType ) SIP_FACTORY
119 : 0 : { Q_UNUSED( elem ) Q_UNUSED( geomType ); return nullptr; }
120 : :
121 : : protected:
122 : : //! name used within QGIS for identification (the same what renderer's type() returns)
123 : : QString mName;
124 : : //! name visible for users (translatable)
125 : : QString mVisibleName;
126 : : //! icon to be shown in the renderer properties dialog
127 : : QIcon mIcon;
128 : : };
129 : :
130 : :
131 : 5 : Q_DECLARE_OPERATORS_FOR_FLAGS( QgsRendererAbstractMetadata::LayerTypes )
132 : :
133 : :
134 : : typedef QgsFeatureRenderer *( *QgsRendererCreateFunc )( QDomElement &, const QgsReadWriteContext & ) SIP_SKIP;
135 : : typedef QgsRendererWidget *( *QgsRendererWidgetFunc )( QgsVectorLayer *, QgsStyle *, QgsFeatureRenderer * ) SIP_SKIP;
136 : : typedef QgsFeatureRenderer *( *QgsRendererCreateFromSldFunc )( QDomElement &, QgsWkbTypes::GeometryType geomType ) SIP_SKIP;
137 : :
138 : : /**
139 : : * \ingroup core
140 : : * \brief Convenience metadata class that uses static functions to create renderer and its widget.
141 : : */
142 : 120 : class CORE_EXPORT QgsRendererMetadata : public QgsRendererAbstractMetadata
143 : : {
144 : : public:
145 : :
146 : : /**
147 : : * Construct metadata
148 : : * \note not available in Python bindings
149 : : */
150 : 50 : QgsRendererMetadata( const QString &name,
151 : : const QString &visibleName,
152 : : QgsRendererCreateFunc pfCreate,
153 : : const QIcon &icon = QIcon(),
154 : : QgsRendererWidgetFunc pfWidget = nullptr,
155 : : QgsRendererAbstractMetadata::LayerTypes layerTypes = QgsRendererAbstractMetadata::All ) SIP_SKIP
156 : 50 : : QgsRendererAbstractMetadata( name, visibleName, icon )
157 : 50 : , mCreateFunc( pfCreate )
158 : 50 : , mWidgetFunc( pfWidget )
159 : 50 : , mCreateFromSldFunc( nullptr )
160 : 50 : , mLayerTypes( layerTypes )
161 : 150 : {}
162 : :
163 : : //! \note not available in Python bindings
164 : 10 : QgsRendererMetadata( const QString &name,
165 : : const QString &visibleName,
166 : : QgsRendererCreateFunc pfCreate,
167 : : QgsRendererCreateFromSldFunc pfCreateFromSld,
168 : : const QIcon &icon = QIcon(),
169 : : QgsRendererWidgetFunc pfWidget = nullptr,
170 : : QgsRendererAbstractMetadata::LayerTypes layerTypes = QgsRendererAbstractMetadata::All ) SIP_SKIP
171 : 10 : : QgsRendererAbstractMetadata( name, visibleName, icon )
172 : 10 : , mCreateFunc( pfCreate )
173 : 10 : , mWidgetFunc( pfWidget )
174 : 10 : , mCreateFromSldFunc( pfCreateFromSld )
175 : 10 : , mLayerTypes( layerTypes )
176 : 30 : {}
177 : :
178 : 0 : QgsFeatureRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) override SIP_FACTORY
179 : 0 : { return mCreateFunc ? mCreateFunc( elem, context ) : nullptr; }
180 : 0 : QgsRendererWidget *createRendererWidget( QgsVectorLayer *layer, QgsStyle *style, QgsFeatureRenderer *renderer ) override SIP_FACTORY
181 : 0 : { return mWidgetFunc ? mWidgetFunc( layer, style, renderer ) : nullptr; }
182 : 0 : QgsFeatureRenderer *createRendererFromSld( QDomElement &elem, QgsWkbTypes::GeometryType geomType ) override SIP_FACTORY
183 : 0 : { return mCreateFromSldFunc ? mCreateFromSldFunc( elem, geomType ) : nullptr; }
184 : :
185 : : //! \note not available in Python bindings
186 : : QgsRendererCreateFunc createFunction() const { return mCreateFunc; } SIP_SKIP
187 : : //! \note not available in Python bindings
188 : : QgsRendererWidgetFunc widgetFunction() const { return mWidgetFunc; } SIP_SKIP
189 : : //! \note not available in Python bindings
190 : : QgsRendererCreateFromSldFunc createFromSldFunction() const { return mCreateFromSldFunc; } SIP_SKIP
191 : :
192 : : //! \note not available in Python bindings
193 : : void setWidgetFunction( QgsRendererWidgetFunc f ) { mWidgetFunc = f; } SIP_SKIP
194 : :
195 : 0 : QgsRendererAbstractMetadata::LayerTypes compatibleLayerTypes() const override { return mLayerTypes; }
196 : :
197 : : protected:
198 : : //! pointer to function that creates an instance of the renderer when loading project / style
199 : : QgsRendererCreateFunc mCreateFunc;
200 : : //! pointer to function that creates a widget for configuration of renderer's params
201 : : QgsRendererWidgetFunc mWidgetFunc;
202 : : //! pointer to function that creates an instance of the renderer from SLD
203 : : QgsRendererCreateFromSldFunc mCreateFromSldFunc;
204 : :
205 : : private:
206 : : #ifdef SIP_RUN
207 : : QgsRendererMetadata();
208 : : #endif
209 : :
210 : : QgsRendererAbstractMetadata::LayerTypes mLayerTypes;
211 : : };
212 : :
213 : :
214 : : /**
215 : : * \ingroup core
216 : : * \class QgsRendererRegistry
217 : : * \brief Registry of renderers.
218 : : *
219 : : * QgsRendererRegistry is not usually directly created, but rather accessed through
220 : : * QgsApplication::rendererRegistry().
221 : : *
222 : : */
223 : :
224 : : class CORE_EXPORT QgsRendererRegistry
225 : : {
226 : : public:
227 : :
228 : : QgsRendererRegistry();
229 : : ~QgsRendererRegistry();
230 : :
231 : : //! QgsRendererRegistry cannot be copied.
232 : : QgsRendererRegistry( const QgsRendererRegistry &rh ) = delete;
233 : : //! QgsRendererRegistry cannot be copied.
234 : : QgsRendererRegistry &operator=( const QgsRendererRegistry &rh ) = delete;
235 : :
236 : : /**
237 : : * Adds a renderer to the registry. Takes ownership of the metadata object.
238 : : * \param metadata renderer metadata
239 : : * \returns TRUE if renderer was added successfully, or FALSE if renderer could not
240 : : * be added (e.g., a renderer with a duplicate name already exists)
241 : : */
242 : : bool addRenderer( QgsRendererAbstractMetadata *metadata SIP_TRANSFER );
243 : :
244 : : /**
245 : : * Removes a renderer from registry.
246 : : * \param rendererName name of renderer to remove from registry
247 : : * \returns TRUE if renderer was successfully removed, or FALSE if matching
248 : : * renderer could not be found
249 : : */
250 : : bool removeRenderer( const QString &rendererName );
251 : :
252 : : /**
253 : : * Returns the metadata for a specified renderer. Returns NULLPTR if a matching
254 : : * renderer was not found in the registry.
255 : : */
256 : : QgsRendererAbstractMetadata *rendererMetadata( const QString &rendererName );
257 : :
258 : : /**
259 : : * Returns a list of available renderers.
260 : : * \param layerTypes flags to filter the renderers by compatible layer types
261 : : */
262 : : QStringList renderersList( QgsRendererAbstractMetadata::LayerTypes layerTypes = QgsRendererAbstractMetadata::All ) const;
263 : :
264 : : /**
265 : : * Returns a list of available renderers which are compatible with a specified layer.
266 : : * \param layer vector layer
267 : : * \since QGIS 2.16
268 : : */
269 : : QStringList renderersList( const QgsVectorLayer *layer ) const;
270 : :
271 : : private:
272 : : #ifdef SIP_RUN
273 : : QgsRendererRegistry( const QgsRendererRegistry &rh );
274 : : #endif
275 : :
276 : : //! Map of name to renderer
277 : : QMap<QString, QgsRendererAbstractMetadata *> mRenderers;
278 : :
279 : : //! List of renderers, maintained in the order that they have been added
280 : : QStringList mRenderersOrder;
281 : : };
282 : :
283 : : #endif // QGSRENDERERREGISTRY_H
|