Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsannotationitemregistry.h 3 : : ------------------------ 4 : : begin : October 2019 5 : : copyright : (C) 2019 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : /*************************************************************************** 9 : : * * 10 : : * This program is free software; you can redistribute it and/or modify * 11 : : * it under the terms of the GNU General Public License as published by * 12 : : * the Free Software Foundation; either version 2 of the License, or * 13 : : * (at your option) any later version. * 14 : : * * 15 : : ***************************************************************************/ 16 : : #ifndef QGSANNOTATIONITEMREGISTRY_H 17 : : #define QGSANNOTATIONITEMREGISTRY_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgis_sip.h" 21 : : #include "qgsapplication.h" 22 : : #include "qgspathresolver.h" 23 : : #include <QGraphicsItem> //for QGraphicsItem::UserType 24 : : #include <QIcon> 25 : : #include <functional> 26 : : 27 : : class QgsAnnotationItem; 28 : : class QDomElement; 29 : : class QgsReadWriteContext; 30 : : 31 : : /** 32 : : * \ingroup core 33 : : * \brief Stores metadata about one annotation item class. 34 : : * 35 : : * A companion class, QgsAnnotationItemAbstractGuiMetadata, handles the 36 : : * GUI behavior of QgsAnnotationItems. 37 : : * 38 : : * \note In C++ you can use QgsAnnotationItemMetadata convenience class. 39 : : * \since QGIS 3.16 40 : : */ 41 : : class CORE_EXPORT QgsAnnotationItemAbstractMetadata 42 : : { 43 : : public: 44 : : 45 : : /** 46 : : * Constructor for QgsAnnotationItemAbstractMetadata with the specified class \a type 47 : : * and \a visibleName. 48 : : * 49 : : * The optional \a visiblePluralName argument can be used to specify a plural variant of the item type. 50 : : */ 51 : 20 : QgsAnnotationItemAbstractMetadata( const QString &type, const QString &visibleName, const QString &visiblePluralName = QString() ) 52 : 20 : : mType( type ) 53 : 20 : , mVisibleName( visibleName ) 54 : 20 : , mVisibleNamePlural( visiblePluralName.isEmpty() ? visibleName : visiblePluralName ) 55 : 40 : {} 56 : : 57 : 20 : virtual ~QgsAnnotationItemAbstractMetadata() = default; 58 : : 59 : : /** 60 : : * Returns the unique item type string for the annotation item class. 61 : : */ 62 : 0 : QString type() const { return mType; } 63 : : 64 : : /** 65 : : * Returns a translated, user visible name for the annotation item class. 66 : : * \see visiblePluralName() 67 : : */ 68 : 0 : QString visibleName() const { return mVisibleName; } 69 : : 70 : : /** 71 : : * Returns a translated, user visible name for plurals of the annotation item class (e.g. "Labels" for a "Label" item). 72 : : */ 73 : : QString visiblePluralName() const { return mVisibleNamePlural; } 74 : : 75 : : /** 76 : : * Creates a new, default, annotation item of this class. 77 : : */ 78 : : virtual QgsAnnotationItem *createItem() = 0 SIP_FACTORY; 79 : : 80 : : private: 81 : : 82 : : QString mType; 83 : : QString mVisibleName; 84 : : QString mVisibleNamePlural; 85 : : }; 86 : : 87 : : //! Annotation item creation function 88 : : typedef std::function<QgsAnnotationItem *()> QgsAnnotationItemCreateFunc SIP_SKIP; 89 : : 90 : : #ifndef SIP_RUN 91 : : 92 : : /** 93 : : * \ingroup core 94 : : * \brief Convenience metadata class that uses static functions to create annotation items and their configuration widgets. 95 : : * \note not available in Python bindings 96 : : * \since QGIS 3.16 97 : : */ 98 : 40 : class CORE_EXPORT QgsAnnotationItemMetadata : public QgsAnnotationItemAbstractMetadata 99 : : { 100 : : public: 101 : : 102 : : /** 103 : : * Constructor for QgsAnnotationItemMetadata with the specified class \a type 104 : : * and \a visibleName, and function pointers for the various item creation functions. 105 : : * 106 : : * The \a visiblePluralName argument is used to specify a plural variant of the item type. 107 : : */ 108 : 20 : QgsAnnotationItemMetadata( const QString &type, const QString &visibleName, const QString &visiblePluralName, 109 : : const QgsAnnotationItemCreateFunc &pfCreate ) 110 : 20 : : QgsAnnotationItemAbstractMetadata( type, visibleName, visiblePluralName ) 111 : 20 : , mCreateFunc( pfCreate ) 112 : 40 : {} 113 : : 114 : : /** 115 : : * Returns the classes' item default creation function. 116 : : */ 117 : : QgsAnnotationItemCreateFunc createFunction() const { return mCreateFunc; } 118 : : 119 : 0 : QgsAnnotationItem *createItem() override { return mCreateFunc ? mCreateFunc() : nullptr; } 120 : : 121 : : protected: 122 : : QgsAnnotationItemCreateFunc mCreateFunc = nullptr; 123 : : 124 : : }; 125 : : 126 : : #endif 127 : : 128 : : 129 : : /** 130 : : * \ingroup core 131 : : * \class QgsAnnotationItemRegistry 132 : : * \brief Registry of available annotation item types. 133 : : * 134 : : * QgsAnnotationItemRegistry is not usually directly created, but rather accessed through 135 : : * QgsApplication::annotationItemRegistry(). 136 : : * 137 : : * A companion class, QgsAnnotationItemGuiRegistry, handles the GUI behavior 138 : : * of annotation items. 139 : : * 140 : : * \since QGIS 3.16 141 : : */ 142 : : class CORE_EXPORT QgsAnnotationItemRegistry : public QObject 143 : : { 144 : : Q_OBJECT 145 : : 146 : : public: 147 : : 148 : : /** 149 : : * Creates a new empty item registry. 150 : : * 151 : : * QgsAnnotationItemRegistry is not usually directly created, but rather accessed through 152 : : * QgsApplication::annotationItemRegistry(). 153 : : * 154 : : * \see populate() 155 : : */ 156 : : QgsAnnotationItemRegistry( QObject *parent = nullptr ); 157 : : 158 : : ~QgsAnnotationItemRegistry() override; 159 : : 160 : : /** 161 : : * Populates the registry with standard item types. If called on a non-empty registry 162 : : * then this will have no effect and will return FALSE. 163 : : */ 164 : : bool populate(); 165 : : 166 : : //! QgsAnnotationItemRegistry cannot be copied. 167 : : QgsAnnotationItemRegistry( const QgsAnnotationItemRegistry &rh ) = delete; 168 : : //! QgsAnnotationItemRegistry cannot be copied. 169 : : QgsAnnotationItemRegistry &operator=( const QgsAnnotationItemRegistry &rh ) = delete; 170 : : 171 : : /** 172 : : * Returns the metadata for the specified item \a type. Returns NULLPTR if 173 : : * a corresponding type was not found in the registry. 174 : : */ 175 : : QgsAnnotationItemAbstractMetadata *itemMetadata( const QString &type ) const; 176 : : 177 : : /** 178 : : * Registers a new annotation item type. Takes ownership of the metadata instance. 179 : : */ 180 : : bool addItemType( QgsAnnotationItemAbstractMetadata *metadata SIP_TRANSFER ); 181 : : 182 : : /** 183 : : * Creates a new instance of a annotation item given the item \a type. 184 : : */ 185 : : QgsAnnotationItem *createItem( const QString &type ) const SIP_FACTORY; 186 : : 187 : : /** 188 : : * Returns a map of available item types to translated name. 189 : : */ 190 : : QMap< QString, QString> itemTypes() const; 191 : : 192 : : signals: 193 : : 194 : : /** 195 : : * Emitted whenever a new item type is added to the registry, with the specified 196 : : * \a type and visible \a name. 197 : : */ 198 : : void typeAdded( const QString &type, const QString &name ); 199 : : 200 : : private: 201 : : #ifdef SIP_RUN 202 : : QgsAnnotationItemRegistry( const QgsAnnotationItemRegistry &rh ); 203 : : #endif 204 : : 205 : : QMap<QString, QgsAnnotationItemAbstractMetadata *> mMetadata; 206 : : 207 : : }; 208 : : 209 : : #endif //QGSANNOTATIONITEMREGISTRY_H 210 : : 211 : : 212 : :