35   if ( styles == mRowStyles )
 
   44   if ( mFieldStyles.value( fieldName ) == styles )
 
   47   mFieldStyles.insert( fieldName, styles );
 
   53   return mFieldStyles.value( fieldName );
 
   58   QDomElement stylesel = doc.createElement( QStringLiteral( 
"conditionalstyles" ) );
 
   59   QDomElement rowel = doc.createElement( QStringLiteral( 
"rowstyles" ) );
 
   60   const auto constMRowStyles = mRowStyles;
 
   63     style.writeXml( rowel, doc, context );
 
   66   stylesel.appendChild( rowel );
 
   68   QDomElement fieldsel = doc.createElement( QStringLiteral( 
"fieldstyles" ) );
 
   69   QHash<QString, QgsConditionalStyles>::const_iterator it = mFieldStyles.constBegin();
 
   70   for ( ; it != mFieldStyles.constEnd(); ++it )
 
   72     QDomElement fieldel = doc.createElement( QStringLiteral( 
"fieldstyle" ) );
 
   73     fieldel.setAttribute( QStringLiteral( 
"fieldname" ), it.key() );
 
   75     const auto constStyles = styles;
 
   78       style.writeXml( fieldel, doc, context );
 
   80     fieldsel.appendChild( fieldel );
 
   83   stylesel.appendChild( fieldsel );
 
   85   node.appendChild( stylesel );
 
   91   const QDomElement condel = node.firstChildElement( QStringLiteral( 
"conditionalstyles" ) );
 
   94   const QDomElement rowstylesel = condel.firstChildElement( QStringLiteral( 
"rowstyles" ) );
 
   95   QDomNodeList nodelist = rowstylesel.toElement().elementsByTagName( QStringLiteral( 
"style" ) );
 
   96   for ( 
int i = 0; i < nodelist.count(); i++ )
 
   98     const QDomElement styleElm = nodelist.at( i ).toElement();
 
  100     style.
readXml( styleElm, context );
 
  101     mRowStyles.append( style );
 
  104   const QDomElement fieldstylesel = condel.firstChildElement( QStringLiteral( 
"fieldstyles" ) );
 
  105   nodelist = fieldstylesel.toElement().elementsByTagName( QStringLiteral( 
"fieldstyle" ) );
 
  106   QList<QgsConditionalStyle> styles;
 
  107   for ( 
int i = 0; i < nodelist.count(); i++ )
 
  110     const QDomElement fieldel = nodelist.at( i ).toElement();
 
  111     const QString fieldName = fieldel.attribute( QStringLiteral( 
"fieldname" ) );
 
  112     const QDomNodeList stylenodelist = fieldel.toElement().elementsByTagName( QStringLiteral( 
"style" ) );
 
  113     styles.reserve( stylenodelist.count() );
 
  114     for ( 
int j = 0; j < stylenodelist.count(); j++ )
 
  116       const QDomElement styleElm = stylenodelist.at( j ).toElement();
 
  118       style.
readXml( styleElm, context );
 
  119       styles.append( style );
 
  121     mFieldStyles.insert( fieldName, styles );
 
  138   : mValid( other.mValid )
 
  139   , mName( other.mName )
 
  140   , mRule( other.mRule )
 
  141   , mFont( other.mFont )
 
  142   , mBackColor( other.mBackColor )
 
  143   , mTextColor( other.mTextColor )
 
  144   , mIcon( other.mIcon )
 
  147     mSymbol.reset( other.mSymbol->clone() );
 
  152   mValid = other.mValid;
 
  155   mBackColor = other.mBackColor;
 
  156   mTextColor = other.mTextColor;
 
  161     mSymbol.reset( other.mSymbol->clone() );
 
  172   if ( 
name().isEmpty() )
 
  175     return QStringLiteral( 
"%1 \n%2" ).arg( 
name(), 
rule() );
 
  183     mSymbol.reset( value->
clone() );
 
  196   return exp.
evaluate( &context ).toBool();
 
  201   QPixmap pixmap( size.isValid() ? size.width() : 64, size.isValid() ? size.height() : 32 );
 
  202   pixmap.fill( Qt::transparent );
 
  204   QPainter painter( &pixmap );
 
  207     painter.setBrush( mBackColor );
 
  209   QRect rect = QRect( 0, 0, pixmap.width(), pixmap.height() );
 
  210   painter.setPen( Qt::NoPen );
 
  211   painter.drawRect( rect );
 
  212   const QPixmap symbolIcon = 
