18#include "moc_qgsconditionalstyle.cpp" 
   38      hardConstraintFailureStyle.
setTextColor( QColor( 0, 0, 0 ) );
 
   39      return hardConstraintFailureStyle;
 
   46      softConstraintFailureStyle.
setTextColor( QColor( 0, 0, 0 ) );
 
   47      return softConstraintFailureStyle;
 
 
   64  if ( styles == mRowStyles )
 
 
   73  if ( mFieldStyles.value( fieldName ) == styles )
 
   76  mFieldStyles.insert( fieldName, styles );
 
 
   82  return mFieldStyles.value( fieldName );
 
 
   87  QDomElement stylesel = doc.createElement( QStringLiteral( 
"conditionalstyles" ) );
 
   89  QDomElement rowel = doc.createElement( QStringLiteral( 
"rowstyles" ) );
 
   90  const auto constMRowStyles = mRowStyles;
 
   93    style.writeXml( rowel, doc, context );
 
   95  stylesel.appendChild( rowel );
 
   97  QDomElement fieldsel = doc.createElement( QStringLiteral( 
"fieldstyles" ) );
 
   98  QHash<QString, QgsConditionalStyles>::const_iterator it = mFieldStyles.constBegin();
 
   99  for ( ; it != mFieldStyles.constEnd(); ++it )
 
  101    QDomElement fieldel = doc.createElement( QStringLiteral( 
"fieldstyle" ) );
 
  102    fieldel.setAttribute( QStringLiteral( 
"fieldname" ), it.key() );
 
  104    const auto constStyles = styles;
 
  107      style.writeXml( fieldel, doc, context );
 
  109    fieldsel.appendChild( fieldel );
 
  111  stylesel.appendChild( fieldsel );
 
  113  node.appendChild( stylesel );
 
 
  132  mFieldStyles.clear();
 
  134  const QDomElement condel = node.firstChildElement( QStringLiteral( 
"conditionalstyles" ) );
 
  136  const QDomElement rowstylesel = condel.firstChildElement( QStringLiteral( 
"rowstyles" ) );
 
  137  QDomNodeList nodelist = rowstylesel.toElement().elementsByTagName( QStringLiteral( 
"style" ) );
 
  138  for ( 
int i = 0; i < nodelist.count(); i++ )
 
  140    const QDomElement styleElm = nodelist.at( i ).toElement();
 
  142    style.
readXml( styleElm, context );
 
  143    mRowStyles.append( style );
 
  146  const QDomElement fieldstylesel = condel.firstChildElement( QStringLiteral( 
"fieldstyles" ) );
 
  147  nodelist = fieldstylesel.toElement().elementsByTagName( QStringLiteral( 
"fieldstyle" ) );
 
  148  QList<QgsConditionalStyle> styles;
 
  149  for ( 
int i = 0; i < nodelist.count(); i++ )
 
  152    const QDomElement fieldel = nodelist.at( i ).toElement();
 
  153    const QString fieldName = fieldel.attribute( QStringLiteral( 
"fieldname" ) );
 
  154    const QDomNodeList stylenodelist = fieldel.toElement().elementsByTagName( QStringLiteral( 
"style" ) );
 
  155    styles.reserve( stylenodelist.count() );
 
  156    for ( 
int j = 0; j < stylenodelist.count(); j++ )
 
  158      const QDomElement styleElm = stylenodelist.at( j ).toElement();
 
  160      style.
readXml( styleElm, context );
 
  161      styles.append( style );
 
  163    mFieldStyles.insert( fieldName, styles );
 
 
  180  : mValid( other.mValid )
 
  181  , mName( other.mName )
 
  182  , mRule( other.mRule )
 
  183  , mFont( other.mFont )
 
  184  , mBackColor( other.mBackColor )
 
  185  , mTextColor( other.mTextColor )
 
  186  , mIcon( other.mIcon )
 
  189    mSymbol.reset( other.mSymbol->clone() );
 
 
  194  mValid = other.mValid;
 
  197  mBackColor = other.mBackColor;
 
  198  mTextColor = other.mTextColor;
 
  203    mSymbol.reset( other.mSymbol->clone() );
 
 
  214  if ( 
name().isEmpty() )
 
  217    return QStringLiteral( 
"%1 \n%2" ).arg( 
name(), 
rule() );
 
 
  225    mSymbol.reset( value->
clone() );
 
 
  238  return exp.
