@@ -44,7 +44,7 @@ QgsFieldExpressionWidget::QgsFieldExpressionWidget( QWidget *parent )
44
44
layout->addWidget ( mButton );
45
45
46
46
connect ( mCombo ->lineEdit (), SIGNAL ( textEdited ( QString ) ), this , SLOT ( expressionEdited ( QString ) ) );
47
- connect ( mCombo , SIGNAL ( currentIndexChanged ( int ) ), this , SLOT ( indexChanged ( int ) ) );
47
+ connect ( mCombo , SIGNAL ( activated ( int ) ), this , SLOT ( currentFieldChanged ( int ) ) );
48
48
connect ( mButton , SIGNAL ( clicked () ), this , SLOT ( editExpression () ) );
49
49
}
50
50
@@ -58,15 +58,18 @@ void QgsFieldExpressionWidget::setGeomCalculator( const QgsDistanceArea &da )
58
58
mDa = QSharedPointer<const QgsDistanceArea>( new QgsDistanceArea ( da ) );
59
59
}
60
60
61
- QString QgsFieldExpressionWidget::currentField ( bool *isExpression )
61
+ QString QgsFieldExpressionWidget::currentField ( bool *isExpression , bool *isValid )
62
62
{
63
63
if ( isExpression )
64
64
{
65
65
*isExpression = false ;
66
66
}
67
+ if ( isValid )
68
+ {
69
+ *isValid = true ;
70
+ }
67
71
68
72
int i = mCombo ->currentIndex ();
69
-
70
73
const QModelIndex index = mFieldModel ->index ( i, 0 );
71
74
if ( !index .isValid () )
72
75
{
@@ -77,6 +80,10 @@ QString QgsFieldExpressionWidget::currentField( bool *isExpression )
77
80
{
78
81
*isExpression = mFieldModel ->data ( index , QgsFieldModel::IsExpressionRole ).toBool ();
79
82
}
83
+ if ( isValid )
84
+ {
85
+ *isValid = mFieldModel ->data ( index , QgsFieldModel::ExpressionValidityRole ).toBool ();
86
+ }
80
87
QString expression = mFieldModel ->data ( index , QgsFieldModel::ExpressionRole ).toString ();
81
88
return expression;
82
89
}
@@ -100,7 +107,7 @@ void QgsFieldExpressionWidget::setLayer( QgsVectorLayer *layer )
100
107
mFieldModel ->setLayer ( layer );
101
108
}
102
109
103
- void QgsFieldExpressionWidget::setField ( QString fieldName )
110
+ void QgsFieldExpressionWidget::setField ( const QString fieldName )
104
111
{
105
112
if ( fieldName.isEmpty () )
106
113
return ;
@@ -112,6 +119,8 @@ void QgsFieldExpressionWidget::setField( QString fieldName )
112
119
idx = mFieldModel ->setExpression ( fieldName );
113
120
}
114
121
mCombo ->setCurrentIndex ( idx.row () );
122
+
123
+ currentFieldChanged ();
115
124
}
116
125
117
126
void QgsFieldExpressionWidget::editExpression ()
@@ -136,39 +145,57 @@ void QgsFieldExpressionWidget::editExpression()
136
145
}
137
146
}
138
147
139
- void QgsFieldExpressionWidget::expressionEdited ( QString expression )
148
+ void QgsFieldExpressionWidget::expressionEdited ( const QString expression )
149
+ {
150
+ QModelIndex idx = mFieldModel ->setExpression ( expression );
151
+ mCombo ->setCurrentIndex ( idx.row () );
152
+ currentFieldChanged ();
153
+ }
154
+
155
+ void QgsFieldExpressionWidget::changeEvent ( QEvent* event )
140
156
{
141
- mFieldModel ->removeExpression ();
142
- setField ( expression );
157
+ if ( event->type () == QEvent::EnabledChange )
158
+ {
159
+ updateLineEditStyle ();
160
+ }
143
161
}
144
162
145
- void QgsFieldExpressionWidget::indexChanged ( int i )
163
+ void QgsFieldExpressionWidget::currentFieldChanged ( int i /* =0 */ )
146
164
{
147
165
Q_UNUSED ( i );
148
- bool isExpression;
149
- QString fieldName = currentField ( &isExpression );
150
- bool isValid = true ;
151
166
152
- QFont font = mCombo ->lineEdit ()->font ();
153
- font.setItalic ( isExpression );
154
- mCombo ->lineEdit ()->setFont ( font );
167
+ updateLineEditStyle ();
155
168
169
+ bool isExpression, isValid;
170
+ QString fieldName = currentField ( &isExpression, &isValid );
171
+ emit fieldChanged ( fieldName );
172
+ emit fieldChanged ( fieldName, isValid );
173
+ }
174
+
175
+ void QgsFieldExpressionWidget::updateLineEditStyle ()
176
+ {
156
177
QPalette palette;
157
- palette.setColor ( QPalette::Text, Qt::black );
158
- if ( isExpression )
178
+ if ( !isEnabled () )
159
179
{
160
- QModelIndex idx = mFieldModel ->indexFromName ( fieldName );
161
- if ( idx.isValid () )
180
+ palette.setColor ( QPalette::Text, Qt::gray );
181
+ }
182
+ else
183
+ {
184
+ bool isExpression, isValid;
185
+ currentField ( &isExpression, &isValid );
186
+
187
+ QFont font = mCombo ->lineEdit ()->font ();
188
+ font.setItalic ( isExpression );
189
+ mCombo ->lineEdit ()->setFont ( font );
190
+
191
+ if ( isExpression && !isValid )
192
+ {
193
+ palette.setColor ( QPalette::Text, Qt::red );
194
+ }
195
+ else
162
196
{
163
- isValid = mFieldModel ->data ( idx, QgsFieldModel::ExpressionValidityRole ).toBool ();
164
- if ( !isValid )
165
- {
166
- palette.setColor ( QPalette::Text, Qt::red );
167
- }
197
+ palette.setColor ( QPalette::Text, Qt::black );
168
198
}
169
199
}
170
200
mCombo ->lineEdit ()->setPalette ( palette );
171
-
172
- emit fieldChanged ( fieldName );
173
- emit fieldChanged ( fieldName, isValid );
174
201
}
0 commit comments