26 #include <QRegularExpression> 
   30   , mDescription( description )
 
   31   , mStandardType( type )
 
   35   switch ( mStandardType )
 
   39       mHelpText = QObject::tr( 
"bool [<b>1</b>=True|<b>0</b>=False]" );
 
   44       mHelpText = QObject::tr( 
"int [≤ 0 ≥]" );
 
   49       mHelpText = QObject::tr( 
"int [≥ 0]" );
 
   54       mHelpText = QObject::tr( 
"int [≥ 1]" );
 
   59       mHelpText = QObject::tr( 
"double [≤ 0.0 ≥]" );
 
   64       mHelpText = QObject::tr( 
"double [≥ 0.0]" );
 
   69       mHelpText = QObject::tr( 
"double [0.0-1.0]" );
 
   74       mHelpText = QObject::tr( 
"double [0.0-360.0]" );
 
   79       mHelpText = QObject::tr( 
"string of variable length" );
 
   84       mHelpText = QObject::tr( 
"int [0-100]" );
 
   89       mHelpText = trString() + QStringLiteral( 
"[<b>MM</b>|<b>MapUnit</b>|<b>Pixel</b>|<b>Point</b>]" );
 
   94       mHelpText = QObject::tr( 
"string [<b>r,g,b,a</b>] as int 0-255 or #<b>AARRGGBB</b> as hex or <b>color</b> as color's name" );
 
   99       mHelpText = QObject::tr( 
"string [<b>r,g,b</b>] as int 0-255 or #<b>RRGGBB</b> as hex or <b>color</b> as color's name" );
 
  104       mHelpText = trString() + QStringLiteral( 
"[<b>bevel</b>|<b>miter</b>|<b>round</b>]" );
 
  109       mHelpText = trString() + QStringLiteral( 
"[<b>Normal</b>|<b>Lighten</b>|<b>Screen</b>|<b>Dodge</b>|<br>" 
  110                   "<b>Addition</b>|<b>Darken</b>|<b>Multiply</b>|<b>Burn</b>|<b>Overlay</b>|<br>" 
  111                   "<b>SoftLight</b>|<b>HardLight</b>|<b>Difference</b>|<b>Subtract</b>]" );
 
  116       mHelpText = QObject::tr( 
"double coord [<b>X,Y</b>]" );
 
  121       mHelpText = QObject::tr( 
"double [≥ 0.0]" );
 
  126       mHelpText = QObject::tr( 
"string of doubles '<b>width,height</b>' or array of doubles <b>[width, height]</b>" );
 
  131       mHelpText = trString() + QStringLiteral( 
"[<b>no</b>|<b>solid</b>|<b>dash</b>|<b>dot</b>|<b>dash dot</b>|<b>dash dot dot</b>]" );
 
  136       mHelpText = QObject::tr( 
"double [≥ 0.0]" );
 
  141       mHelpText = trString() + QStringLiteral( 
"[<b>solid</b>|<b>horizontal</b>|<b>vertical</b>|<b>cross</b>|<b>b_diagonal</b>|<b>f_diagonal" 
  142                   "</b>|<b>diagonal_x</b>|<b>dense1</b>|<b>dense2</b>|<b>dense3</b>|<b>dense4</b>|<b>dense5" 
  143                   "</b>|<b>dense6</b>|<b>dense7</b>|<b>no]" );
 
  148       mHelpText = trString() + QStringLiteral( 
"[<b>square</b>|<b>flat</b>|<b>round</b>]" );
 
  153       mHelpText = trString() + QStringLiteral( 
"[<b>left</b>|<b>center</b>|<b>right</b>]" );
 
  158       mHelpText = trString() + QStringLiteral( 
"[<b>top</b>|<b>center</b>|<b>bottom</b>]" );
 
  163       mHelpText = trString() + QStringLiteral( 
"[<b>filepath</b>] as<br>" 
  164                   "<b>''</b>=empty|absolute|search-paths-relative|<br>" 
  165                   "project-relative|URL" );
 
  170       mHelpText = QObject::tr( 
"string of doubles '<b>x,y</b>' or array of doubles <b>[x, y]</b>" );
 
  175       mHelpText = QObject::tr( 
"DateTime or string representation of a DateTime" );
 
  185   , mDescription( description )
 
  187   , mHelpText( helpText )
 
  189   , mComment( comment )
 
  198 QString QgsPropertyDefinition::trString()
 
  201   return QObject::tr( 
"string " );
 
  210   QVariantMap variantMap;
 
  211   QMap<QString, QgsProperty>::const_iterator it = propertyMap.constBegin();
 
  212   for ( ; it != propertyMap.constEnd(); ++it )
 
  213     variantMap.insert( it.key(), it.value().toVariant() );
 
  219   QMap<QString, QgsProperty> propertyMap;
 
  220   QVariantMap::const_iterator it = variantMap.constBegin();
 
  221   for ( ; it != variantMap.constEnd(); ++it )
 
  225       propertyMap.insert( it.key(), property );
 
  232   d = 