evaluate( &context ).toBool();
 
 
  243  QPixmap pixmap( size.isValid() ? size.width() : 64, size.isValid() ? size.height() : 32 );
 
  244  pixmap.fill( Qt::transparent );
 
  246  QPainter painter( &pixmap );
 
  249    painter.setBrush( mBackColor );
 
  251  QRect rect = QRect( 0, 0, pixmap.width(), pixmap.height() );
 
  252  painter.setPen( Qt::NoPen );
 
  253  painter.drawRect( rect );
 
  254  const QPixmap symbolIcon = 
icon();
 
  255  if ( !symbolIcon.isNull() )
 
  257    painter.drawPixmap( ( pixmap.width() / 3 - symbolIcon.width() ) / 2, ( pixmap.height() - symbolIcon.height() ) / 2, symbolIcon );
 
  261    painter.setPen( mTextColor );
 
  263    painter.setPen( Qt::black );
 
  265  painter.setRenderHint( QPainter::Antialiasing );
 
  266  painter.setFont( 
font() );
 
  267  rect = QRect( pixmap.width() / 3, 0, 2 * pixmap.width() / 3, pixmap.height() );
 
  268  painter.drawText( rect, Qt::AlignCenter, QStringLiteral( 
"abc\n123" ) );
 
 
  285  QList<QgsConditionalStyle> matchingstyles;
 
  286  const auto constStyles = styles;
 
  289    if ( style.matches( value, context ) )
 
  290      matchingstyles.append( style );
 
  292  return matchingstyles;
 
 
  297  const auto constStyles = styles;
 
  300    if ( style.matches( value, context ) )
 
 
  315    if ( s.backgroundColor().isValid() && s.backgroundColor().alpha() != 0 )
 
  317    if ( s.textColor().isValid() && s.textColor().alpha() != 0 )
 
  319    if ( 
auto *lSymbol = s.symbol() )
 
 
  327  QDomElement stylesel = doc.createElement( QStringLiteral( 
"style" ) );
 
  328  stylesel.setAttribute( QStringLiteral( 
"rule" ), mRule );
 
  329  stylesel.setAttribute( QStringLiteral( 
"name" ), mName );
 
  330  if ( mBackColor.isValid() )
 
  332    stylesel.setAttribute( QStringLiteral( 
"background_color" ), mBackColor.name() );
 
  333    stylesel.setAttribute( QStringLiteral( 
"background_color_alpha" ), mBackColor.alpha() );
 
  335  if ( mTextColor.isValid() )
 
  337    stylesel.setAttribute( QStringLiteral( 
"text_color" ), mTextColor.name() );
 
  338    stylesel.setAttribute( QStringLiteral( 
"text_color_alpha" ), mTextColor.alpha() );
 
  341  stylesel.appendChild( labelFontElem );
 
  345    stylesel.appendChild( symbolElm );
 
  347  node.appendChild( stylesel );
 
 
  353  return mValid == other.mValid
 
  354         && mName == other.mName
 
  355         && mRule == other.mRule
 
  356         && mFont == other.mFont
 
  357         && mBackColor == other.mBackColor
 
  358         && mTextColor == other.mTextColor
 
  359         && 
static_cast< bool >( mSymbol ) == 
static_cast< bool >( other.mSymbol )
 
 
  365  return !( *
this == other );
 
 
  370  const QDomElement styleElm = node.toElement();
 
  371  setRule( styleElm.attribute( QStringLiteral( 
"rule" ) ) );
 
  372  setName( styleElm.attribute( QStringLiteral( 
"name" ) ) );
 
  373  if ( styleElm.hasAttribute( QStringLiteral( 
"background_color" ) ) )
 
  375    QColor bColor = QColor( styleElm.attribute( QStringLiteral( 
"background_color" ) ) );
 
  376    if ( styleElm.hasAttribute( QStringLiteral( 
"background_color_alpha" ) ) )
 
  378      bColor.setAlpha( styleElm.attribute( QStringLiteral( 
"background_color_alpha" ) ).toInt() );
 
  380    if ( bColor.alpha() == 0 )
 
  389  if ( styleElm.hasAttribute( QStringLiteral( 
"text_color" ) ) )
 
  391    QColor tColor = QColor( styleElm.attribute( QStringLiteral( 
"text_color" ) ) );
 
  392    if ( styleElm.hasAttribute( QStringLiteral( 
"text_color_alpha" ) ) )
 
  394      tColor.setAlpha( styleElm.attribute( QStringLiteral( 
"text_color_alpha" ) ).toInt() );
 
  396    if ( tColor.alpha() == 0 )
 
  406  const QDomElement symbolElm = styleElm.firstChildElement( QStringLiteral( 
"symbol" ) );
 
  407  if ( !symbolElm.isNull() )
 
  409    std::unique_ptr< 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.
 
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 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.