25 #include <QRegularExpression>
29 , mDescription( description )
30 , mStandardType( type )
34 switch ( mStandardType )
38 mHelpText = QObject::tr(
"bool [<b>1</b>=True|<b>0</b>=False]" );
43 mHelpText = QObject::tr(
"int [≤ 0 ≥]" );
48 mHelpText = QObject::tr(
"int [≥ 0]" );
53 mHelpText = QObject::tr(
"int [≥ 1]" );
58 mHelpText = QObject::tr(
"double [≤ 0.0 ≥]" );
63 mHelpText = QObject::tr(
"double [≥ 0.0]" );
68 mHelpText = QObject::tr(
"double [0.0-1.0]" );
73 mHelpText = QObject::tr(
"double [0.0-360.0]" );
78 mHelpText = QObject::tr(
"string of variable length" );
83 mHelpText = QObject::tr(
"int [0-100]" );
88 mHelpText = trString() + QStringLiteral(
"[<b>MM</b>|<b>MapUnit</b>|<b>Pixel</b>|<b>Point</b>]" );
93 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" );
98 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" );
103 mHelpText = trString() + QStringLiteral(
"[<b>bevel</b>|<b>miter</b>|<b>round</b>]" );
108 mHelpText = trString() + QStringLiteral(
"[<b>Normal</b>|<b>Lighten</b>|<b>Screen</b>|<b>Dodge</b>|<br>"
109 "<b>Addition</b>|<b>Darken</b>|<b>Multiply</b>|<b>Burn</b>|<b>Overlay</b>|<br>"
110 "<b>SoftLight</b>|<b>HardLight</b>|<b>Difference</b>|<b>Subtract</b>]" );
115 mHelpText = QObject::tr(
"double coord [<b>X,Y</b>]" );
120 mHelpText = QObject::tr(
"double [≥ 0.0]" );
125 mHelpText = QObject::tr(
"string of doubles '<b>width,height</b>' or array of doubles <b>[width, height]</b>" );
130 mHelpText = trString() + QStringLiteral(
"[<b>no</b>|<b>solid</b>|<b>dash</b>|<b>dot</b>|<b>dash dot</b>|<b>dash dot dot</b>]" );
135 mHelpText = QObject::tr(
"double [≥ 0.0]" );
140 mHelpText = trString() + QStringLiteral(
"[<b>solid</b>|<b>horizontal</b>|<b>vertical</b>|<b>cross</b>|<b>b_diagonal</b>|<b>f_diagonal"
141 "</b>|<b>diagonal_x</b>|<b>dense1</b>|<b>dense2</b>|<b>dense3</b>|<b>dense4</b>|<b>dense5"
142 "</b>|<b>dense6</b>|<b>dense7</b>|<b>no]" );
147 mHelpText = trString() + QStringLiteral(
"[<b>square</b>|<b>flat</b>|<b>round</b>]" );
152 mHelpText = trString() + QStringLiteral(
"[<b>left</b>|<b>center</b>|<b>right</b>]" );
157 mHelpText = trString() + QStringLiteral(
"[<b>top</b>|<b>center</b>|<b>bottom</b>]" );
162 mHelpText = trString() + QStringLiteral(
"[<b>filepath</b>] as<br>"
163 "<b>''</b>=empty|absolute|search-paths-relative|<br>"
164 "project-relative|URL" );
169 mHelpText = QObject::tr(
"string of doubles '<b>x,y</b>' or array of doubles <b>[x, y]</b>" );
174 mHelpText = QObject::tr(
"DateTime or string representation of a DateTime" );
184 , mDescription( description )
186 , mHelpText( helpText )
188 , mComment( comment )
197 QString QgsPropertyDefinition::trString()
200 return QObject::tr(
"string " );
209 d =
new QgsPropertyPrivate();
250 return d->active == other.d->active
251 && d->type == other.d->type
252 && ( d->type !=
StaticProperty || d->staticValue == other.d->staticValue )
255 && ( ( !d->transformer && !other.d->transformer ) || ( d->transformer && other.d->transformer && d->transformer->toExpression( QString() ) == other.d->transformer->toExpression( QString() ) ) );
260 return ( !( ( *
this ) == other ) );
265 return static_cast< Type >( d->type );
283 d->staticValue =
value;
291 return d->staticValue;
298 d->fieldName =
field;
299 d->cachedFieldIdx = -1;
310 QgsProperty::operator bool()
const
312 return d->type != InvalidProperty;
319 d->expressionString = expression;
321 d->expressionPrepared =
false;
322 d->expressionIsInvalid =
false;
330 return d->expressionString;
348 exp = d->expressionString;
355 return d->transformer ? d->transformer->toExpression( exp ) : exp;
380 if ( !d->expression.prepare( &context ) )
382 d->expressionReferencedCols.clear();
383 d->expressionPrepared =
false;
384 d->expressionIsInvalid =
true;
388 d->expressionPrepared =
true;
389 d->expressionIsInvalid =
false;
390 d->expressionReferencedCols = d->expression.referencedColumns();
405 return QSet<QString>();
411 return QSet<QString>();
415 QSet< QString > fields;
416 if ( !d->fieldName.isEmpty() )
417 fields.insert( d->fieldName );
425 return d->expression.referencedColumns();
428 if ( d->expressionIsInvalid )
429 return QSet< QString >();
432 if ( !d->expressionPrepared && !
prepare( context ) )
434 d->expressionIsInvalid =
true;
435 return QSet< QString >();
438 return d->expressionReferencedCols;
442 return QSet<QString>();
447 QRegularExpression rx( QStringLiteral(
"^project_color\\('.*'\\)$" ) );
449 && rx.match( d->expressionString ).hasMatch();
452 QVariant QgsProperty::propertyValue(
const QgsExpressionContext &context,
const QVariant &defaultValue,
bool *ok )
const
466 return d->staticValue;
476 if ( d->cachedFieldIdx >= 0 )
483 if ( d->cachedFieldIdx < 0 )
493 if ( d->expressionIsInvalid )
496 if ( !d->expressionPrepared && !
prepare( context ) )
499 QVariant result = d->expression.evaluate( &context );
500 if ( !result.isNull() )
527 QVariant val = propertyValue( context, defaultValue, &valOk );
528 if ( !d->transformer && !valOk )
531 if ( d->transformer )
535 val = d->transformer->transform( context, val );
547 QVariant val =
value( context, defaultDateTime, &valOk );
549 if ( !valOk || val.isNull() )
553 return defaultDateTime;
557 if ( val.type() == QVariant::DateTime )
559 dateTime = val.value<QDateTime>();
563 dateTime = val.toDateTime();
566 if ( !dateTime.isValid() )
567 return defaultDateTime;
579 QVariant val =
value( context, defaultString, &valOk );
581 if ( !valOk || val.isNull() )
585 return defaultString;
591 return val.toString();
601 QVariant val =
value( context, defaultColor, &valOk );
603 if ( !valOk || val.isNull() )
607 if ( val.type() == QVariant::Color )
609 color = val.value<QColor>();
616 if ( !color.isValid() )
632 QVariant val =
value( context, defaultValue, &valOk );
634 if ( !valOk || val.isNull() )
637 bool convertOk =
false;
638 double dbl = val.toDouble( &convertOk );
655 QVariant val =
value( context, defaultValue, &valOk );
657 if ( !valOk || val.isNull() )
660 bool convertOk =
false;
661 int integer = val.toInt( &convertOk );
665 double dbl = val.toDouble( &convertOk );
670 return std::round( dbl );
691 QVariant val =
value( context, defaultValue, &valOk );
693 if ( !valOk || val.isNull() )
703 QVariantMap propertyMap;
705 propertyMap.insert( QStringLiteral(
"active" ), d->active );
706 propertyMap.insert( QStringLiteral(
"type" ), d->type );
712 propertyMap.insert( QStringLiteral(
"val" ), d->staticValue.toString() );
716 propertyMap.insert( QStringLiteral(
"field" ), d->fieldName );
720 propertyMap.insert( QStringLiteral(
"expression" ), d->expressionString );
727 if ( d->transformer )
730 transformer.insert( QStringLiteral(
"t" ), d->transformer->transformerType() );
731 transformer.insert( QStringLiteral(
"d" ), d->transformer->toVariant() );
733 propertyMap.insert( QStringLiteral(
"transformer" ),
transformer );
741 QVariantMap propertyMap =
property.toMap();
744 d->active = propertyMap.value( QStringLiteral(
"active" ) ).toBool();
745 d->type =
static_cast< Type >( propertyMap.value( QStringLiteral(
"type" ),
InvalidProperty ).toInt() );
750 d->staticValue = propertyMap.value( QStringLiteral(
"val" ) );
755 d->fieldName = propertyMap.value( QStringLiteral(
"field" ) ).toString();
756 if ( d->fieldName.isEmpty() )
761 d->expressionString = propertyMap.value( QStringLiteral(
"expression" ) ).toString();
762 if ( d->expressionString.isEmpty() )
766 d->expressionPrepared =
false;
767 d->expressionIsInvalid =
false;
768 d->expressionReferencedCols.clear();
777 delete d->transformer;
778 d->transformer =
nullptr;
781 QVariant transform = propertyMap.value( QStringLiteral(
"transformer" ) );
783 if ( transform.isValid() )
785 QVariantMap transformerMap = transform.toMap();
809 return d->transformer;
817 if ( d->transformer )
820 QString baseExpression;
828 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.
Class for parsing and evaluation of expressions (formerly called "search strings").
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)
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
bool isValid() const
Returns the validity of this feature.
QVariant attribute(const QString &name) const
Lookup attribute value from 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
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.
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
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)