new QgsPropertyPrivate();
 
  273   return d->active == other.d->active
 
  274          && d->type == other.d->type
 
  275          && ( d->type != 
StaticProperty || d->staticValue == other.d->staticValue )
 
  278          && ( ( !d->transformer && !other.d->transformer ) || ( d->transformer && other.d->transformer && d->transformer->toExpression( QString() ) == other.d->transformer->toExpression( QString() ) ) );
 
  283   return ( !( ( *
this ) == other ) );
 
  288   return static_cast< Type >( d->type );
 
  338   d->staticValue = 
value;
 
  346   return d->staticValue;
 
  353   d->fieldName = 
field;
 
  354   d->cachedFieldIdx = -1;
 
  365 QgsProperty::operator bool()
 const 
  367   return d->type != InvalidProperty;
 
  373   d->expressionString = expression;
 
  375   d->expressionPrepared = 
false;
 
  376   d->expressionIsInvalid = 
false;
 
  378   if ( d->expressionString.isEmpty() )
 
  394   return d->expressionString;
 
  412       exp = d->expressionString;
 
  419   return d->transformer ? d->transformer->toExpression( exp ) : exp;
 
  444       if ( !d->expression.prepare( &context ) )
 
  446         d->expressionReferencedCols.clear();
 
  447         d->expressionPrepared = 
false;
 
  448         d->expressionIsInvalid = 
true;
 
  452       d->expressionPrepared = 
true;
 
  453       d->expressionIsInvalid = 
false;
 
  454       d->expressionReferencedCols = d->expression.referencedColumns();
 
  469     return QSet<QString>();
 
  475       return QSet<QString>();
 
  479       QSet< QString > fields;
 
  480       if ( !d->fieldName.isEmpty() )
 
  481         fields.insert( d->fieldName );
 
  489         return d->expression.referencedColumns();
 
  492       if ( d->expressionIsInvalid )
 
  493         return QSet< QString >();
 
  496       if ( !d->expressionPrepared && !
prepare( context ) )
 
  498         d->expressionIsInvalid = 
true;
 
  499         return QSet< QString >();
 
  502       return d->expressionReferencedCols;
 
  506   return QSet<QString>();
 
  511   const QRegularExpression rx( QStringLiteral( 
"^project_color\\('.*'\\)$" ) );
 
  513          && rx.match( d->expressionString ).hasMatch();
 
  516 QVariant QgsProperty::propertyValue( 
const QgsExpressionContext &context, 
const QVariant &defaultValue, 
bool *ok )
 const 
  530       return d->staticValue;
 
  540       if ( d->cachedFieldIdx >= 0 )
 
  547       if ( d->cachedFieldIdx < 0 )
 
  557       if ( d->expressionIsInvalid )
 
  560       if ( !d->expressionPrepared && !
prepare( context ) )
 
  563       QVariant result = d->expression.evaluate( &context );
 
  564       if ( !result.isNull() )
 
  591   QVariant val = propertyValue( context, defaultValue, &valOk );
 
  592   if ( !d->transformer && !valOk ) 
 
  595   if ( d->transformer )
 
  599     val = d->transformer->transform( context, val );
 
  611   const QVariant val = 
value( context, defaultDateTime, &valOk );
 
  613   if ( !valOk || val.isNull() )
 
  617     return defaultDateTime;
 
  621   if ( val.type() == QVariant::DateTime )
 
  623     dateTime = val.value<QDateTime>();
 
  627     dateTime = val.toDateTime();
 
  630   if ( !dateTime.isValid() )
 
  631     return defaultDateTime;
 
  643   const QVariant val = 
value( context, defaultString, &valOk );
 
  645   if ( !valOk || val.isNull() )
 
  649     return defaultString;
 
  655     return val.toString();
 
  665   const QVariant val = 
value( context, defaultColor, &valOk );
 
  667   if ( !valOk || val.isNull() )
 
  671   if ( val.type() == QVariant::Color )
 
  673     color = val.value<QColor>();
 
  680   if ( !color.isValid() )
 
  696   const QVariant val = 
