Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgscalloutsregistry.h 3 : : --------------------- 4 : : begin : July 2019 5 : : copyright : (C) 2019 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 QGSCALLOUTSREGISTRY_H 17 : : #define QGSCALLOUTSREGISTRY_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgis.h" 21 : : #include "qgsreadwritecontext.h" 22 : : #include <QIcon> 23 : : 24 : : class QgsPathResolver; 25 : : class QgsVectorLayer; 26 : : class QgsCalloutWidget SIP_EXTERNAL; 27 : : class QgsCallout; 28 : : class QDomElement; 29 : : 30 : : /** 31 : : * \ingroup core 32 : : * \brief Stores metadata about one callout renderer class. 33 : : * 34 : : * \note It's necessary to implement createCallout() function. 35 : : * In C++ you can use QgsCalloutMetadata convenience class. 36 : : * 37 : : * \since QGIS 3.10 38 : : */ 39 : : class CORE_EXPORT QgsCalloutAbstractMetadata 40 : : { 41 : : public: 42 : : 43 : : /** 44 : : * Constructor for QgsCalloutAbstractMetadata, with the specified \a name. 45 : : * 46 : : * The \a visibleName argument gives a translated, user friendly string identifying the callout type. 47 : : * 48 : : * The \a icon argument can be used to specify an icon representing the callout. 49 : : */ 50 : 20 : QgsCalloutAbstractMetadata( const QString &name, const QString &visibleName, const QIcon &icon = QIcon() ) 51 : 20 : : mName( name ) 52 : 20 : , mVisibleName( visibleName ) 53 : 20 : , mIcon( icon ) 54 : 20 : {} 55 : : 56 : 20 : virtual ~QgsCalloutAbstractMetadata() = default; 57 : : 58 : : /** 59 : : * Returns the unique name of the callout type. This value is not translated. 60 : : * \see visibleName() 61 : : */ 62 : 40 : QString name() const { return mName; } 63 : : 64 : : /** 65 : : * Returns a friendly display name of the callout type. This value is translated. 66 : : * \see name() 67 : : */ 68 : : QString visibleName() const { return mVisibleName; } 69 : : 70 : : /** 71 : : * Returns an icon representing the callout. 72 : : * \see setIcon() 73 : : */ 74 : : QIcon icon() const { return mIcon; } 75 : : 76 : : /** 77 : : * Sets an \a icon representing the callout. 78 : : * \see icon() 79 : : */ 80 : : void setIcon( const QIcon &icon ) { mIcon = icon; } 81 : : 82 : : /** 83 : : * Create a callout of this type given the map of \a properties. 84 : : * 85 : : * Ownership of the callout is transferred to the caller. 86 : : */ 87 : : virtual QgsCallout *createCallout( const QVariantMap &properties, const QgsReadWriteContext &context ) = 0 SIP_FACTORY; 88 : : 89 : : /** 90 : : * Creates a widget for configuring callouts of this type. Can return NULLPTR if there's no GUI required. 91 : : * 92 : : * Ownership of the widget is transferred to the caller. 93 : : */ 94 : : virtual QgsCalloutWidget *createCalloutWidget( QgsVectorLayer * ); 95 : : 96 : : protected: 97 : : QString mName; 98 : : QString mVisibleName; 99 : : QIcon mIcon; 100 : : }; 101 : : 102 : : typedef QgsCallout *( *QgsCalloutCreateFunc )( const QVariantMap &, const QgsReadWriteContext & ) SIP_SKIP; 103 : : typedef QgsCalloutWidget *( *QgsCalloutWidgetFunc )( QgsVectorLayer * ) SIP_SKIP; 104 : : 105 : : /** 106 : : * \ingroup core 107 : : * \brief Convenience metadata class that uses static functions to create callouts and their widgets. 108 : : * \since QGIS 3.10 109 : : */ 110 : 40 : class CORE_EXPORT QgsCalloutMetadata : public QgsCalloutAbstractMetadata 111 : : { 112 : : public: 113 : : 114 : : //! \note not available in Python bindings 115 : 20 : QgsCalloutMetadata( const QString &name, const QString &visibleName, 116 : : const QIcon &icon, 117 : : QgsCalloutCreateFunc pfCreate, 118 : : QgsCalloutWidgetFunc pfWidget = nullptr ) SIP_SKIP 119 : 20 : : QgsCalloutAbstractMetadata( name, visibleName, icon ) 120 : 20 : , mCreateFunc( pfCreate ) 121 : 20 : , mWidgetFunc( pfWidget ) 122 : 60 : {} 123 : : 124 : : //! \note not available in Python bindings 125 : : QgsCalloutCreateFunc createFunction() const { return mCreateFunc; } SIP_SKIP 126 : : //! \note not available in Python bindings 127 : : QgsCalloutWidgetFunc widgetFunction() const { return mWidgetFunc; } SIP_SKIP 128 : : 129 : : //! \note not available in Python bindings 130 : : void setWidgetFunction( QgsCalloutWidgetFunc f ) { mWidgetFunc = f; } SIP_SKIP 131 : : 132 : : QgsCallout *createCallout( const QVariantMap &properties, const QgsReadWriteContext &context ) override SIP_FACTORY; 133 : : QgsCalloutWidget *createCalloutWidget( QgsVectorLayer *vl ) override SIP_FACTORY; 134 : : 135 : : protected: 136 : : QgsCalloutCreateFunc mCreateFunc; 137 : : QgsCalloutWidgetFunc mWidgetFunc; 138 : : 139 : : private: 140 : : #ifdef SIP_RUN 141 : : QgsCalloutMetadata(); 142 : : #endif 143 : : }; 144 : : 145 : : 146 : : /** 147 : : * \ingroup core 148 : : * \brief Registry of available callout classes. 149 : : * 150 : : * QgsCalloutRegistry is not usually directly created, but rather accessed through 151 : : * QgsApplication::calloutRegistry(). 152 : : * 153 : : * \since QGIS 3.10 154 : : */ 155 : : class CORE_EXPORT QgsCalloutRegistry 156 : : { 157 : : public: 158 : : 159 : : QgsCalloutRegistry(); 160 : : ~QgsCalloutRegistry(); 161 : : 162 : : //! QgsCalloutRegistry cannot be copied. 163 : : QgsCalloutRegistry( const QgsCalloutRegistry &rh ) = delete; 164 : : //! QgsCalloutRegistry cannot be copied. 165 : : QgsCalloutRegistry &operator=( const QgsCalloutRegistry &rh ) = delete; 166 : : 167 : : /** 168 : : * Returns the metadata for specified the specified callout \a type. Returns NULLPTR if no matching callout style was found. 169 : : */ 170 : : QgsCalloutAbstractMetadata *calloutMetadata( const QString &type ) const; 171 : : 172 : : /** 173 : : * Registers a new callout type. 174 : : * 175 : : * Ownership of \a metadata is transferred to the registry. 176 : : */ 177 : : bool addCalloutType( QgsCalloutAbstractMetadata *metadata SIP_TRANSFER ); 178 : : 179 : : /** 180 : : * Creates a new instance of a callout, given the callout \a type and \a properties. 181 : : * 182 : : * The caller takes ownership of the callout. 183 : : */ 184 : : QgsCallout *createCallout( const QString &type, const QVariantMap &properties = QVariantMap(), const QgsReadWriteContext &context = QgsReadWriteContext() ) const SIP_FACTORY; 185 : : 186 : : /** 187 : : * Creates a new instance of a callout of the specified \a type, using the properties from a DOM \a element. 188 : : * 189 : : * The caller takes ownership of the callout. 190 : : */ 191 : : QgsCallout *createCallout( const QString &type, const QDomElement &element, const QgsReadWriteContext &context ) const SIP_FACTORY; 192 : : 193 : : /** 194 : : * Returns a list of all available callout types. 195 : : */ 196 : : QStringList calloutTypes() const; 197 : : 198 : : /** 199 : : * Create a new instance of a callout with default settings. 200 : : * 201 : : * The caller takes ownership of the callout. 202 : : */ 203 : : static QgsCallout *defaultCallout() SIP_FACTORY; 204 : : 205 : : private: 206 : : #ifdef SIP_RUN 207 : : QgsCalloutRegistry( const QgsCalloutRegistry &rh ); 208 : : #endif 209 : : 210 : : QMap<QString, QgsCalloutAbstractMetadata *> mMetadata; 211 : : }; 212 : : 213 : : #endif // QGSCALLOUTSREGISTRY_H