@@ -46,6 +46,7 @@ QgsDualView::QgsDualView( QWidget* parent )
46
46
// Connect layer list preview signals
47
47
connect ( mActionExpressionPreview , SIGNAL ( triggered () ), SLOT ( previewExpressionBuilder () ) );
48
48
connect ( mPreviewActionMapper , SIGNAL ( mapped ( QObject* ) ), SLOT ( previewColumnChanged ( QObject* ) ) );
49
+ connect ( mFeatureList , SIGNAL ( displayExpressionChanged (QString) ), this , SLOT ( previewExpressionChanged (QString) ) );
49
50
}
50
51
51
52
QgsDualView::~QgsDualView ()
@@ -76,6 +77,54 @@ void QgsDualView::init( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, QgsDista
76
77
77
78
void QgsDualView::columnBoxInit ()
78
79
{
80
+ // load fields
81
+ QList<QgsField> fields = mLayerCache ->layer ()->pendingFields ().toList ();
82
+
83
+ // default expression: saved value
84
+ QString displayExpression = mLayerCache ->layer ()->displayExpression ();
85
+
86
+ // if no display expression is saved: use display field instead
87
+ if ( displayExpression == " " )
88
+ {
89
+ displayExpression = mLayerCache ->layer ()->displayField ();
90
+ }
91
+
92
+ // if neither diaplay expression nor display field is saved...
93
+ if ( displayExpression == " " )
94
+ {
95
+ QgsAttributeList pkAttrs = mLayerCache ->layer ()->pendingPkAttributesList ();
96
+
97
+ if ( pkAttrs.size () > 0 )
98
+ {
99
+ // ... If there are primary key(s) defined
100
+ QStringList pkFields;
101
+
102
+ foreach ( int attr, pkAttrs )
103
+ {
104
+ pkFields.append ( " \" " + fields[attr].name () + " \" " );
105
+ }
106
+
107
+ displayExpression = pkFields.join ( " ||', '||" );
108
+ }
109
+ else if ( fields.size () > 0 )
110
+ {
111
+ // ... concat all fields
112
+ QStringList fieldNames;
113
+ foreach ( QgsField field, fields )
114
+ {
115
+ fieldNames.append ( " \" " + field.name () + " \" " );
116
+ }
117
+
118
+ displayExpression = fieldNames.join ( " ||', '||" );
119
+ }
120
+ else
121
+ {
122
+ // ... there isn't really much to display
123
+ displayExpression = " [Please define preview text]" ;
124
+ }
125
+ }
126
+
127
+ // now initialise the menu
79
128
QList< QAction* > previewActions = mFeatureListPreviewButton ->actions ();
80
129
foreach ( QAction* a, previewActions )
81
130
{
@@ -89,8 +138,6 @@ void QgsDualView::columnBoxInit()
89
138
mFeatureListPreviewButton ->addAction ( mActionExpressionPreview );
90
139
mFeatureListPreviewButton ->addAction ( mActionPreviewColumnsMenu );
91
140
92
- QList<QgsField> fields = mLayerCache ->layer ()->pendingFields ().toList ();
93
-
94
141
foreach ( const QgsField field, fields )
95
142
{
96
143
if ( mLayerCache ->layer ()->editType ( mLayerCache ->layer ()->fieldNameIndex ( field.name () ) ) != QgsVectorLayer::Hidden )
@@ -104,45 +151,18 @@ void QgsDualView::columnBoxInit()
104
151
connect ( previewAction, SIGNAL ( triggered () ), mPreviewActionMapper , SLOT ( map () ) );
105
152
mPreviewColumnsMenu ->addAction ( previewAction );
106
153
107
- if ( text == mLayerCache -> layer ()-> displayField () )
154
+ if ( text == displayExpression )
108
155
{
109
156
mFeatureListPreviewButton ->setDefaultAction ( previewAction );
110
157
}
111
158
}
112
159
}
113
160
114
- // Most likely no displayField is defined
115
- // Join primary key fields
161
+ // If there is no single field found as preview
116
162
if ( !mFeatureListPreviewButton ->defaultAction () )
117
163
{
164
+ mFeatureList ->setDisplayExpression ( displayExpression );
118
165
mFeatureListPreviewButton ->setDefaultAction ( mActionExpressionPreview );
119
- QgsAttributeList pkAttrs = mLayerCache ->layer ()->pendingPkAttributesList ();
120
- // If there is a primary key defined
121
- if ( pkAttrs.size () > 0 )
122
- {
123
- QStringList pkFields;
124
-
125
- foreach ( int attr, pkAttrs )
126
- {
127
- pkFields.append ( " \" " + fields[attr].name () + " \" " );
128
- }
129
-
130
- mFeatureList ->setDisplayExpression ( pkFields.join ( " ||', '||" ) );
131
- }
132
- else if ( fields.size () > 0 )
133
- {
134
- QStringList fieldNames;
135
- foreach ( QgsField field, fields )
136
- {
137
- fieldNames.append ( " \" " + field.name () + " \" " );
138
- }
139
-
140
- mFeatureList ->setDisplayExpression ( fieldNames.join ( " ||', '||" ) );
141
- }
142
- else
143
- {
144
- mFeatureList ->setDisplayExpression ( " [Please define preview text]" );
145
- }
146
166
}
147
167
else
148
168
{
@@ -193,6 +213,7 @@ void QgsDualView::initModels( QgsMapCanvas* mapCanvas )
193
213
mFilterModel = new QgsAttributeTableFilterModel ( mapCanvas, mMasterModel , mMasterModel );
194
214
195
215
connect ( mFilterModel , SIGNAL ( filterInvalidated () ), this , SIGNAL ( filterChanged () ) );
216
+ connect ( mFeatureList , SIGNAL ( displayExpressionChanged (QString) ), this , SIGNAL ( displayExpressionChanged (QString) ) );
196
217
197
218
mFeatureListModel = new QgsFeatureListModel ( mFilterModel , mFilterModel );
198
219
}
@@ -275,9 +296,11 @@ void QgsDualView::previewColumnChanged( QObject* action )
275
296
.arg ( mFeatureList ->parserErrorString () )
276
297
);
277
298
}
278
-
279
- mFeatureListPreviewButton ->setDefaultAction ( previewAction );
280
- mFeatureListPreviewButton ->setPopupMode ( QToolButton::InstantPopup );
299
+ else
300
+ {
301
+ mFeatureListPreviewButton ->setDefaultAction ( previewAction );
302
+ mFeatureListPreviewButton ->setPopupMode ( QToolButton::InstantPopup );
303
+ }
281
304
}
282
305
283
306
Q_ASSERT ( previewAction );
@@ -328,6 +351,11 @@ void QgsDualView::viewWillShowContextMenu( QMenu* menu, QModelIndex atIndex )
328
351
menu->addAction ( tr ( " Open form" ), a, SLOT ( featureForm () ) );
329
352
}
330
353
354
+ void QgsDualView::previewExpressionChanged ( const QString expression )
355
+ {
356
+ mLayerCache ->layer ()->setDisplayExpression ( expression );
357
+ }
358
+
331
359
void QgsDualView::setFilteredFeatures ( QgsFeatureIds filteredFeatures )
332
360
{
333
361
mFilterModel ->setFilteredFeatures ( filteredFeatures );
0 commit comments