value( context, defaultValue, &valOk );
 
  698   if ( !valOk || val.isNull() )
 
  701   bool convertOk = 
false;
 
  702   const double dbl = val.toDouble( &convertOk );
 
  719   const QVariant val = 
value( context, defaultValue, &valOk );
 
  721   if ( !valOk || val.isNull() )
 
  724   bool convertOk = 
false;
 
  725   const int integer = val.toInt( &convertOk );
 
  729     const double dbl = val.toDouble( &convertOk );
 
  734       return std::round( dbl );
 
  755   const QVariant val = 
value( context, defaultValue, &valOk );
 
  757   if ( !valOk || val.isNull() )
 
  767   QVariantMap propertyMap;
 
  769   propertyMap.insert( QStringLiteral( 
"active" ), d->active );
 
  770   propertyMap.insert( QStringLiteral( 
"type" ), d->type );
 
  776       propertyMap.insert( QStringLiteral( 
"val" ), d->staticValue.toString() );
 
  780       propertyMap.insert( QStringLiteral( 
"field" ), d->fieldName );
 
  784       propertyMap.insert( QStringLiteral( 
"expression" ), d->expressionString );
 
  791   if ( d->transformer )
 
  794     transformer.insert( QStringLiteral( 
"t" ), d->transformer->transformerType() );
 
  795     transformer.insert( QStringLiteral( 
"d" ), d->transformer->toVariant() );
 
  797     propertyMap.insert( QStringLiteral( 
"transformer" ), 
transformer );
 
  805   const QVariantMap propertyMap = 
property.toMap();
 
  808   d->active = propertyMap.value( QStringLiteral( 
"active" ) ).toBool();
 
  809   d->type = 
static_cast< Type >( propertyMap.value( QStringLiteral( 
"type" ), 
InvalidProperty ).toInt() );
 
  814       d->staticValue = propertyMap.value( QStringLiteral( 
"val" ) );
 
  819       d->fieldName = propertyMap.value( QStringLiteral( 
"field" ) ).toString();
 
  820       if ( d->fieldName.isEmpty() )
 
  825       d->expressionString = propertyMap.value( QStringLiteral( 
"expression" ) ).toString();
 
  826       if ( d->expressionString.isEmpty() )
 
  830       d->expressionPrepared = 
false;
 
  831       d->expressionIsInvalid = 
false;
 
  832       d->expressionReferencedCols.clear();
 
  841   delete d->transformer;
 
  842   d->transformer = 
nullptr;
 
  845   const QVariant transform = propertyMap.value( QStringLiteral( 
"transformer" ) );
 
  847   if ( transform.isValid() )
 
  849     const QVariantMap transformerMap = transform.toMap();
 
  873   return d->transformer;
 
  881   if ( d->transformer )
 
  884   QString baseExpression;
 
  892   if ( !fieldName.isEmpty() )
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
QgsFeature feature() const
Convenience function for retrieving the feature for the context, if set.
 
QgsFields fields() const
Convenience function for retrieving the fields for the context, if set.
 
bool hasCachedStaticValue() const
Returns true if the node can be replaced by a static cached value.
 
QVariant cachedStaticValue() const
Returns the node's static cached value.
 
Class for parsing and evaluation of expressions (formerly called "search strings").
 
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
 
static QString quotedValue(const QVariant &value)
Returns a string representation of a literal value, including appropriate quotations where required.
 
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
 
const QgsExpressionNode * rootNode() const
Returns the root node of the expression.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
bool isValid() const
Returns the validity of this feature.
 
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
 
Container of fields for a vector layer.
 
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
 
StandardPropertyTemplate
Predefined standard property templates.
 
@ HorizontalAnchor
Horizontal anchor point.
 
@ Double
Double value (including negative values)
 
@ VerticalAnchor
Vertical anchor point.
 
@ Double0To1
Double value between 0-1 (inclusive)
 
@ FillStyle
Fill style (eg solid, lines)
 
@ StrokeWidth
Line stroke width.
 
@ LineStyle
Line style (eg solid/dashed)
 
@ Integer
Integer value (including negative values)
 
@ String
Any string value.
 
@ DateTime
DateTime value.
 
@ RenderUnits
Render units (eg mm/pixels/map units)
 
@ PenJoinStyle
Pen join style.
 
@ SvgPath
Path to an SVG file.
 
@ IntegerPositiveGreaterZero
Non-zero positive integer values.
 
@ IntegerPositive
Positive integer values (including 0)
 
@ CapStyle
Line cap style (eg round)
 
@ ColorNoAlpha
Color with no alpha channel.
 
