23#include <QRegularExpression>
26using namespace Qt::StringLiterals;
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() + u
"[<b>MM</b>|<b>MapUnit</b>|<b>Pixel</b>|<b>Point</b>]"_s;
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() + u
"[<b>bevel</b>|<b>miter</b>|<b>round</b>]"_s;
109 mHelpText = trString()
111 "[<b>Normal</b>|<b>Lighten</b>|<b>Screen</b>|<b>Dodge</b>|<br>"
112 "<b>Addition</b>|<b>Darken</b>|<b>Multiply</b>|<b>Burn</b>|<b>Overlay</b>|<br>"
113 "<b>SoftLight</b>|<b>HardLight</b>|<b>Difference</b>|<b>Subtract</b>]"
119 mHelpText = QObject::tr(
"double coord [<b>X,Y</b>]" );
124 mHelpText = QObject::tr(
"double [≥ 0.0]" );
129 mHelpText = QObject::tr(
"string of doubles '<b>width,height</b>' or array of doubles <b>[width, height]</b>" );
134 mHelpText = trString() + u
"[<b>no</b>|<b>solid</b>|<b>dash</b>|<b>dot</b>|<b>dash dot</b>|<b>dash dot dot</b>]"_s;
139 mHelpText = QObject::tr(
"double [≥ 0.0]" );
144 mHelpText = trString()
146 "[<b>solid</b>|<b>horizontal</b>|<b>vertical</b>|<b>cross</b>|<b>b_diagonal</b>|<b>f_diagonal"
147 "</b>|<b>diagonal_x</b>|<b>dense1</b>|<b>dense2</b>|<b>dense3</b>|<b>dense4</b>|<b>dense5"
148 "</b>|<b>dense6</b>|<b>dense7</b>|<b>no]"
154 mHelpText = trString() + u
"[<b>square</b>|<b>flat</b>|<b>round</b>]"_s;
159 mHelpText = trString() + u
"[<b>left</b>|<b>center</b>|<b>right</b>]"_s;
164 mHelpText = trString() + u
"[<b>top</b>|<b>center</b>|<b>bottom</b>]"_s;
169 mHelpText = trString()
171 "[<b>filepath</b>] as<br>"
172 "<b>''</b>=empty|absolute|search-paths-relative|<br>"
173 "project-relative|URL"
179 mHelpText = QObject::tr(
"string of doubles '<b>x,y</b>' or array of doubles <b>[x, y]</b>" );
184 mHelpText = QObject::tr(
"DateTime or string representation of a DateTime" );
206QString QgsPropertyDefinition::trString()
209 return QObject::tr(
"string " );
218 QVariantMap variantMap;
219 QMap<QString, QgsProperty>::const_iterator it = propertyMap.constBegin();
220 for ( ; it != propertyMap.constEnd(); ++it )
221 variantMap.insert( it.key(), it.value().toVariant() );
227 QMap<QString, QgsProperty> propertyMap;
228 QVariantMap::const_iterator it = variantMap.constBegin();
229 for ( ; it != variantMap.constEnd(); ++it )
233 propertyMap.insert( it.key(), property );
240 d =
new QgsPropertyPrivate();
275 if ( &other ==
this )
284 return d->active == other.d->active
285 && d->type == other.d->type
289 && ( ( !d->transformer && !other.d->transformer ) || ( d->transformer && other.d->transformer && d->transformer->toExpression( QString() ) == other.d->transformer->toExpression( QString() ) ) );
294 return ( !( ( *
this ) == other ) );
349 d->staticValue =
value;
357 return d->staticValue;
364 d->fieldName =
field;
365 d->cachedFieldIdx = -1;
376QgsProperty::operator bool()
const
384 d->expressionString = expression;
386 d->expressionPrepared =
false;
387 d->expressionIsInvalid =
false;
389 if ( d->expressionString.isEmpty() )
405 return d->expressionString;
423 exp = d->expressionString;
430 return d->transformer ? d->transformer->toExpression( exp ) : exp;
455 if ( !d->expression.prepare( &context ) )
457 d->expressionReferencedCols.clear();
458 d->expressionPrepared =
false;
459 d->expressionIsInvalid =
true;
463 d->expressionPrepared =
true;
464 d->expressionIsInvalid =
false;
465 d->expressionReferencedCols = d->expression.referencedColumns();
479 return QSet<QString>();
485 return QSet<QString>();
489 QSet< QString > fields;
490 if ( !d->fieldName.isEmpty() )
491 fields.insert( d->fieldName );
499 return d->expression.referencedColumns();
502 if ( d->expressionIsInvalid )
503 return QSet< QString >();
506 if ( !d->expressionPrepared && !
prepare( context ) )
508 d->expressionIsInvalid =
true;
509 return QSet< QString >();
512 return d->expressionReferencedCols;
515 return QSet<QString>();
522 return d->expression.referencedVariables();
527 const thread_local QRegularExpression rx( u
"^project_color(_object|)\\('.*'\\)$"_s );
531QVariant QgsProperty::propertyValue(
const QgsExpressionContext &context,
const QVariant &defaultValue,
bool *ok )
const
545 return d->staticValue;
550 const QgsFeature f = context.
feature();
555 if ( d->cachedFieldIdx >= 0 )
562 if ( d->cachedFieldIdx < 0 )
572 if ( d->expressionIsInvalid )
575 if ( !d->expressionPrepared && !
prepare( context ) )
578 QVariant result = d->expression.evaluate( &context );
605 QVariant val = propertyValue( context, defaultValue, &valOk );
606 if ( !d->transformer && !valOk )
609 if ( d->transformer )
613 val = d->transformer->transform( context, val );
625 const QVariant val =
value( context, defaultDateTime, &valOk );
631 return defaultDateTime;
635 if ( val.userType() == QMetaType::Type::QDateTime )
637 dateTime = val.value<QDateTime>();
641 dateTime = val.toDateTime();
644 if ( !dateTime.isValid() )
645 return defaultDateTime;
657 const QVariant val =
value( context, defaultString, &valOk );
663 return defaultString;
669 return val.toString();
679 const QVariant val =
value( context, defaultColor, &valOk );
685 if ( val.userType() == QMetaType::Type::QColor )
687 color = val.value<QColor>();
694 if ( !color.isValid() )
710 const QVariant val =
value( context, defaultValue, &valOk );
715 bool convertOk =
false;
716 const double dbl = val.toDouble( &convertOk );
733 const QVariant val =
value( context, defaultValue, &valOk );
738 bool convertOk =
false;
739 const int integer = val.toInt( &convertOk );
743 const double dbl = val.toDouble( &convertOk );
748 return std::round( dbl );
769 const QVariant val =
value( context, defaultValue, &valOk );
781 QVariantMap propertyMap;
783 propertyMap.insert( u
"active"_s, d->active );
784 propertyMap.insert( u
"type"_s,
static_cast< int >( d->type ) );
790 propertyMap.insert( u
"val"_s, d->staticValue.toString() );
794 propertyMap.insert( u
"field"_s, d->fieldName );
798 propertyMap.insert( u
"expression"_s, d->expressionString );
805 if ( d->transformer )
808 transformer.insert( u
"t"_s, d->transformer->transformerType() );
809 transformer.insert( u
"d"_s, d->transformer->toVariant() );
811 propertyMap.insert( u
"transformer"_s,
transformer );
819 const QVariantMap propertyMap =
property.toMap();
822 d->active = propertyMap.value( u
"active"_s ).toBool();
828 d->staticValue = propertyMap.value( u
"val"_s );
833 d->fieldName = propertyMap.value( u
"field"_s ).toString();
834 if ( d->fieldName.isEmpty() )
839 d->expressionString = propertyMap.value( u
"expression"_s ).toString();
840 if ( d->expressionString.isEmpty() )
844 d->expressionPrepared =
false;
845 d->expressionIsInvalid =
false;
846 d->expressionReferencedCols.clear();
854 delete d->transformer;
855 d->transformer =
nullptr;
858 const QVariant transform = propertyMap.value( u
"transformer"_s );
860 if ( transform.isValid() )
862 const QVariantMap transformerMap = transform.toMap();
869 if (
transformer->loadVariant( transformerMap.value( u
"d"_s ) ) )
886 return d->transformer;
894 if ( d->transformer )
897 QString baseExpression;
905 if ( !fieldName.isEmpty() )
PropertyType
Property types.
@ Invalid
Invalid (not set) property.
@ Field
Field based property.
@ Expression
Expression based property.
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.
Handles parsing and evaluation of expressions (formerly called "search strings").
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
QString expression() const
Returns the original, unmodified expression string.
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.
bool isValid() const
Returns the validity of this feature.
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
Container of fields for a vector layer.
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
QString helpText() const
Helper text for using the property, including a description of the valid values for the property.
QString comment() const
Returns the comment of the property.
DataType dataType() const
Returns the allowable field/value data type for the property.
QString description() const
Descriptive name of the property.
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).
@ Opacity
Opacity (0-100).
@ 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)
QString name() const
Returns the name of the property.
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.
QString origin() const
Returns the origin of the 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.
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.
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.
Qgis::PropertyType propertyType() const
Returns the property type.
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.
QSet< QString > referencedVariables() const
Returns the set of any variables referenced by the property's expression.
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.
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)
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.