Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsreadwritecontext.h 3 : : ---------------------- 4 : : begin : May 2017 5 : : copyright : (C) 2017 by Martin Dobias 6 : : email : wonder dot sk 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 QGSREADWRITECONTEXT_H 19 : : #define QGSREADWRITECONTEXT_H 20 : : 21 : : #include "qgspathresolver.h" 22 : : #include "qgis.h" 23 : : #include "qgsprojecttranslator.h" 24 : : #include "qgscoordinatetransformcontext.h" 25 : : 26 : : class QgsReadWriteContextCategoryPopper; 27 : : 28 : : /** 29 : : * \class QgsReadWriteContext 30 : : * \ingroup core 31 : : * \brief The class is used as a container of context for various read/write operations on other objects. 32 : : * \since QGIS 3.0 33 : : */ 34 : : class CORE_EXPORT QgsReadWriteContext 35 : : { 36 : : public: 37 : : 38 : : /** 39 : : * Struct for QgsReadWriteContext error or warning messages 40 : : * \since QGIS 3.2 41 : : */ 42 : 0 : struct ReadWriteMessage 43 : : { 44 : : //! Construct a container for QgsReadWriteContext error or warning messages 45 : 0 : ReadWriteMessage( const QString &message, Qgis::MessageLevel level = Qgis::Warning, const QStringList &categories = QStringList() ) 46 : 0 : : mMessage( message ) 47 : 0 : , mLevel( level ) 48 : 0 : , mCategories( categories ) 49 : 0 : {} 50 : : 51 : : //! Returns the message string 52 : 0 : QString message() const {return mMessage;} 53 : : 54 : : //! Returns the message level 55 : : Qgis::MessageLevel level() const {return mLevel;} 56 : : 57 : : //! Returns the stack of categories of the message 58 : : QStringList categories() const {return mCategories;} 59 : : 60 : : private: 61 : : QString mMessage; 62 : : Qgis::MessageLevel mLevel; 63 : : QStringList mCategories; 64 : : }; 65 : : 66 : : /** 67 : : * Constructor for QgsReadWriteContext. 68 : : */ 69 : : QgsReadWriteContext(); 70 : : 71 : : ~QgsReadWriteContext(); 72 : : 73 : : //! Returns path resolver for conversion between relative and absolute paths 74 : : const QgsPathResolver &pathResolver() const; 75 : : 76 : : //! Sets up path resolver for conversion between relative and absolute paths 77 : : void setPathResolver( const QgsPathResolver &resolver ); 78 : : 79 : : /** 80 : : * Append a message to the context 81 : : * \since QGIS 3.2 82 : : */ 83 : : void pushMessage( const QString &message, Qgis::MessageLevel level = Qgis::Warning ); 84 : : 85 : : /** 86 : : * Push a category to the stack 87 : : * \note The return value should always be used so category can be automatically left. 88 : : * \note It is not aimed at being used in Python. Instead use the context manager. 89 : : * \code{.py} 90 : : * context = QgsReadWriteContext() 91 : : * with QgsReadWriteContext.enterCategory(context, category, details): 92 : : * # do something 93 : : * \endcode 94 : : * \since QGIS 3.2 95 : : */ 96 : : MAYBE_UNUSED NODISCARD QgsReadWriteContextCategoryPopper enterCategory( const QString &category, const QString &details = QString() ) SIP_PYNAME( _enterCategory ); 97 : : 98 : : /** 99 : : * Returns the stored messages and remove them 100 : : * \since QGIS 3.2 101 : : */ 102 : : QList<QgsReadWriteContext::ReadWriteMessage> takeMessages(); 103 : : 104 : : /** 105 : : * Returns the project translator 106 : : * \since QGIS 3.4 107 : : */ 108 : 0 : const QgsProjectTranslator *projectTranslator( ) const { return mProjectTranslator; } 109 : : 110 : : /** 111 : : * Sets the project translator. 112 : : * It's usually the QgsProject where the function with the context is made and won't be changed anymore. 113 : : * 114 : : * \since QGIS 3.4 115 : : */ 116 : : void setProjectTranslator( QgsProjectTranslator *projectTranslator ); 117 : : 118 : : /** 119 : : * Returns data provider coordinate transform context 120 : : * 121 : : * \see setTransformContext() 122 : : * 123 : : * \since QGIS 3.8 124 : : */ 125 : : QgsCoordinateTransformContext transformContext() const; 126 : : 127 : : /** 128 : : * Sets data coordinate transform context to \a transformContext 129 : : * 130 : : * \see transformContext() 131 : : * 132 : : * \since QGIS 3.8 133 : : */ 134 : : void setTransformContext( const QgsCoordinateTransformContext &transformContext ); 135 : : 136 : : private: 137 : : 138 : : //! Pop the last category 139 : : void leaveCategory(); 140 : : 141 : : QgsPathResolver mPathResolver; 142 : : QList<ReadWriteMessage> mMessages; 143 : : QStringList mCategories = QStringList(); 144 : : QgsProjectTranslator *mProjectTranslator = nullptr; 145 : : friend class QgsReadWriteContextCategoryPopper; 146 : : QgsCoordinateTransformContext mCoordinateTransformContext = QgsCoordinateTransformContext(); 147 : : }; 148 : : 149 : : 150 : : /** 151 : : * \class QgsReadWriteContextCategoryPopper 152 : : * \ingroup core 153 : : * \brief Allows entering a context category and takes care of 154 : : * leaving this category on deletion of the class. 155 : : * This would happen when it gets out of scope. 156 : : * \since QGIS 3.2 157 : : */ 158 : : class CORE_EXPORT QgsReadWriteContextCategoryPopper 159 : : { 160 : : public: 161 : : //! Creates a popper 162 : 0 : QgsReadWriteContextCategoryPopper( QgsReadWriteContext &context ) : mContext( context ) {} 163 : 0 : ~QgsReadWriteContextCategoryPopper() {mContext.leaveCategory();} 164 : : private: 165 : : #ifdef SIP_RUN 166 : : QgsReadWriteContextCategoryPopper &operator=( const QgsReadWriteContextCategoryPopper & ); 167 : : #endif 168 : : 169 : : QgsReadWriteContext &mContext; 170 : : }; 171 : : 172 : : #endif // QGSREADWRITECONTEXT_H