icon();
 
  213   if ( !symbolIcon.isNull() )
 
  215     painter.drawPixmap( ( pixmap.width() / 3 - symbolIcon.width() ) / 2, ( pixmap.height() - symbolIcon.height() ) / 2, symbolIcon );
 
  219     painter.setPen( mTextColor );
 
  221     painter.setPen( Qt::black );
 
  223   painter.setRenderHint( QPainter::Antialiasing );
 
  224   painter.setFont( 
font() );
 
  225   rect = QRect( pixmap.width() / 3, 0, 2 * pixmap.width() / 3, pixmap.height() );
 
  226   painter.drawText( rect, Qt::AlignCenter, QStringLiteral( 
"abc\n123" ) );
 
  243   QList<QgsConditionalStyle> matchingstyles;
 
  244   const auto constStyles = styles;
 
  247     if ( style.matches( value, context ) )
 
  248       matchingstyles.append( style );
 
  250   return matchingstyles;
 
  255   const auto constStyles = styles;
 
  258     if ( style.matches( value, context ) )
 
  273     if ( s.backgroundColor().isValid() && s.backgroundColor().alpha() != 0 )
 
  275     if ( s.textColor().isValid() && s.textColor().alpha() != 0 )
 
  277     if ( 
auto *lSymbol = s.symbol() )
 
  285   QDomElement stylesel = doc.createElement( QStringLiteral( 
"style" ) );
 
  286   stylesel.setAttribute( QStringLiteral( 
"rule" ), mRule );
 
  287   stylesel.setAttribute( QStringLiteral( 
"name" ), mName );
 
  288   if ( mBackColor.isValid() )
 
  290     stylesel.setAttribute( QStringLiteral( 
"background_color" ), mBackColor.name() );
 
  291     stylesel.setAttribute( QStringLiteral( 
"background_color_alpha" ), mBackColor.alpha() );
 
  293   if ( mTextColor.isValid() )
 
  295     stylesel.setAttribute( QStringLiteral( 
"text_color" ), mTextColor.name() );
 
  296     stylesel.setAttribute( QStringLiteral( 
"text_color_alpha" ), mTextColor.alpha() );
 
  299   stylesel.appendChild( labelFontElem );
 
  303     stylesel.appendChild( symbolElm );
 
  305   node.appendChild( stylesel );
 
  311   return mValid == other.mValid
 
  312          && mName == other.mName
 
  313          && mRule == other.mRule
 
  314          && mFont == other.mFont
 
  315          && mBackColor == other.mBackColor
 
  316          && mTextColor == other.mTextColor
 
  317          && 
static_cast< bool >( mSymbol ) == 
static_cast< bool >( other.mSymbol )
 
  323   return !( *
this == other );
 
  328   const QDomElement styleElm = node.toElement();
 
  329   setRule( styleElm.attribute( QStringLiteral( 
"rule" ) ) );
 
  330   setName( styleElm.attribute( QStringLiteral( 
"name" ) ) );
 
  331   if ( styleElm.hasAttribute( QStringLiteral( 
"background_color" ) ) )
 
  333     QColor bColor = QColor( styleElm.attribute( QStringLiteral( 
"background_color" ) ) );
 
  334     if ( styleElm.hasAttribute( QStringLiteral( 
"background_color_alpha" ) ) )
 
  336       bColor.setAlpha( styleElm.attribute( QStringLiteral( 
"background_color_alpha" ) ).toInt() );
 
  338     if ( bColor.alpha() == 0 )
 
  347   if ( styleElm.hasAttribute( QStringLiteral( 
"text_color" ) ) )
 
  349     QColor tColor = QColor( styleElm.attribute( QStringLiteral( 
"text_color" ) ) );
 
  350     if ( styleElm.hasAttribute( QStringLiteral( 
"text_color_alpha" ) ) )
 
  352       tColor.setAlpha( styleElm.attribute( QStringLiteral( 
"text_color_alpha" ) ).toInt() );
 
  354     if ( tColor.alpha() == 0 )
 
  364   const QDomElement symbolElm = styleElm.firstChildElement( QStringLiteral( 
"symbol" ) );
 
  365   if ( !symbolElm.isNull() )
 
  367     QgsSymbol *
symbol = QgsSymbolLayerUtils::loadSymbol<QgsMarkerSymbol>( symbolElm, context );
 
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.
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.
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.
QgsSymbol * symbol() const
The symbol used to generate the icon for the style.
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.
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.
Class for parsing and evaluation of expressions (formerly called "search strings").
QVariant evaluate()
Evaluate the feature and return the result.
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.
The class is used as a container of context for various read/write operations on other objects.
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)
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.