Skip to content

Commit e35c6b4

Browse files
committedAug 30, 2016
Use widget representValue to preview default expression results
Sponsored by DB Fahrwegdienste GmbH
1 parent 6d28eb5 commit e35c6b4

File tree

3 files changed

+124
-51
lines changed

3 files changed

+124
-51
lines changed
 

‎src/app/qgsattributetypedialog.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ QgsAttributeTypeDialog::QgsAttributeTypeDialog( QgsVectorLayer *vl, int fieldIdx
6969
isFieldEditableCheckBox->setEnabled( false );
7070
}
7171

72+
connect( mExpressionWidget, SIGNAL( expressionChanged( QString ) ), this, SLOT( defaultExpressionChanged() ) );
73+
7274
QSettings settings;
7375
restoreGeometry( settings.value( "/Windows/QgsAttributeTypeDialog/geometry" ).toByteArray() );
7476

@@ -158,6 +160,9 @@ void QgsAttributeTypeDialog::setWidgetType( const QString& type )
158160
QgsDebugMsg( "Oops, couldn't create editor widget config dialog..." );
159161
}
160162
}
163+
164+
//update default expression preview
165+
defaultExpressionChanged();
161166
}
162167

163168
void QgsAttributeTypeDialog::setWidgetConfig( const QgsEditorWidgetConfig& config )
@@ -231,3 +236,50 @@ void QgsAttributeTypeDialog::on_selectionListWidget_currentRowChanged( int index
231236

232237
setWidgetType( editType );
233238
}
239+
240+
void QgsAttributeTypeDialog::defaultExpressionChanged()
241+
{
242+
QString expression = mExpressionWidget->expression();
243+
if ( expression.isEmpty() )
244+
{
245+
mDefaultPreviewLabel->setText( QString() );
246+
return;
247+
}
248+
249+
QgsExpressionContext context = mLayer->createExpressionContext();
250+
251+
if ( !mPreviewFeature.isValid() )
252+
{
253+
// get first feature
254+
QgsFeatureIterator it = mLayer->getFeatures( QgsFeatureRequest().setLimit( 1 ) );
255+
it.nextFeature( mPreviewFeature );
256+
}
257+
258+
context.setFeature( mPreviewFeature );
259+
260+
QgsExpression exp = QgsExpression( expression );
261+
exp.prepare( &context );
262+
263+
if ( exp.hasParserError() )
264+
{
265+
mDefaultPreviewLabel->setText( "<i>" + exp.parserErrorString() + "</i>" );
266+
return;
267+
}
268+
269+
QVariant val = exp.evaluate( &context );
270+
if ( exp.hasEvalError() )
271+
{
272+
mDefaultPreviewLabel->setText( "<i>" + exp.evalErrorString() + "</i>" );
273+
return;
274+
}
275+
276+
QString previewText = val.toString();
277+
278+
QgsEditorWidgetFactory *factory = QgsEditorWidgetRegistry::instance()->factory( editorWidgetType() );
279+
if ( factory )
280+
{
281+
previewText = factory->representValue( mLayer, mFieldIdx, editorWidgetConfig(), QVariant(), val );
282+
}
283+
284+
mDefaultPreviewLabel->setText( "<i>" + previewText + "</i>" );
285+
}

‎src/app/qgsattributetypedialog.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "ui_qgsattributetypeedit.h"
2121

2222
#include "qgseditorconfigwidget.h"
23+
#include "qgsfeature.h"
2324

2425
class QDialog;
2526

@@ -122,6 +123,8 @@ class APP_EXPORT QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttribut
122123
*/
123124
void on_selectionListWidget_currentRowChanged( int index );
124125

126+
void defaultExpressionChanged();
127+
125128
private:
126129
QgsVectorLayer *mLayer;
127130
int mFieldIdx;
@@ -130,6 +133,8 @@ class APP_EXPORT QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttribut
130133

131134
//! Cached configuration dialog (lazy loaded)
132135
QMap< QString, QgsEditorConfigWidget* > mEditorConfigWidgets;
136+
137+
QgsFeature mPreviewFeature;
133138
};
134139

135140
#endif

‎src/ui/qgsattributetypeedit.ui

