Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsstyleentityvisitor.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 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSSTYLEENTITYVISITOR_H 19 : : #define QGSSTYLEENTITYVISITOR_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgsstyle.h" 23 : : 24 : : /** 25 : : * \class QgsStyleEntityVisitorInterface 26 : : * \ingroup core 27 : : * 28 : : * \brief An interface for classes which can visit style entity (e.g. symbol) nodes (using the visitor pattern). 29 : : * 30 : : * \since QGIS 3.10 31 : : */ 32 : : 33 : 0 : class CORE_EXPORT QgsStyleEntityVisitorInterface 34 : : { 35 : : 36 : : public: 37 : : 38 : : /** 39 : : * Describes the types of nodes which may be visited by the visitor. 40 : : */ 41 : : enum class NodeType : int 42 : : { 43 : : Project, //!< QGIS Project node 44 : : Layer, //!< Map layer 45 : : SymbolRule, //!< Rule based symbology or label child rule 46 : : Layouts, //!< Layout collection 47 : : PrintLayout, //!< An individual print layout 48 : : LayoutItem, //!< Individual item in a print layout 49 : : Report, //!< A QGIS print report 50 : : ReportHeader, //!< Report header section 51 : : ReportFooter, //!< Report footer section 52 : : ReportSection, //!< Report sub section 53 : : Annotations, //!< Annotations collection 54 : : Annotation, //!< An individual annotation 55 : : }; 56 : : 57 : : /** 58 : : * Contains information relating to the style entity currently being visited. 59 : : */ 60 : 0 : struct StyleLeaf 61 : : { 62 : : 63 : : /** 64 : : * Constructor for StyleLeaf, visiting the given style \a entity with the specified \a identifier and \a description. 65 : : * 66 : : * Ownership of \a entity is not transferred. 67 : : */ 68 : 0 : StyleLeaf( const QgsStyleEntityInterface *entity, const QString &identifier = QString(), const QString &description = QString() ) 69 : 0 : : identifier( identifier ) 70 : 0 : , description( description ) 71 : 0 : , entity( entity ) 72 : 0 : {} 73 : : 74 : : /** 75 : : * A string identifying the style entity. The actual value of \a identifier will vary 76 : : * depending on the class being visited. E.g for a categorized renderer, the 77 : : * identifier will be the category ID associated with the symbol. 78 : : * 79 : : * This may be blank if no identifier is required, e.g. when a renderer has a single 80 : : * symbol only. 81 : : * 82 : : * Note that in some cases where a specific identifier is not available, a generic, untranslated 83 : : * one may be used (e.g. "overview", "grid"). 84 : : */ 85 : : QString identifier; 86 : : 87 : : /** 88 : : * A string describing the style entity. The actual value of \a description will vary 89 : : * depending on the class being visited. E.g for a categorized renderer, the 90 : : * description will be the category label associated with the symbol, for a print layout, it will 91 : : * be the name of the layout in the project. 92 : : * 93 : : * This may be blank if no description is associated with a style entity, e.g. when a renderer has a single 94 : : * symbol only. 95 : : * 96 : : * This value may be a generic, translated value in some cases, e.g. "Grid" or "Overview". 97 : : */ 98 : : QString description; 99 : : 100 : : /** 101 : : * Reference to style entity being visited. 102 : : */ 103 : : const QgsStyleEntityInterface *entity = nullptr; 104 : : }; 105 : : 106 : : /** 107 : : * Contains information relating to a node (i.e. a group of symbols or other nodes) 108 : : * being visited. 109 : : */ 110 : 0 : struct Node 111 : : { 112 : : 113 : : /** 114 : : * Constructor for Node, visiting the node with the specified \a identifier and \a description. 115 : : */ 116 : 0 : Node( QgsStyleEntityVisitorInterface::NodeType type, const QString &identifier, const QString &description ) 117 : 0 : : type( type ) 118 : 0 : , identifier( identifier ) 119 : 0 : , description( description ) 120 : 0 : {} 121 : : 122 : : /** 123 : : * Node type. 124 : : */ 125 : : QgsStyleEntityVisitorInterface::NodeType type = QgsStyleEntityVisitorInterface::NodeType::Project; 126 : : 127 : : /** 128 : : * A string identifying the node. The actual value of \a identifier will vary 129 : : * depending on the node being visited. E.g for a rule based renderer, the 130 : : * identifier will be a rule ID. For a project, node identifiers will be 131 : : * layer IDs. 132 : : */ 133 : : QString identifier; 134 : : 135 : : /** 136 : : * A string describing the node. The actual value of \a description will vary 137 : : * depending on the node being visited. E.g for a rule based renderer, the 138 : : * identifier will be a rule label. For a project, node identifiers will be 139 : : * layer names. 140 : : */ 141 : : QString description; 142 : : 143 : : }; 144 : : 145 : 0 : virtual ~QgsStyleEntityVisitorInterface() = default; 146 : : 147 : : /** 148 : : * Called when the visitor will visit a style \a entity. 149 : : * 150 : : * Subclasses should return FALSE to abort further visitations, or TRUE to continue 151 : : * visiting after processing this entity. 152 : : */ 153 : 0 : virtual bool visit( const QgsStyleEntityVisitorInterface::StyleLeaf &entity ) 154 : : { 155 : 0 : Q_UNUSED( entity ) 156 : 0 : return true; 157 : : } 158 : : 159 : : /** 160 : : * Called when the visitor starts visiting a \a node. 161 : : * 162 : : * Subclasses should return FALSE if they do NOT want to visit this particular node - e.g. 163 : : * if the node type is QgsStyleEntityVisitorInterface::NodeType::Layouts and they do not wish to visit 164 : : * layout objects. In this case the visitor will not process the node, and will move to the next available 165 : : * node instead. Return TRUE to proceed with visiting the node. 166 : : * 167 : : * The default implementation returns TRUE. 168 : : */ 169 : 0 : virtual bool visitEnter( const QgsStyleEntityVisitorInterface::Node &node ) 170 : : { 171 : 0 : Q_UNUSED( node ) 172 : 0 : return true; 173 : : } 174 : : 175 : : /** 176 : : * Called when the visitor stops visiting a \a node. 177 : : * 178 : : * Subclasses should return FALSE to abort further visitations, or TRUE to continue 179 : : * visiting other nodes. 180 : : * 181 : : * The default implementation returns TRUE. 182 : : */ 183 : 0 : virtual bool visitExit( const QgsStyleEntityVisitorInterface::Node &node ) 184 : : { 185 : 0 : Q_UNUSED( node ) 186 : 0 : return true; 187 : : } 188 : : 189 : : }; 190 : : 191 : : #endif // QGSSTYLEENTITYVISITOR_H