Skip to content

Commit 323977f

Browse files
committedAug 21, 2015
Add full row styles
1 parent bbf2fe8 commit 323977f

11 files changed

+429
-288
lines changed
 

‎src/core/qgsconditionalstyle.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,43 @@ QPixmap QgsConditionalStyle::renderPreview()
109109
return pixmap;
110110
}
111111

112+
QList<QgsConditionalStyle> QgsConditionalStyle::matchingConditionalStyles( QList<QgsConditionalStyle> styles, QVariant value, QgsFeature *feature )
113+
{
114+
QList<QgsConditionalStyle> matchingstyles;
115+
foreach ( QgsConditionalStyle style, styles )
116+
{
117+
if ( style.matches( value, feature ) )
118+
matchingstyles.append( style );
119+
}
120+
return matchingstyles;
121+
}
122+
123+
QgsConditionalStyle QgsConditionalStyle::matchingConditionalStyle( QList<QgsConditionalStyle> styles, QVariant value, QgsFeature *feature )
124+
{
125+
foreach ( QgsConditionalStyle style, styles )
126+
{
127+
if ( style.matches( value, feature ) )
128+
return style;
129+
}
130+
return QgsConditionalStyle();
131+
}
132+
133+
QgsConditionalStyle QgsConditionalStyle::stackStyles( QList<QgsConditionalStyle> styles )
134+
{
135+
QgsConditionalStyle style;
136+
foreach ( QgsConditionalStyle s, styles )
137+
{
138+
style.setFont( s.font() );
139+
if ( s.backgroundColor().isValid() && s.backgroundColor().alpha() != 0 )
140+
style.setBackgroundColor( s.backgroundColor() );
141+
if ( s.textColor().isValid() && s.textColor().alpha() != 0 )
142+
style.setTextColor( s.textColor() );
143+
if ( s.symbol() )
144+
style.setSymbol( s.symbol() );
145+
}
146+
return style;
147+
}
148+
112149
bool QgsConditionalStyle::writeXml( QDomNode &node, QDomDocument &doc )
113150
{
114151
QDomElement stylesel = doc.createElement( "style" );

‎src/core/qgsconditionalstyle.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,26 @@ class CORE_EXPORT QgsConditionalStyle
111111
*/
112112
bool isValid() const { return mValid; }
113113

114+
/**
115+
* @brief Find and return the matching styles for the value and feature.
116+
* If no match is found a invalid QgsCondtionalStyle is return.
117+
*
118+
* @return A condtional style that matches the value and feature.
119+
* Check with QgsCondtionalStyle::isValid()
120+
*/
121+
static QList<QgsConditionalStyle> matchingConditionalStyles( QList<QgsConditionalStyle> styles, QVariant value, QgsFeature* feature );
122+
123+
/**
124+
* @brief Find and return the matching style for the value and feature.
125+
* If no match is found a invalid QgsCondtionalStyle is return.
126+
*
127+
* @return A condtional style that matches the value and feature.
128+
* Check with QgsCondtionalStyle::isValid()
129+
*/
130+
static QgsConditionalStyle matchingConditionalStyle( QList<QgsConditionalStyle> styles, QVariant value, QgsFeature* feature );
131+
132+
static QgsConditionalStyle stackStyles( QList<QgsConditionalStyle> styles );
133+
114134
/** Reads vector conditional style specific state from layer Dom node.
115135
*/
116136
virtual bool readXml( const QDomNode& node );
@@ -119,6 +139,7 @@ class CORE_EXPORT QgsConditionalStyle
119139
*/
120140
virtual bool writeXml( QDomNode & node, QDomDocument & doc );
121141

142+
122143
private:
123144

124145
bool mValid;

‎src/core/qgsfielduiproperties.cpp

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,11 @@ void QgsFieldUIProperties::setConditionalStyles( QList<QgsConditionalStyle> styl
1313
mStyles = styles;
1414
}
1515

16-
QList<QgsConditionalStyle> QgsFieldUIProperties::getConditionalStyles()
16+
QList<QgsConditionalStyle> QgsFieldUIProperties::conditionalStyles()
1717
{
1818
return mStyles;
1919
}
2020

21-
QList<QgsConditionalStyle> QgsFieldUIProperties::matchingConditionalStyles( QVariant value, QgsFeature *feature )
22-
{
23-
QList<QgsConditionalStyle> styles;
24-
foreach ( QgsConditionalStyle style, mStyles )
25-
{
26-
if ( style.matches( value, feature ) )
27-
styles.append( style );
28-
}
29-
return styles;
30-
}
31-
32-
QgsConditionalStyle QgsFieldUIProperties::matchingConditionalStyle( QVariant value, QgsFeature *feature )
33-
{
34-
foreach ( QgsConditionalStyle style, mStyles )
35-
{
36-
if ( style.matches( value, feature ) )
37-
return style;
38-
}
39-
return QgsConditionalStyle();
40-
}
4121

4222
bool QgsFieldUIProperties::writeXml( QDomNode &node, QDomDocument &doc )
4323
{

‎src/core/qgsfielduiproperties.h

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,7 @@ class CORE_EXPORT QgsFieldUIProperties
3030
* @brief Returns the condtional styles set for the field UI properties
3131
* @return A list of condtional styles that have been set.
3232
*/
33-
QList<QgsConditionalStyle> getConditionalStyles();
34-
35-
/**
36-
* @brief Find and return the matching styles for the value and feature.
37-
* If no match is found a invalid QgsCondtionalStyle is return.
38-
*
39-
* @return A condtional style that matches the value and feature.
40-
* Check with QgsCondtionalStyle::isValid()
41-
*/
42-
QList<QgsConditionalStyle> matchingConditionalStyles( QVariant value, QgsFeature* feature );
43-
44-
/**
45-
* @brief Find and return the matching style for the value and feature.
46-
* If no match is found a invalid QgsCondtionalStyle is return.
47-
*
48-
* @return A condtional style that matches the value and feature.
49-
* Check with QgsCondtionalStyle::isValid()
50-
*/
51-
QgsConditionalStyle matchingConditionalStyle( QVariant value, QgsFeature* feature );
33+
QList<QgsConditionalStyle> conditionalStyles();
5234

5335
/** Reads field ui properties specific state from Dom node.
5436
*/

‎src/core/qgsvectorlayer.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2038,6 +2038,16 @@ QgsFieldUIProperties QgsVectorLayer::fieldUIProperties( QString fieldName )
20382038
return QgsFieldUIProperties();
20392039
}
20402040

2041+
QList<QgsConditionalStyle> QgsVectorLayer::rowStyles()
2042+
{
2043+
return mRowStyles;
2044+
}
2045+
2046+
void QgsVectorLayer::setRowStyles( QList<QgsConditionalStyle> styles )
2047+
{
2048+
mRowStyles = styles;
2049+
}
2050+
20412051
void QgsVectorLayer::setFieldUIProperties( QString fieldName, QgsFieldUIProperties props )
20422052
{
20432053
mFieldProperties.insert( fieldName, props );

‎src/core/qgsvectorlayer.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
#include "qgis.h"
2929
#include "qgsmaplayer.h"
30+
#include "qgsconditionalstyle.h"
3031
#include "qgsfeature.h"
3132
#include "qgsfeatureiterator.h"
3233
#include "qgseditorwidgetconfig.h"
@@ -1764,6 +1765,16 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
17641765
*/
17651766
QgsFieldUIProperties fieldUIProperties( QString fieldName );
17661767

1768+
QList<QgsConditionalStyle> rowStyles();
1769+
1770+
/**
1771+
* @brief Set the conditional styles that apply to full rows of data in the attribute table.
1772+
* Each row will check be checked against each rule.
1773+
* @param styles The styles to assign to all the rows
1774+
* @note added in QGIS 2.12
1775+
*/
1776+
void setRowStyles( QList<QgsConditionalStyle> styles );
1777+
17671778
/**
17681779
* @brief Set the the field UI properties for a given field.
17691780
* @param fieldName The field name.
@@ -2026,6 +2037,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
20262037
private: // Private attributes
20272038

20282039
QHash<QString, QgsFieldUIProperties> mFieldProperties;
2040+
QList<QgsConditionalStyle> mRowStyles;
20292041

20302042
/** Pointer to data provider derived from the abastract base class QgsDataProvider */
20312043
QgsVectorDataProvider *mDataProvider;

‎src/gui/attributetable/qgsattributetablemodel.cpp

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -583,19 +583,38 @@ QVariant QgsAttributeTableModel::data( const QModelIndex &index, int role ) cons
583583
return mWidgetFactories[ index.column()]->representValue( layer(), fieldId, mWidgetConfigs[ index.column()], mAttributeWidgetCaches[ index.column()], val );
584584
}
585585

586-
QgsFieldUIProperties props = layer()->fieldUIProperties( field.name() );
587-
QList<QgsConditionalStyle> styles = props.matchingConditionalStyles( val, &mFeat );
588-
QgsConditionalStyle style;
589-
foreach ( QgsConditionalStyle s, styles )
590-
{
591-
style.setFont( s.font() );
592-
if ( s.backgroundColor().isValid() && s.backgroundColor().alpha() != 0 )
593-
style.setBackgroundColor( s.backgroundColor() );
594-
if ( s.textColor().isValid() && s.textColor().alpha() != 0 )
595-
style.setTextColor( s.textColor() );
596-
if ( s.symbol() )
597-
style.setSymbol( s.symbol() );
586+
QList<QgsConditionalStyle> styles;
587+
if ( mRowStylesMap.contains( index.row() ) )
588+
{
589+
styles = mRowStylesMap[index.row()];
598590
}
591+
else
592+
{
593+
styles = QgsConditionalStyle::matchingConditionalStyles( layer()->rowStyles(), QVariant(), &mFeat );
594+
mRowStylesMap.insert( index.row(), styles );
595+
596+
}
597+
QgsConditionalStyle style = QgsConditionalStyle::stackStyles( styles );
598+
// TODO Extract me out
599+
foreach ( QgsConditionalStyle style, styles )
600+
{
601+
if ( style.isValid() )
602+
{
603+
if ( role == Qt::BackgroundColorRole && style.backgroundColor().isValid() )
604+
return style.backgroundColor();
605+
if ( role == Qt::TextColorRole && style.textColor().isValid() )
606+
return style.textColor();
607+
if ( role == Qt::DecorationRole )
608+
return style.icon();
609+
if ( role == Qt::FontRole )
610+
return style.font();
611+
}
612+
613+
}
614+
615+
QgsFieldUIProperties props = layer()->fieldUIProperties( field.name() );
616+
styles = QgsConditionalStyle::matchingConditionalStyles( props.conditionalStyles(), val, &mFeat );
617+
style = QgsConditionalStyle::stackStyles( styles );
599618

600619
if ( style.isValid() )
601620
{

‎src/gui/attributetable/qgsattributetablemodel.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ class GUI_EXPORT QgsAttributeTableModel: public QAbstractTableModel
299299

300300
QHash<QgsFeatureId, int> mIdRowMap;
301301
QHash<int, QgsFeatureId> mRowIdMap;
302+
mutable QHash<int, QList<QgsConditionalStyle>> mRowStylesMap;
302303

303304
/**
304305
* Gets mFieldCount, mAttributes and mValueMaps

‎src/gui/attributetable/qgsfieldconditionalformatwidget.cpp

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ QgsFieldConditionalFormatWidget::QgsFieldConditionalFormatWidget( QWidget *paren
1414
setupUi( this );
1515
mDeleteButton->hide();
1616
connect( mFieldCombo, SIGNAL( fieldChanged( QString ) ), SLOT( fieldChanged( QString ) ) );
17+
connect( fieldRadio, SIGNAL( clicked() ), SLOT( reloadStyles() ) );
18+
connect( rowRadio, SIGNAL( clicked() ), SLOT( reloadStyles() ) );
1719
connect( mNewButton, SIGNAL( clicked() ), SLOT( addNewRule() ) );
1820
connect( mSaveRule, SIGNAL( clicked() ), SLOT( saveRule() ) );
1921
connect( mCancelButton, SIGNAL( clicked() ), SLOT( cancelRule() ) );
@@ -73,8 +75,7 @@ void QgsFieldConditionalFormatWidget::setLayer( QgsVectorLayer *theLayer )
7375

7476
void QgsFieldConditionalFormatWidget::ruleClicked( QModelIndex index )
7577
{
76-
QgsFieldUIProperties props = mLayer->fieldUIProperties( mFieldCombo->currentField() );
77-
QList<QgsConditionalStyle> styles = props.getConditionalStyles();
78+
QList<QgsConditionalStyle> styles = getStyles();
7879
QgsConditionalStyle style = styles.at( index.row() );
7980
editStyle( index.row(), style );
8081
}
@@ -116,13 +117,36 @@ void QgsFieldConditionalFormatWidget::editStyle( int editIndex, QgsConditionalSt
116117
mFontFamilyCmbBx->setFont( font );
117118
}
118119

120+
QList<QgsConditionalStyle> QgsFieldConditionalFormatWidget::getStyles()
121+
{
122+
QList<QgsConditionalStyle> styles;
123+
if ( fieldRadio->isChecked() )
124+
{
125+
QgsFieldUIProperties props = mLayer->fieldUIProperties( mFieldCombo->currentField() );
126+
styles = props.conditionalStyles();
127+
}
128+
if ( rowRadio->isChecked() )
129+
{
130+
styles = mLayer->rowStyles();
131+
}
132+
return styles;
133+
}
134+
119135
void QgsFieldConditionalFormatWidget::deleteRule()
120136
{
121-
QgsFieldUIProperties props = mLayer->fieldUIProperties( mFieldCombo->currentField() );
122-
QList<QgsConditionalStyle> styles = props.getConditionalStyles();
137+
QList<QgsConditionalStyle> styles = getStyles();
123138
styles.removeAt( mEditIndex );
124-
props.setConditionalStyles( styles );
125-
mLayer->setFieldUIProperties( mFieldCombo->currentField(), props );
139+
if ( fieldRadio->isChecked() )
140+
{
141+
QgsFieldUIProperties props = mLayer->fieldUIProperties( mFieldCombo->currentField() );
142+
props.setConditionalStyles( styles );
143+
mLayer->setFieldUIProperties( mFieldCombo->currentField(), props );
144+
}
145+
if ( rowRadio->isChecked() )
146+
{
147+
mLayer->setRowStyles( styles );
148+
}
149+
126150
pages->setCurrentIndex( 0 );
127151
reloadStyles();
128152
emit rulesUpdated( mFieldCombo->currentField() );
@@ -144,7 +168,11 @@ void QgsFieldConditionalFormatWidget::addNewRule()
144168
void QgsFieldConditionalFormatWidget::reset()
145169
{
146170
mSymbol = 0;
147-
mRuleEdit->setText( "@value " );
171+
mRuleEdit->clear();
172+
if ( fieldRadio->isChecked() )
173+
{
174+
mRuleEdit->setText( "@value " );
175+
}
148176
btnBackgroundColor->setColor( QColor() );
149177
btnTextColor->setColor( QColor() );
150178
mDefault1->toggle();
@@ -162,8 +190,17 @@ void QgsFieldConditionalFormatWidget::reset()
162190

163191
void QgsFieldConditionalFormatWidget::saveRule()
164192
{
165-
QgsFieldUIProperties props = mLayer->fieldUIProperties( mFieldCombo->currentField() );
166-
QList<QgsConditionalStyle> styles = props.getConditionalStyles();
193+
QList<QgsConditionalStyle> styles;
194+
if ( fieldRadio->isChecked() )
195+
{
196+
QgsFieldUIProperties props = mLayer->fieldUIProperties( mFieldCombo->currentField() );
197+
styles = props.conditionalStyles();
198+
}
199+
if ( rowRadio->isChecked() )
200+
{
201+
styles = mLayer->rowStyles();
202+
}
203+
167204
QgsConditionalStyle style = QgsConditionalStyle();
168205

169206
style.setRule( mRuleEdit->text() );
@@ -195,8 +232,16 @@ void QgsFieldConditionalFormatWidget::saveRule()
195232
{
196233
styles.append( style );
197234
}
198-
props.setConditionalStyles( styles );
199-
mLayer->setFieldUIProperties( mFieldCombo->currentField(), props );
235+
if ( fieldRadio->isChecked() )
236+
{
237+
QgsFieldUIProperties props = QgsFieldUIProperties();
238+
props.setConditionalStyles( styles );
239+
mLayer->setFieldUIProperties( mFieldCombo->currentField(), props );
240+
}
241+
if ( rowRadio->isChecked() )
242+
{
243+
mLayer->setRowStyles( styles );
244+
}
200245
pages->setCurrentIndex( 0 );
201246
reloadStyles();
202247
emit rulesUpdated( mFieldCombo->currentField() );
@@ -206,9 +251,8 @@ void QgsFieldConditionalFormatWidget::saveRule()
206251
void QgsFieldConditionalFormatWidget::reloadStyles()
207252
{
208253
mModel->clear();
209-
QgsFieldUIProperties props = mLayer->fieldUIProperties( mFieldCombo->currentField() );
210-
QList<QgsConditionalStyle> styles = props.getConditionalStyles();
211-
foreach ( QgsConditionalStyle style, styles )
254+
255+
foreach ( QgsConditionalStyle style, getStyles() )
212256
{
213257
QStandardItem* item = new QStandardItem( style.rule() );
214258
item->setIcon( QIcon( style.renderPreview() ) );

‎src/gui/attributetable/qgsfieldconditionalformatwidget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ class GUI_EXPORT QgsFieldConditionalFormatWidget : public QWidget, private Ui::Q
7676
QStandardItemModel* mModel;
7777
QgsSymbolV2* mSymbol;
7878

79+
QList<QgsConditionalStyle> getStyles();
80+
7981
private slots:
8082
void setExpression();
8183
void updateIcon();

‎src/ui/qgsfieldconditionalformatwidget.ui

Lines changed: 255 additions & 222 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.