Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgs3dsymbolregistry.h 3 : : -------------------------------------- 4 : : Date : July 2020 5 : : Copyright : (C) 2020 by 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 : : #ifndef QGS3DSYMBOLREGISTRY_H 17 : : #define QGS3DSYMBOLREGISTRY_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgis_sip.h" 21 : : #include "qgswkbtypes.h" 22 : : 23 : : #include <QDomElement> 24 : : #include <QMap> 25 : : 26 : : class QgsAbstract3DSymbol; 27 : : class QgsReadWriteContext; 28 : : class Qgs3DSymbolWidget; 29 : : class QgsVectorLayer; 30 : : class QgsFeature3DHandler; 31 : : 32 : : /** 33 : : * \ingroup core 34 : : * \brief Stores metadata about one 3D symbol class. 35 : : * 36 : : * \note It's necessary to implement createSymbol() function. 37 : : * In C++ you can use Qgs3DSymbolMetadata convenience class. 38 : : * 39 : : * \since QGIS 3.16 40 : : */ 41 : : class CORE_EXPORT Qgs3DSymbolAbstractMetadata 42 : : { 43 : : public: 44 : : 45 : : /** 46 : : * Constructor for Qgs3DSymbolAbstractMetadata, with the specified \a type and \a visibleName. 47 : : */ 48 : : Qgs3DSymbolAbstractMetadata( const QString &type, const QString &visibleName ) 49 : : : mType( type ) 50 : : , mVisibleName( visibleName ) 51 : : {} 52 : : 53 : : virtual ~Qgs3DSymbolAbstractMetadata() = default; 54 : : 55 : : /** 56 : : * Returns the unique symbol type string. 57 : : */ 58 : 0 : QString type() const { return mType; } 59 : : 60 : : /** 61 : : * Returns the symbol's visible (translated) name. 62 : : */ 63 : : QString visibleName() const { return mVisibleName; } 64 : : 65 : : /** 66 : : * Creates a new instance of this symbol type. 67 : : * 68 : : * Caller takes ownership of the returned symbol. 69 : : */ 70 : : virtual QgsAbstract3DSymbol *create() = 0 SIP_FACTORY; 71 : : 72 : : #ifndef SIP_RUN 73 : : 74 : : /** 75 : : * Create a widget for configuring a symbol of this type. 76 : : * 77 : : * Can return NULLPTR if there's no GUI. 78 : : * 79 : : * \note Not available in Python bindings 80 : : */ 81 : : virtual Qgs3DSymbolWidget *createSymbolWidget( QgsVectorLayer * ) SIP_FACTORY { return nullptr; } 82 : : 83 : : /** 84 : : * Creates a feature handler for a \a symbol of matching type, for the specified vector \a layer. 85 : : * 86 : : * Caller takes ownership of the returned handler. 87 : : * 88 : : * \note Not available in Python bindings 89 : : */ 90 : : virtual QgsFeature3DHandler *createFeatureHandler( QgsVectorLayer *layer, const QgsAbstract3DSymbol *symbol ) SIP_FACTORY { Q_UNUSED( layer ); Q_UNUSED( symbol ); return nullptr; } 91 : : #endif 92 : : 93 : : private: 94 : : QString mType; 95 : : QString mVisibleName; 96 : : }; 97 : : 98 : : //! 3D symbol creation function 99 : : typedef QgsAbstract3DSymbol *( *Qgs3DSymbolCreateFunc )() SIP_SKIP; 100 : : 101 : : //! 3D symbol widget creation function 102 : : typedef QgsFeature3DHandler *( *Qgs3DSymbolFeatureHandlerFunc )( QgsVectorLayer *, const QgsAbstract3DSymbol * ) SIP_SKIP; 103 : : 104 : : //! 3D symbol widget creation function 105 : : typedef Qgs3DSymbolWidget *( *Qgs3DSymbolWidgetFunc )( QgsVectorLayer * ) SIP_SKIP; 106 : : 107 : : #ifndef SIP_RUN 108 : : 109 : : /** 110 : : * \ingroup core 111 : : * \brief Convenience metadata class that uses static functions to create a 3D symbol and its widget. 112 : : * 113 : : * \note Not available in Python bindings. 114 : : * 115 : : * \since QGIS 3.16 116 : : */ 117 : : class CORE_EXPORT Qgs3DSymbolMetadata : public Qgs3DSymbolAbstractMetadata 118 : : { 119 : : public: 120 : : 121 : : /** 122 : : * Constructor for Qgs3DSymbolMetadata, with the specified \a type and \a visibleName. 123 : : * 124 : : * The \a pfCreate, \a pfWidget and \a pfHandler arguments are used to specify 125 : : * static functions for creating the symbol type and configuration widget. 126 : : */ 127 : : Qgs3DSymbolMetadata( const QString &type, const QString &visibleName, 128 : : Qgs3DSymbolCreateFunc pfCreate, 129 : : Qgs3DSymbolWidgetFunc pfWidget = nullptr, 130 : : Qgs3DSymbolFeatureHandlerFunc pfHandler = nullptr ) SIP_SKIP 131 : : : Qgs3DSymbolAbstractMetadata( type, visibleName ) 132 : : , mCreateFunc( pfCreate ) 133 : : , mWidgetFunc( pfWidget ) 134 : : , mFeatureHandlerFunc( pfHandler ) 135 : : {} 136 : : 137 : : /** 138 : : * Returns the symbol type's creation function. 139 : : */ 140 : : Qgs3DSymbolCreateFunc createFunction() const { return mCreateFunc; } 141 : : 142 : : /** 143 : : * Returns the symbol type's widget creation function. 144 : : * 145 : : * \see setWidgetFunction() 146 : : */ 147 : : Qgs3DSymbolWidgetFunc widgetFunction() const { return mWidgetFunc; } 148 : : 149 : : /** 150 : : * Sets the symbol type's widget creation \a function. 151 : : * 152 : : * \see widgetFunction() 153 : : */ 154 : : void setWidgetFunction( Qgs3DSymbolWidgetFunc function ) { mWidgetFunc = function; } 155 : : 156 : : /** 157 : : * Sets the symbol type's feature handler creation \a function. 158 : : */ 159 : : void setFeatureHandlerFunction( Qgs3DSymbolFeatureHandlerFunc function ) { mFeatureHandlerFunc = function; } 160 : : 161 : : QgsAbstract3DSymbol *create() override SIP_FACTORY { return mCreateFunc ? mCreateFunc() : nullptr; } 162 : : Qgs3DSymbolWidget *createSymbolWidget( QgsVectorLayer *vl ) override SIP_FACTORY { return mWidgetFunc ? mWidgetFunc( vl ) : nullptr; } 163 : : QgsFeature3DHandler *createFeatureHandler( QgsVectorLayer *layer, const QgsAbstract3DSymbol *symbol ) override SIP_FACTORY { return mFeatureHandlerFunc ? mFeatureHandlerFunc( layer, symbol ) : nullptr; } 164 : : 165 : : private: 166 : : Qgs3DSymbolCreateFunc mCreateFunc; 167 : : Qgs3DSymbolWidgetFunc mWidgetFunc; 168 : : Qgs3DSymbolFeatureHandlerFunc mFeatureHandlerFunc; 169 : : 170 : : }; 171 : : #endif 172 : : 173 : : 174 : : /** 175 : : * \ingroup core 176 : : * \brief Registry of available 3D symbol classes. 177 : : * 178 : : * Qgs3DSymbolRegistry is not usually directly created, but rather accessed through 179 : : * QgsApplication::symbol3DRegistry(). 180 : : * 181 : : * \since QGIS 3.16 182 : : */ 183 : : class CORE_EXPORT Qgs3DSymbolRegistry 184 : : { 185 : : public: 186 : : 187 : : Qgs3DSymbolRegistry(); 188 : : ~Qgs3DSymbolRegistry(); 189 : : 190 : : //! Qgs3DSymbolRegistry cannot be copied. 191 : : Qgs3DSymbolRegistry( const Qgs3DSymbolRegistry &rh ) = delete; 192 : : //! Qgs3DSymbolRegistry cannot be copied. 193 : : Qgs3DSymbolRegistry &operator=( const Qgs3DSymbolRegistry &rh ) = delete; 194 : : 195 : : //! Returns metadata for specified symbol \a type. Returns NULLPTR if not found 196 : : Qgs3DSymbolAbstractMetadata *symbolMetadata( const QString &type ) const; 197 : : 198 : : /** 199 : : * Returns a list of all available symbol types. 200 : : */ 201 : : QStringList symbolTypes() const; 202 : : 203 : : //! Registers a new symbol type. Takes ownership of the \a metadata instance. 204 : : bool addSymbolType( Qgs3DSymbolAbstractMetadata *metadata SIP_TRANSFER ); 205 : : 206 : : /** 207 : : * Creates a new instance of a symbol of the specified \a type. 208 : : * 209 : : * The caller takes ownership of the returned symbol. 210 : : * 211 : : * Returns NULLPTR if the specified type is not found in the registry. 212 : : */ 213 : : QgsAbstract3DSymbol *createSymbol( const QString &type ) const SIP_FACTORY; 214 : : 215 : : /** 216 : : * Creates a new instance of the default 3D symbol for the specified geometry \a type. 217 : : * 218 : : * The caller takes ownership of the returned symbol. 219 : : */ 220 : : QgsAbstract3DSymbol *defaultSymbolForGeometryType( QgsWkbTypes::GeometryType type ) SIP_FACTORY; 221 : : 222 : : #ifndef SIP_RUN 223 : : 224 : : /** 225 : : * Creates a feature handler for a \a symbol, for the specified vector \a layer. 226 : : * 227 : : * Caller takes ownership of the returned handler. 228 : : * 229 : : * \note Not available in Python bindings 230 : : */ 231 : : QgsFeature3DHandler *createHandlerForSymbol( QgsVectorLayer *layer, const QgsAbstract3DSymbol *symbol ) SIP_FACTORY; 232 : : #endif 233 : : 234 : : private: 235 : : #ifdef SIP_RUN 236 : : Qgs3DSymbolRegistry( const Qgs3DSymbolRegistry &rh ); 237 : : #endif 238 : : 239 : : QMap<QString, Qgs3DSymbolAbstractMetadata *> mMetadata; 240 : : }; 241 : : 242 : : 243 : : #endif // QGS3DSYMBOLREGISTRY_H