@ Rotation
Rotation (value between 0-360 degrees)
 
@ Custom
Custom property types.
 
@ Size
1D size (eg marker radius, or square marker height/width)
 
@ ColorWithAlpha
Color with alpha channel.
 
@ DoublePositive
Positive double value (including 0)
 
@ Size2D
2D size (width/height different)
 
bool supportsAssistant() const
Returns true if the property is of a type which is compatible with property override assistants.
 
QgsPropertyDefinition()=default
Constructs an empty property.
 
DataType
Valid data types required by property.
 
@ DataTypeString
Property requires a string value.
 
@ DataTypeBoolean
Property requires a boolean value.
 
@ DataTypeNumeric
Property requires a numeric value.
 
A store for object properties.
 
QDateTime valueAsDateTime(const QgsExpressionContext &context, const QDateTime &defaultDateTime=QDateTime(), bool *ok=nullptr) const
Calculates the current value of the property and interprets it as a datetime.
 
@ ExpressionBasedProperty
Expression based property (QgsExpressionBasedProperty)
 
@ StaticProperty
Static property (QgsStaticProperty)
 
@ FieldBasedProperty
Field based property (QgsFieldBasedProperty)
 
@ InvalidProperty
Invalid (not set) property.
 
QColor valueAsColor(const QgsExpressionContext &context, const QColor &defaultColor=QColor(), bool *ok=nullptr) const
Calculates the current value of the property and interprets it as a color.
 
bool isProjectColor() const
Returns true if the property is set to a linked project color.
 
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext(), bool ignoreContext=false) const
Returns the set of any fields referenced by the property for a specified expression context.
 
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
 
bool operator==(const QgsProperty &other) const
 
static QVariantMap propertyMapToVariantMap(const QMap< QString, QgsProperty > &propertyMap)
Convert a map of QgsProperty to a map of QVariant This is useful to save a map of properties.
 
QString expressionString() const
Returns the expression used for the property value.
 
bool convertToTransformer()
Attempts to convert an existing expression based property to a base expression with corresponding tra...
 
void setTransformer(QgsPropertyTransformer *transformer)
Sets an optional transformer to use for manipulating the calculated values for the property.
 
void setStaticValue(const QVariant &value)
Sets the static value for the property.
 
QString valueAsString(const QgsExpressionContext &context, const QString &defaultString=QString(), bool *ok=nullptr) const
Calculates the current value of the property and interprets it as a string.
 
QString field() const
Returns the current field name the property references.
 
const QgsPropertyTransformer * transformer() const
Returns the existing transformer used for manipulating the calculated values for the property,...
 
QVariant value(const QgsExpressionContext &context, const QVariant &defaultValue=QVariant(), bool *ok=nullptr) const
Calculates the current value of the property, including any transforms which are set for the property...
 
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
 
QVariant toVariant() const
Saves this property to a QVariantMap, wrapped in a QVariant.
 
bool isActive() const
Returns whether the property is currently active.
 
double valueAsDouble(const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property and interprets it as a double.
 
static QMap< QString, QgsProperty > variantMapToPropertyMap(const QVariantMap &variantMap)
Convert a map of QVariant to a map of QgsProperty This is useful to restore a map of properties.
 
void setField(const QString &field)
Sets the field name the property references.
 
int valueAsInt(const QgsExpressionContext &context, int defaultValue=0, bool *ok=nullptr) const
Calculates the current value of the property and interprets it as an integer.
 
bool valueAsBool(const QgsExpressionContext &context, bool defaultValue=false, bool *ok=nullptr) const
Calculates the current value of the property and interprets it as an boolean.
 
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const
Prepares the property against a specified expression context.
 
bool loadVariant(const QVariant &property)
Loads this property from a QVariantMap, wrapped in a QVariant.
 
QVariant staticValue() const
Returns the current static value for the property.
 
Type propertyType() const
Returns the property type.
 
bool operator!=(const QgsProperty &other) const
 
bool isStaticValueInContext(const QgsExpressionContext &context, QVariant &staticValue) const
Returns true if the property is effectively a static value in the specified context.
 
void setExpressionString(const QString &expression)
Sets the expression to use for the property value.
 
QgsProperty & operator=(const QgsProperty &other)
 
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
 
QgsProperty()
Constructor for a QgsProperty.
 
static QgsProperty fromValue(const QVariant &value, bool isActive=true)
Returns a new StaticProperty created from the specified value.
 
void setActive(bool active)
Sets whether the property is currently active.
 
static QColor decodeColor(const QString &str)