Lines changed: 67 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,51 +14,10 @@
1414
<string>Edit Widget Properties</string>
1515
</property>
1616
<layout class="QGridLayout" name="gridLayout">
17-
<item row="0" column="1">
18-
<widget class="QCheckBox" name="isFieldEditableCheckBox">
19-
<property name="text">
20-
<string>Editable</string>
21-
</property>
22-
<property name="checked">
23-
<bool>true</bool>
24-
</property>
25-
</widget>
26-
</item>
27-
<item row="1" column="1">
28-
<widget class="QCheckBox" name="labelOnTopCheckBox">
29-
<property name="text">
30-
<string>Label on top</string>
31-
</property>
32-
<property name="checked">
33-
<bool>false</bool>
34-
</property>
35-
</widget>
36-
</item>
37-
<item row="2" column="1">
38-
<layout class="QHBoxLayout" name="horizontalLayout_3">
39-
<item>
40-
<widget class="QLabel" name="label_3">
41-
<property name="text">
42-
<string>Default value</string>
43-
</property>
44-
</widget>
45-
</item>
46-
<item>
47-
<widget class="QgsExpressionLineEdit" name="mExpressionWidget" native="true">
48-
<property name="maximumSize">
49-
<size>
50-
<width>500</width>
51-
<height>16777215</height>
52-
</size>
53-
</property>
54-
<property name="focusPolicy">
55-
<enum>Qt::StrongFocus</enum>
56-
</property>
57-
</widget>
58-
</item>
59-
</layout>
17+
<item row="5" column="1">
18+
<widget class="QStackedWidget" name="stackedWidget"/>
6019
</item>
61-
<item row="3" column="1">
20+
<item row="4" column="1">
6221
<widget class="QgsCollapsibleGroupBox" name="groupBox">
6322
<property name="title">
6423
<string>Contraints</string>
@@ -112,10 +71,67 @@
11271
</layout>
11372
</widget>
11473
</item>
115-
<item row="4" column="1">
116-
<widget class="QStackedWidget" name="stackedWidget"/>
74+
<item row="0" column="1">
75+
<widget class="QCheckBox" name="isFieldEditableCheckBox">
76+
<property name="text">
77+
<string>Editable</string>
78+
</property>
79+
<property name="checked">
80+
<bool>true</bool>
81+
</property>
82+
</widget>
11783
</item>
118-
<item row="5" column="1">
84+
<item row="2" column="1">
85+
<widget class="QGroupBox" name="groupBox_2">
86+
<property name="title">
87+
<string>Defaults</string>
88+
</property>
89+
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,1">
90+
<item row="0" column="0">
91+
<widget class="QLabel" name="label_3">
92+
<property name="text">
93+
<string>Default value</string>
94+
</property>
95+
</widget>
96+
</item>
97+
<item row="1" column="0">
98+
<widget class="QLabel" name="label_4">
99+
<property name="text">
100+
<string>Preview</string>
101+
</property>
102+
</widget>
103+
</item>
104+
<item row="0" column="1">
105+
<widget class="QgsExpressionLineEdit" name="mExpressionWidget" native="true">
106+
<property name="focusPolicy">
107+
<enum>Qt::StrongFocus</enum>
108+
</property>
109+
</widget>
110+
</item>
111+
<item row="1" column="1">
112+
<widget class="QLabel" name="mDefaultPreviewLabel">
113+
<property name="text">
114+
<string/>
115+
</property>
116+
</widget>
117+
</item>
118+
</layout>
119+
</widget>
120+
</item>
121+
<item row="1" column="1">
122+
<widget class="QCheckBox" name="labelOnTopCheckBox">
123+
<property name="text">
124+
<string>Label on top</string>
125+
</property>
126+
<property name="checked">
127+
<bool>false</bool>
128+
</property>
129+
</widget>
130+
</item>
131+
<item row="0" column="0" rowspan="7">
132+
<widget class="QListWidget" name="selectionListWidget"/>
133+
</item>
134+
<item row="6" column="1">
119135
<widget class="QDialogButtonBox" name="buttonBox">
120136
<property name="orientation">
121137
<enum>Qt::Horizontal</enum>
@@ -125,9 +141,6 @@
125141
</property>
126142
</widget>
127143
</item>
128-
<item row="0" column="0" rowspan="6">
129-
<widget class="QListWidget" name="selectionListWidget"/>
130-
</item>
131144
</layout>
132145
</widget>
133146
<customwidgets>
@@ -154,7 +167,10 @@
154167
<tabstop>selectionListWidget</tabstop>
155168
<tabstop>isFieldEditableCheckBox</tabstop>
156169
<tabstop>labelOnTopCheckBox</tabstop>
157-
<tabstop>buttonBox</tabstop>
170+
<tabstop>mExpressionWidget</tabstop>
171+
<tabstop>notNullCheckBox</tabstop>
172+
<tabstop>constraintExpressionWidget</tabstop>
173+
<tabstop>leConstraintExpressionDescription</tabstop>
158174
</tabstops>
159175
<resources/>
160176
<connections>

0 commit comments

Comments
 (0)
Please sign in to comment.