Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvaluerelationfieldformatter.h - QgsValueRelationFieldFormatter 3 : : 4 : : --------------------- 5 : : begin : 3.12.2016 6 : : copyright : (C) 2016 by Matthias Kuhn 7 : : email : matthias@opengis.ch 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 QGSVALUERELATIONFIELDKIT_H 17 : : #define QGSVALUERELATIONFIELDKIT_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgsfieldformatter.h" 21 : : #include "qgsexpression.h" 22 : : #include "qgsexpressioncontext.h" 23 : : 24 : : #include <QVector> 25 : : #include <QVariant> 26 : : 27 : : 28 : : /** 29 : : * \ingroup core 30 : : * \brief Field formatter for a value relation field. 31 : : * 32 : : * A value relation field formatter looks up the values from 33 : : * features on another layer. 34 : : * 35 : : * \since QGIS 3.0 36 : : */ 37 : 10 : class CORE_EXPORT QgsValueRelationFieldFormatter : public QgsFieldFormatter 38 : : { 39 : : public: 40 : 0 : struct ValueRelationItem 41 : : { 42 : : //! Constructor for ValueRelationItem 43 : 0 : ValueRelationItem( const QVariant &key, const QString &value, const QString &description = QString() ) 44 : 0 : : key( key ) 45 : 0 : , value( value ) 46 : 0 : , description( description ) 47 : 0 : {} 48 : : 49 : : //! Constructor for ValueRelationItem 50 : : ValueRelationItem() = default; 51 : : 52 : : QVariant key; 53 : : QString value; 54 : : QString description; 55 : : }; 56 : : 57 : : typedef QVector < QgsValueRelationFieldFormatter::ValueRelationItem > ValueRelationCache; 58 : : 59 : : /** 60 : : * Constructor for QgsValueRelationFieldFormatter. 61 : : */ 62 : : QgsValueRelationFieldFormatter(); 63 : : 64 : : QString id() const override; 65 : : QString representValue( QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config, const QVariant &cache, const QVariant &value ) const override; 66 : : 67 : : QVariant sortValue( QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config, const QVariant &cache, const QVariant &value ) const override; 68 : : 69 : : QVariant createCache( QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config ) const override; 70 : : 71 : : /** 72 : : * Utility to convert a list or a string representation of an (hstore style: {1,2...}) list in \a value to a string list 73 : : * \since QGIS 3.2 74 : : */ 75 : : static QStringList valueToStringList( const QVariant &value ); 76 : : 77 : : /** 78 : : * Create a cache for a value relation field. 79 : : * This can be used to keep the value map in the local memory 80 : : * if doing multiple lookups in a loop. 81 : : * \param config The widget configuration 82 : : * \param formFeature The feature currently being edited with current attribute values 83 : : * \param parentFormFeature For embedded forms only, the feature currently being edited in the parent form with current attribute values 84 : : * \return A kvp list of values for the widget 85 : : * 86 : : * \since QGIS 3.0 87 : : */ 88 : : static QgsValueRelationFieldFormatter::ValueRelationCache createCache( const QVariantMap &config, const QgsFeature &formFeature = QgsFeature(), const QgsFeature &parentFormFeature = QgsFeature() ); 89 : : 90 : : /** 91 : : * Check if the \a expression requires a form scope (i.e. if it uses fields 92 : : * or geometry of the currently edited feature). 93 : : * 94 : : * \param expression The widget's filter expression 95 : : * \return TRUE if the expression requires a form scope 96 : : * \since QGIS 3.2 97 : : */ 98 : : static bool expressionRequiresFormScope( const QString &expression ); 99 : : 100 : : /** 101 : : * Returns a list of attributes required by the form context \a expression 102 : : * 103 : : * \param expression Form filter expression 104 : : * \return list of attributes required by the expression 105 : : * \since QGIS 3.2 106 : : */ 107 : : static QSet<QString> expressionFormAttributes( const QString &expression ); 108 : : 109 : : /** 110 : : * Returns a list of variables required by the form context \a expression 111 : : * 112 : : * \param expression Form filter expression 113 : : * \return list of variables required by the expression 114 : : * \since QGIS 3.2 115 : : */ 116 : : static QSet<QString> expressionFormVariables( const QString &expression ); 117 : : 118 : : /** 119 : : * Check if the \a expression requires a parent form scope (i.e. if it uses fields 120 : : * or geometry of the parent form's currently edited feature). 121 : : * 122 : : * \param expression The widget's filter expression 123 : : * \return TRUE if the expression requires a parent form scope 124 : : * \since QGIS 3.14 125 : : */ 126 : : static bool expressionRequiresParentFormScope( const QString &expression ); 127 : : 128 : : /** 129 : : * Returns a list of attributes required by the parent form's form context \a expression 130 : : * 131 : : * \param expression Form filter expression 132 : : * \return list of parent attributes required by the expression 133 : : * \since QGIS 3.14 134 : : */ 135 : : static QSet<QString> expressionParentFormAttributes( const QString &expression ); 136 : : 137 : : /** 138 : : * Returns a list of variables required by the parent form's form context \a expression 139 : : * 140 : : * \param expression Form filter expression 141 : : * \return list of parent variables required by the expression 142 : : * \since QGIS 3.14 143 : : */ 144 : : static QSet<QString> expressionParentFormVariables( const QString &expression ); 145 : : 146 : : 147 : : /** 148 : : * Check whether the \a feature has all values required by the \a expression, 149 : : * optionally checks for \a parentFeature 150 : : * 151 : : * \return TRUE if the expression can be used 152 : : * \since QGIS 3.2 153 : : */ 154 : : static bool expressionIsUsable( const QString &expression, const QgsFeature &feature, const QgsFeature &parentFeature = QgsFeature() ); 155 : : 156 : : /** 157 : : * Returns the (possibly NULL) layer from the widget's \a config and \a project 158 : : * \since QGIS 3.8 159 : : */ 160 : : static QgsVectorLayer *resolveLayer( const QVariantMap &config, const QgsProject *project ); 161 : : 162 : : QList<QgsVectorLayerRef> layerDependencies( const QVariantMap &config ) const override SIP_SKIP; 163 : : 164 : : QVariantList availableValues( const QVariantMap &config, int countLimit, const QgsFieldFormatterContext &context ) const override; 165 : : }; 166 : : 167 : 0 : Q_DECLARE_METATYPE( QgsValueRelationFieldFormatter::ValueRelationCache ) 168 : : 169 : : #endif // QGSVALUERELATIONFIELDKIT_H