Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgssymbollayerregistry.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 : : 16 : : #ifndef QGSSYMBOLLAYERREGISTRY_H 17 : : #define QGSSYMBOLLAYERREGISTRY_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgis.h" 21 : : #include "qgssymbol.h" 22 : : 23 : : class QgsPathResolver; 24 : : class QgsVectorLayer; 25 : : class QgsSymbolLayerWidget SIP_EXTERNAL; 26 : : 27 : : /** 28 : : * \ingroup core 29 : : * \brief Stores metadata about one symbol layer class. 30 : : * 31 : : * \note It's necessary to implement createSymbolLayer() function. 32 : : * In C++ you can use QgsSymbolLayerMetadata convenience class. 33 : : */ 34 : : class CORE_EXPORT QgsSymbolLayerAbstractMetadata 35 : : { 36 : : public: 37 : 110 : QgsSymbolLayerAbstractMetadata( const QString &name, const QString &visibleName, QgsSymbol::SymbolType type ) 38 : 110 : : mName( name ) 39 : 110 : , mVisibleName( visibleName ) 40 : 110 : , mType( type ) 41 : 220 : {} 42 : : 43 : 110 : virtual ~QgsSymbolLayerAbstractMetadata() = default; 44 : : 45 : 220 : QString name() const { return mName; } 46 : : QString visibleName() const { return mVisibleName; } 47 : 0 : QgsSymbol::SymbolType type() const { return mType; } 48 : : 49 : : //! Create a symbol layer of this type given the map of properties. 50 : : virtual QgsSymbolLayer *createSymbolLayer( const QVariantMap &map ) = 0 SIP_FACTORY; 51 : : //! Create widget for symbol layer of this type. Can return NULLPTR if there's no GUI 52 : 0 : virtual QgsSymbolLayerWidget *createSymbolLayerWidget( QgsVectorLayer * ) SIP_FACTORY { return nullptr; } 53 : : //! Create a symbol layer of this type given the map of properties. 54 : 0 : virtual QgsSymbolLayer *createSymbolLayerFromSld( QDomElement & ) SIP_FACTORY { return nullptr; } 55 : : 56 : : /** 57 : : * Resolve paths in symbol layer's properties (if there are any paths). 58 : : * When saving is TRUE, paths are converted from absolute to relative, 59 : : * when saving is FALSE, paths are converted from relative to absolute. 60 : : * This ensures that paths in project files can be relative, but in symbol layer 61 : : * instances the paths are always absolute 62 : : * \since QGIS 3.0 63 : : */ 64 : 0 : virtual void resolvePaths( QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving ) 65 : : { 66 : 0 : Q_UNUSED( properties ) 67 : 0 : Q_UNUSED( pathResolver ) 68 : : Q_UNUSED( saving ) 69 : 0 : } 70 : : 71 : : protected: 72 : : QString mName; 73 : : QString mVisibleName; 74 : : QgsSymbol::SymbolType mType; 75 : : }; 76 : : 77 : : typedef QgsSymbolLayer *( *QgsSymbolLayerCreateFunc )( const QVariantMap & ) SIP_SKIP; 78 : : typedef QgsSymbolLayerWidget *( *QgsSymbolLayerWidgetFunc )( QgsVectorLayer * ) SIP_SKIP; 79 : : typedef QgsSymbolLayer *( *QgsSymbolLayerCreateFromSldFunc )( QDomElement & ) SIP_SKIP; 80 : : typedef void ( *QgsSymbolLayerPathResolverFunc )( QVariantMap &, const QgsPathResolver &, bool ) SIP_SKIP; 81 : : 82 : : /** 83 : : * \ingroup core 84 : : * \brief Convenience metadata class that uses static functions to create symbol layer and its widget. 85 : : */ 86 : 220 : class CORE_EXPORT QgsSymbolLayerMetadata : public QgsSymbolLayerAbstractMetadata 87 : : { 88 : : public: 89 : : //! \note not available in Python bindings 90 : 110 : QgsSymbolLayerMetadata( const QString &name, const QString &visibleName, 91 : : QgsSymbol::SymbolType type, 92 : : QgsSymbolLayerCreateFunc pfCreate, 93 : : QgsSymbolLayerCreateFromSldFunc pfCreateFromSld = nullptr, 94 : : QgsSymbolLayerPathResolverFunc pfPathResolver = nullptr, 95 : : QgsSymbolLayerWidgetFunc pfWidget = nullptr ) SIP_SKIP 96 : 110 : : QgsSymbolLayerAbstractMetadata( name, visibleName, type ) 97 : 110 : , mCreateFunc( pfCreate ) 98 : 110 : , mWidgetFunc( pfWidget ) 99 : 110 : , mCreateFromSldFunc( pfCreateFromSld ) 100 : 110 : , mPathResolverFunc( pfPathResolver ) 101 : 330 : {} 102 : : 103 : : //! \note not available in Python bindings 104 : : QgsSymbolLayerCreateFunc createFunction() const { return mCreateFunc; } SIP_SKIP 105 : : //! \note not available in Python bindings 106 : : QgsSymbolLayerWidgetFunc widgetFunction() const { return mWidgetFunc; } SIP_SKIP 107 : : //! \note not available in Python bindings 108 : : QgsSymbolLayerCreateFromSldFunc createFromSldFunction() const { return mCreateFromSldFunc; } SIP_SKIP 109 : : //! \note not available in Python bindings 110 : : QgsSymbolLayerPathResolverFunc pathResolverFunction() const { return mPathResolverFunc; } SIP_SKIP 111 : : 112 : : //! \note not available in Python bindings 113 : : void setWidgetFunction( QgsSymbolLayerWidgetFunc f ) { mWidgetFunc = f; } SIP_SKIP 114 : : 115 : 990 : QgsSymbolLayer *createSymbolLayer( const QVariantMap &map ) override SIP_FACTORY { return mCreateFunc ? mCreateFunc( map ) : nullptr; } 116 : 0 : QgsSymbolLayerWidget *createSymbolLayerWidget( QgsVectorLayer *vl ) override SIP_FACTORY { return mWidgetFunc ? mWidgetFunc( vl ) : nullptr; } 117 : 0 : QgsSymbolLayer *createSymbolLayerFromSld( QDomElement &elem ) override SIP_FACTORY { return mCreateFromSldFunc ? mCreateFromSldFunc( elem ) : nullptr; } 118 : 990 : void resolvePaths( QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving ) override 119 : : { 120 : 990 : if ( mPathResolverFunc ) 121 : 40 : mPathResolverFunc( properties, pathResolver, saving ); 122 : 990 : } 123 : : 124 : : protected: 125 : : QgsSymbolLayerCreateFunc mCreateFunc; 126 : : QgsSymbolLayerWidgetFunc mWidgetFunc; 127 : : QgsSymbolLayerCreateFromSldFunc mCreateFromSldFunc; 128 : : QgsSymbolLayerPathResolverFunc mPathResolverFunc; 129 : : 130 : : private: 131 : : #ifdef SIP_RUN 132 : : QgsSymbolLayerMetadata(); 133 : : #endif 134 : : }; 135 : : 136 : : 137 : : /** 138 : : * \ingroup core 139 : : * \brief Registry of available symbol layer classes. 140 : : * 141 : : * QgsSymbolLayerRegistry is not usually directly created, but rather accessed through 142 : : * QgsApplication::symbolLayerRegistry(). 143 : : */ 144 : : class CORE_EXPORT QgsSymbolLayerRegistry 145 : : { 146 : : public: 147 : : 148 : : QgsSymbolLayerRegistry(); 149 : : ~QgsSymbolLayerRegistry(); 150 : : 151 : : //! QgsSymbolLayerRegistry cannot be copied. 152 : : QgsSymbolLayerRegistry( const QgsSymbolLayerRegistry &rh ) = delete; 153 : : //! QgsSymbolLayerRegistry cannot be copied. 154 : : QgsSymbolLayerRegistry &operator=( const QgsSymbolLayerRegistry &rh ) = delete; 155 : : 156 : : //! Returns metadata for specified symbol layer. Returns NULLPTR if not found 157 : : QgsSymbolLayerAbstractMetadata *symbolLayerMetadata( const QString &name ) const; 158 : : 159 : : //! register a new symbol layer type. Takes ownership of the metadata instance. 160 : : bool addSymbolLayerType( QgsSymbolLayerAbstractMetadata *metadata SIP_TRANSFER ); 161 : : 162 : : //! create a new instance of symbol layer given symbol layer name and properties 163 : : QgsSymbolLayer *createSymbolLayer( const QString &name, const QVariantMap &properties = QVariantMap() ) const SIP_FACTORY; 164 : : 165 : : //! create a new instance of symbol layer given symbol layer name and SLD 166 : : QgsSymbolLayer *createSymbolLayerFromSld( const QString &name, QDomElement &element ) const SIP_FACTORY; 167 : : 168 : : /** 169 : : * Resolve paths in properties of a particular symbol layer. 170 : : * This normally means converting relative paths to absolute paths when loading 171 : : * and converting absolute paths to relative paths when saving. 172 : : * \since QGIS 3.0 173 : : */ 174 : : void resolvePaths( const QString &name, QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving ) const; 175 : : 176 : : //! Returns a list of available symbol layers for a specified symbol type 177 : : QStringList symbolLayersForType( QgsSymbol::SymbolType type ); 178 : : 179 : : //! create a new instance of symbol layer for specified symbol type with default settings 180 : : static QgsSymbolLayer *defaultSymbolLayer( QgsSymbol::SymbolType type ) SIP_FACTORY; 181 : : 182 : : private: 183 : : #ifdef SIP_RUN 184 : : QgsSymbolLayerRegistry( const QgsSymbolLayerRegistry &rh ); 185 : : #endif 186 : : 187 : : QMap<QString, QgsSymbolLayerAbstractMetadata *> mMetadata; 188 : : }; 189 : : 190 : : #endif