26#include "moc_qgsconditionalstyle.cpp"
28using namespace Qt::StringLiterals;
43 hardConstraintFailureStyle.
setTextColor( QColor( 0, 0, 0 ) );
44 return hardConstraintFailureStyle;
51 softConstraintFailureStyle.
setTextColor( QColor( 0, 0, 0 ) );
52 return softConstraintFailureStyle;
69 if ( styles == mRowStyles )
78 if ( mFieldStyles.value( fieldName ) == styles )
81 mFieldStyles.insert( fieldName, styles );
87 return mFieldStyles.value( fieldName );
92 QDomElement stylesel = doc.createElement( u
"conditionalstyles"_s );
94 QDomElement rowel = doc.createElement( u
"rowstyles"_s );
95 const auto constMRowStyles = mRowStyles;
98 style.writeXml( rowel, doc, context );
100 stylesel.appendChild( rowel );
102 QDomElement fieldsel = doc.createElement( u
"fieldstyles"_s );
103 QHash<QString, QgsConditionalStyles>::const_iterator it = mFieldStyles.constBegin();
104 for ( ; it != mFieldStyles.constEnd(); ++it )
106 QDomElement fieldel = doc.createElement( u
"fieldstyle"_s );
107 fieldel.setAttribute( u
"fieldname"_s, it.key() );
109 const auto constStyles = styles;
112 style.writeXml( fieldel, doc, context );
114 fieldsel.appendChild( fieldel );
116 stylesel.appendChild( fieldsel );
118 node.appendChild( stylesel );
137 mFieldStyles.clear();
139 const QDomElement condel = node.firstChildElement( u
"conditionalstyles"_s );
141 const QDomElement rowstylesel = condel.firstChildElement( u
"rowstyles"_s );
142 QDomNodeList nodelist = rowstylesel.toElement().elementsByTagName( u
"style"_s );
143 for (
int i = 0; i < nodelist.count(); i++ )
145 const QDomElement styleElm = nodelist.at( i ).toElement();
147 style.
readXml( styleElm, context );
148 mRowStyles.append( style );
151 const QDomElement fieldstylesel = condel.firstChildElement( u
"fieldstyles"_s );
152 nodelist = fieldstylesel.toElement().elementsByTagName( u
"fieldstyle"_s );
153 QList<QgsConditionalStyle> styles;
154 for (
int i = 0; i < nodelist.count(); i++ )
157 const QDomElement fieldel = nodelist.at( i ).toElement();
158 const QString fieldName = fieldel.attribute( u
"fieldname"_s );
159 const QDomNodeList stylenodelist = fieldel.toElement().elementsByTagName( u
"style"_s );
160 styles.reserve( stylenodelist.count() );
161 for (
int j = 0; j < stylenodelist.count(); j++ )
163 const QDomElement styleElm = stylenodelist.at( j ).toElement();
165 style.
readXml( styleElm, context );
166 styles.append( style );
168 mFieldStyles.insert( fieldName, styles );
186 : mValid( other.mValid )
187 , mName( other.mName )
188 , mRule( other.mRule )
189 , mFont( other.mFont )
190 , mBackColor( other.mBackColor )
191 , mTextColor( other.mTextColor )
192 , mIcon( other.mIcon )
196 mSymbol.reset( other.mSymbol->clone() );
200 : mValid( other.mValid )
201 , mName( std::move( other.mName ) )
202 , mRule( std::move( other.mRule ) )
203 , mSymbol( std::move( other.mSymbol ) )
204 , mFont( std::move( other.mFont ) )
205 , mBackColor( std::move( other.mBackColor ) )
206 , mTextColor( std::move( other.mTextColor ) )
207 , mIcon( std::move( other.mIcon ) )
214 if ( &other ==
this )
218 mValid = other.mValid;
221 mBackColor = other.mBackColor;
222 mTextColor = other.mTextColor;
227 mSymbol.reset( other.mSymbol->clone() );
239 if ( &other ==
this )
242 mValid = other.mValid;
243 mRule = std::move( other.mRule );
244 mFont = std::move( other.mFont );
245 mBackColor = std::move( other.mBackColor );
246 mTextColor = std::move( other.mTextColor );
247 mIcon = std::move( other.mIcon );
248 mName = std::move( other.mName );
249 mSymbol = std::move( other.mSymbol );
255 if (
name().isEmpty() )
258 return u
"%1 \n%2"_s.arg(
name(),
rule() );
266 mSymbol.reset( value->
clone() );
279 return exp.
evaluate( &context ).toBool();
284 QPixmap pixmap( size.isValid() ? size.width() : 64, size.isValid() ? size.height() : 32 );
285 pixmap.fill( Qt::transparent );
287 QPainter painter( &pixmap );
290 painter.setBrush( mBackColor );
292 QRect rect = QRect( 0, 0, pixmap.width(), pixmap.height() );
293 painter.setPen( Qt::NoPen );
294 painter.drawRect( rect );
295 const QPixmap symbolIcon =
icon();
296 if ( !symbolIcon.isNull() )
298 painter.drawPixmap( ( pixmap.width() / 3 - symbolIcon.width() ) / 2, ( pixmap.height() - symbolIcon.height() ) / 2, symbolIcon );
302 painter.setPen( mTextColor );
304 painter.setPen( Qt::black );
306 painter.setRenderHint( QPainter::Antialiasing );
307 painter.setFont(
font() );
308 rect = QRect( pixmap.width() / 3, 0, 2 * pixmap.width() / 3, pixmap.height() );
309 painter.drawText( rect, Qt::AlignCenter, u
"abc\n123"_s );
326 QList<QgsConditionalStyle> matchingstyles;
327 const auto constStyles = styles;
330 if ( style.matches( value, context ) )
331 matchingstyles.append( style );
333 return matchingstyles;
338 const auto constStyles = styles;
341 if ( style.matches( value, context ) )
356 if ( s.backgroundColor().isValid() && s.backgroundColor().alpha() != 0 )
358 if ( s.textColor().isValid() && s.textColor().alpha() != 0 )
360 if (
auto *lSymbol = s.symbol() )
368 QDomElement stylesel = doc.createElement( u
"style"_s );
369 stylesel.setAttribute( u
"rule"_s, mRule );
370 stylesel.setAttribute( u
"name"_s, mName );
371 if ( mBackColor.isValid() )
373 stylesel.setAttribute( u
"background_color"_s, mBackColor.name() );
374 stylesel.setAttribute( u
"background_color_alpha"_s, mBackColor.alpha() );
376 if ( mTextColor.isValid() )
378 stylesel.setAttribute( u
"text_color"_s, mTextColor.name() );
379 stylesel.setAttribute( u
"text_color_alpha"_s, mTextColor.alpha() );
382 stylesel.appendChild( labelFontElem );
386 stylesel.appendChild( symbolElm );
388 node.appendChild( stylesel );
394 return mValid == other.mValid
395 && mName == other.mName
396 && mRule == other.mRule
397 && mFont == other.mFont
398 && mBackColor == other.mBackColor
399 && mTextColor == other.mTextColor
400 &&
static_cast< bool >( mSymbol ) ==
static_cast< bool >( other.mSymbol )
406 return !( *
this == other );
411 const QDomElement styleElm = node.toElement();
412 setRule( styleElm.attribute( u
"rule"_s ) );
413 setName( styleElm.attribute( u
"name"_s ) );
414 if ( styleElm.hasAttribute( u
"background_color"_s ) )
416 QColor bColor = QColor( styleElm.attribute( u
"background_color"_s ) );
417 if ( styleElm.hasAttribute( u
"background_color_alpha"_s ) )
419 bColor.setAlpha( styleElm.attribute( u
"background_color_alpha"_s ).toInt() );
421 if ( bColor.alpha() == 0 )
430 if ( styleElm.hasAttribute( u
"text_color"_s ) )
432 QColor tColor = QColor( styleElm.attribute( u
"text_color"_s ) );
433 if ( styleElm.hasAttribute( u
"text_color_alpha"_s ) )
435 tColor.setAlpha( styleElm.attribute( u
"text_color_alpha"_s ).toInt() );
437 if ( tColor.alpha() == 0 )
447 const QDomElement symbolElm = styleElm.firstChildElement( u
"symbol"_s );
448 if ( !symbolElm.isNull() )
void changed()
Emitted when the conditional styles are changed.
bool readXml(const QDomNode &node, const QgsReadWriteContext &context)
Reads the condition styles state from a DOM node.
QgsConditionalStyles rowStyles() const
Returns a list of row styles associated with the layer.
QgsConditionalLayerStyles(QObject *parent=nullptr)
Constructor for QgsConditionalLayerStyles, with the specified parent object.
QgsConditionalStyle constraintFailureStyles(QgsFieldConstraints::ConstraintStrength strength)
Returns a style associated to a constraint failure.
bool writeXml(QDomNode &node, QDomDocument &doc, const QgsReadWriteContext &context) const
Writes the condition styles state to a DOM node.
QList< QgsConditionalStyle > fieldStyles(const QString &fieldName) const
Returns the conditional styles set for the field with matching fieldName.
bool rulesNeedGeometry() const
Returns true if at least one rule needs geometry.
void setFieldStyles(const QString &fieldName, const QList< QgsConditionalStyle > &styles)
Set the conditional styles for a field, with the specified fieldName.
void setRowStyles(const QgsConditionalStyles &styles)
Sets the conditional styles that apply to full rows of data in the attribute table.
Conditional styling for a rule.
bool readXml(const QDomNode &node, const QgsReadWriteContext &context)
Reads vector conditional style specific state from layer Dom node.
bool operator==(const QgsConditionalStyle &other) const
QString displayText() const
The name of the style.
QString name() const
The name of the style.
static QgsConditionalStyle compressStyles(const QList< QgsConditionalStyle > &styles)
Compress a list of styles into a single style.
bool operator!=(const QgsConditionalStyle &other) const
void setSymbol(QgsSymbol *value)
Set the icon for the style.
void setName(const QString &value)
Set the name of the style.
QPixmap renderPreview(const QSize &size=QSize()) const
Render a preview icon of the rule, at the specified size.
bool matches(const QVariant &value, QgsExpressionContext &context) const
Check if the rule matches using the given value and feature.
QgsConditionalStyle & operator=(const QgsConditionalStyle &other)
void setTextColor(const QColor &value)
Set the text color for the style.
static QList< QgsConditionalStyle > matchingConditionalStyles(const QList< QgsConditionalStyle > &styles, const QVariant &value, QgsExpressionContext &context)
Find and return the matching styles for the value and feature.
void setRule(const QString &value)
Set the rule for the style.
void setBackgroundColor(const QColor &value)
Set the background color for the style.
void setFont(const QFont &value)
Set the font for the style.
QColor backgroundColor() const
The background color for style.
QColor textColor() const
The text color set for style.
QString rule() const
The condition rule set for the style.
QFont font() const
The font for the style.
bool writeXml(QDomNode &node, QDomDocument &doc, const QgsReadWriteContext &context) const
Write vector conditional style specific state from layer Dom node.
bool validTextColor() const
Check if the text color is valid for render.
QgsSymbol * symbol() const
The symbol used to generate the icon for the style.
bool isValid() const
isValid Check if this rule is valid.
static QgsConditionalStyle matchingConditionalStyle(const QList< QgsConditionalStyle > &styles, const QVariant &value, QgsExpressionContext &context)
Find and return the matching style for the value and feature.
QPixmap icon() const
The icon set for style generated from the set symbol.
bool validBackgroundColor() const
Check if the background color is valid for render.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsExpressionContextScope * lastScope()
Returns the last scope added to the context.
Handles parsing and evaluation of expressions (formerly called "search strings").
bool needsGeometry() const
Returns true if the expression uses feature geometry for some computation.
QVariant evaluate()
Evaluate the feature and return the result.
ConstraintStrength
Strength of constraints.
@ ConstraintStrengthNotSet
Constraint is not set.
@ ConstraintStrengthSoft
User is warned if constraint is violated but feature can still be accepted.
@ ConstraintStrengthHard
Constraint must be honored before feature can be accepted.
static bool setFromXmlChildNode(QFont &font, const QDomElement &element, const QString &childNode)
Sets the properties of a font to match the properties stored in an XML child node.
static QDomElement toXmlElement(const QFont &font, QDomDocument &document, const QString &elementName)
Returns a DOM element containing the properties of the font.
A container for the context for various read/write operations on objects.
static std::unique_ptr< QgsSymbol > loadSymbol(const QDomElement &element, const QgsReadWriteContext &context)
Attempts to load a symbol from a DOM element.
static QPixmap symbolPreviewPixmap(const QgsSymbol *symbol, QSize size, int padding=0, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *shape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a pixmap preview for a color ramp.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
static QString symbolProperties(QgsSymbol *symbol)
Returns a string representing the symbol.
Abstract base class for all rendered symbols.
virtual QgsSymbol * clone() const =0
Returns a deep copy of this symbol.
QList< QgsConditionalStyle > QgsConditionalStyles
Single variable definition for use within a QgsExpressionContextScope.