Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgspointcloudrendererregistry.h 3 : : --------------------- 4 : : begin : November 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 : : #ifndef QGSPOINTCLOUDRENDERERREGISTRY_H 16 : : #define QGSPOINTCLOUDRENDERERREGISTRY_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 : : class QgsPointCloudRenderer; 26 : : class QgsReadWriteContext; 27 : : class QgsPointCloudLayer; 28 : : class QgsStyle; 29 : : #ifndef SIP_RUN 30 : : class QgsPointCloudRendererWidget SIP_EXTERNAL; 31 : : #endif 32 : : 33 : : class QgsPointCloudAttributeCollection; 34 : : class QgsPointCloudDataProvider; 35 : : 36 : : /** 37 : : * \ingroup core 38 : : * \brief Stores metadata about one point cloud renderer class. 39 : : * 40 : : * \note It's necessary to implement createRenderer() function. 41 : : * In C++ you can use QgsPointCloudRendererMetadata convenience class. 42 : : * 43 : : * \since QGIS 3.18 44 : : */ 45 : : class CORE_EXPORT QgsPointCloudRendererAbstractMetadata 46 : : { 47 : : public: 48 : : 49 : : /** 50 : : * Constructor for QgsPointCloudRendererAbstractMetadata, with the specified \a name. 51 : : * 52 : : * The \a visibleName argument gives a translated, user friendly string identifying the renderer type. 53 : : * 54 : : * The \a icon argument can be used to specify an icon representing the renderer. 55 : : */ 56 : 20 : QgsPointCloudRendererAbstractMetadata( const QString &name, const QString &visibleName, const QIcon &icon = QIcon() ) 57 : 20 : : mName( name ) 58 : 20 : , mVisibleName( visibleName ) 59 : 20 : , mIcon( icon ) 60 : 20 : {} 61 : 20 : virtual ~QgsPointCloudRendererAbstractMetadata() = default; 62 : : 63 : : /** 64 : : * Returns the unique name of the renderer. This value is not translated. 65 : : * \see visibleName() 66 : : */ 67 : 60 : QString name() const { return mName; } 68 : : 69 : : /** 70 : : * Returns a friendly display name of the renderer. This value is translated. 71 : : * \see name() 72 : : */ 73 : : QString visibleName() const { return mVisibleName; } 74 : : 75 : : /** 76 : : * Returns an icon representing the renderer. 77 : : * \see setIcon() 78 : : */ 79 : : QIcon icon() const { return mIcon; } 80 : : 81 : : /** 82 : : * Sets an \a icon representing the renderer. 83 : : * \see icon() 84 : : */ 85 : : void setIcon( const QIcon &icon ) { mIcon = icon; } 86 : : 87 : : /** 88 : : * Returns new instance of the renderer given the DOM element. Returns NULLPTR on error. 89 : : * Pure virtual function: must be implemented in derived classes. 90 : : */ 91 : : virtual QgsPointCloudRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) = 0 SIP_FACTORY; 92 : : 93 : : #ifndef SIP_RUN 94 : : 95 : : /** 96 : : * Returns new instance of settings widget for the renderer. Returns NULLPTR on error. 97 : : * 98 : : * The \a oldRenderer argument may refer to previously used renderer (or it is NULLPTR). 99 : : * If not NULLPTR, it may be used to initialize GUI of the widget from the previous settings. 100 : : * The old renderer does not have to be of the same type as returned by createRenderer(). 101 : : * 102 : : * \note Not available in Python bindings 103 : : */ 104 : 0 : virtual QgsPointCloudRendererWidget *createRendererWidget( QgsPointCloudLayer *layer, QgsStyle *style, QgsPointCloudRenderer *oldRenderer ) SIP_FACTORY 105 : 0 : { Q_UNUSED( layer ) Q_UNUSED( style ); Q_UNUSED( oldRenderer ); return nullptr; } 106 : : #endif 107 : : 108 : : protected: 109 : : //! name used within QGIS for identification (the same what renderer's type() returns) 110 : : QString mName; 111 : : //! name visible for users (translatable) 112 : : QString mVisibleName; 113 : : //! icon to be shown in the renderer properties dialog 114 : : QIcon mIcon; 115 : : }; 116 : : 117 : : typedef QgsPointCloudRenderer *( *QgsPointCloudRendererCreateFunc )( QDomElement &, const QgsReadWriteContext & ) SIP_SKIP; 118 : : typedef QgsPointCloudRendererWidget *( *QgsPointCloudRendererWidgetFunc )( QgsPointCloudLayer *, QgsStyle *, QgsPointCloudRenderer * ) SIP_SKIP; 119 : : 120 : : /** 121 : : * \ingroup core 122 : : * \brief Convenience metadata class that uses static functions to create point cloud renderer and its widget. 123 : : * \since QGIS 3.18 124 : : */ 125 : 40 : class CORE_EXPORT QgsPointCloudRendererMetadata : public QgsPointCloudRendererAbstractMetadata 126 : : { 127 : : public: 128 : : 129 : : /** 130 : : * Construct metadata 131 : : * \note not available in Python bindings 132 : : */ 133 : 20 : QgsPointCloudRendererMetadata( const QString &name, 134 : : const QString &visibleName, 135 : : QgsPointCloudRendererCreateFunc pfCreate, 136 : : const QIcon &icon = QIcon(), 137 : : QgsPointCloudRendererWidgetFunc pfWidget = nullptr ) SIP_SKIP 138 : 20 : : QgsPointCloudRendererAbstractMetadata( name, visibleName, icon ) 139 : 20 : , mCreateFunc( pfCreate ) 140 : 20 : , mWidgetFunc( pfWidget ) 141 : 60 : {} 142 : : 143 : 0 : QgsPointCloudRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) override SIP_FACTORY 144 : 0 : { return mCreateFunc ? mCreateFunc( elem, context ) : nullptr; } 145 : : 146 : : #ifndef SIP_RUN 147 : 0 : QgsPointCloudRendererWidget *createRendererWidget( QgsPointCloudLayer *layer, QgsStyle *style, QgsPointCloudRenderer *renderer ) override SIP_FACTORY 148 : 0 : { return mWidgetFunc ? mWidgetFunc( layer, style, renderer ) : nullptr; } 149 : : #endif 150 : : 151 : : //! \note not available in Python bindings 152 : : QgsPointCloudRendererCreateFunc createFunction() const { return mCreateFunc; } SIP_SKIP 153 : : //! \note not available in Python bindings 154 : : QgsPointCloudRendererWidgetFunc widgetFunction() const { return mWidgetFunc; } SIP_SKIP 155 : : 156 : : //! \note not available in Python bindings 157 : : void setWidgetFunction( QgsPointCloudRendererWidgetFunc f ) { mWidgetFunc = f; } SIP_SKIP 158 : : 159 : : protected: 160 : : //! pointer to function that creates an instance of the renderer when loading project / style 161 : : QgsPointCloudRendererCreateFunc mCreateFunc; 162 : : //! pointer to function that creates a widget for configuration of renderer's params 163 : : QgsPointCloudRendererWidgetFunc mWidgetFunc; 164 : : 165 : : private: 166 : : #ifdef SIP_RUN 167 : : QgsPointCloudRendererMetadata(); 168 : : #endif 169 : : 170 : : }; 171 : : 172 : : 173 : : /** 174 : : * \ingroup core 175 : : * \class QgsPointCloudRendererRegistry 176 : : * \brief Registry of 2D renderers for point clouds. 177 : : * 178 : : * QgsPointCloudRendererRegistry is not usually directly created, but rather accessed through 179 : : * QgsApplication::pointCloudRendererRegistry(). 180 : : * 181 : : * \since QGIS 3.18 182 : : */ 183 : : class CORE_EXPORT QgsPointCloudRendererRegistry 184 : : { 185 : : public: 186 : : 187 : : QgsPointCloudRendererRegistry(); 188 : : ~QgsPointCloudRendererRegistry(); 189 : : 190 : : //! QgsPointCloudRendererRegistry cannot be copied. 191 : : QgsPointCloudRendererRegistry( const QgsPointCloudRendererRegistry &rh ) = delete; 192 : : //! QgsPointCloudRendererRegistry cannot be copied. 193 : : QgsPointCloudRendererRegistry &operator=( const QgsPointCloudRendererRegistry &rh ) = delete; 194 : : 195 : : /** 196 : : * Adds a renderer to the registry. Takes ownership of the metadata object. 197 : : * \param metadata renderer metadata 198 : : * \returns TRUE if renderer was added successfully, or FALSE if renderer could not 199 : : * be added (e.g., a renderer with a duplicate name already exists) 200 : : */ 201 : : bool addRenderer( QgsPointCloudRendererAbstractMetadata *metadata SIP_TRANSFER ); 202 : : 203 : : /** 204 : : * Removes a renderer from registry. 205 : : * \param rendererName name of renderer to remove from registry 206 : : * \returns TRUE if renderer was successfully removed, or FALSE if matching 207 : : * renderer could not be found 208 : : */ 209 : : bool removeRenderer( const QString &rendererName ); 210 : : 211 : : /** 212 : : * Returns the metadata for a specified renderer. Returns NULLPTR if a matching 213 : : * renderer was not found in the registry. 214 : : */ 215 : : QgsPointCloudRendererAbstractMetadata *rendererMetadata( const QString &rendererName ); 216 : : 217 : : /** 218 : : * Returns a list of available renderers. 219 : : */ 220 : : QStringList renderersList() const; 221 : : 222 : : /** 223 : : * Returns a new default point cloud renderer for a layer with the specified \a provider. 224 : : * 225 : : * Caller takes ownership of the returned renderer. 226 : : */ 227 : : static QgsPointCloudRenderer *defaultRenderer( const QgsPointCloudDataProvider *provider ) SIP_FACTORY; 228 : : 229 : : private: 230 : : #ifdef SIP_RUN 231 : : QgsPointCloudRendererRegistry( const QgsPointCloudRendererRegistry &rh ); 232 : : #endif 233 : : 234 : : //! Map of name to renderer 235 : : QMap<QString, QgsPointCloudRendererAbstractMetadata *> mRenderers; 236 : : 237 : : //! List of renderers, maintained in the order that they have been added 238 : : QStringList mRenderersOrder; 239 : : }; 240 : : 241 : : #endif // QGSPOINTCLOUDRENDERERREGISTRY_H