@@ -58,13 +58,19 @@ QgsExpressionBuilderWidget::QgsExpressionBuilderWidget( QWidget *parent )
58
58
connect ( btnLoadAll, SIGNAL ( pressed () ), this , SLOT ( loadAllValues () ) );
59
59
connect ( btnLoadSample, SIGNAL ( pressed () ), this , SLOT ( loadSampleValues () ) );
60
60
61
- Q_FOREACH ( QPushButton* button, mOperatorsGroupBox ->findChildren <QPushButton *>() )
61
+ Q_FOREACH ( QPushButton* button, mOperatorsGroupBox ->findChildren <QPushButton *>() )
62
62
{
63
63
connect ( button, SIGNAL ( pressed () ), this , SLOT ( operatorButtonClicked () ) );
64
64
}
65
65
66
66
txtSearchEdit->setPlaceholderText ( tr ( " Search" ) );
67
67
68
+ mValuesModel = new QStringListModel ();
69
+ mProxyValues = new QSortFilterProxyModel ();
70
+ mProxyValues ->setSourceModel ( mValuesModel );
71
+ mValuesListView ->setModel ( mProxyValues );
72
+ txtSearchEditValues->setPlaceholderText ( tr ( " Search" ) );
73
+
68
74
QSettings settings;
69
75
splitter->restoreState ( settings.value ( " /windows/QgsExpressionBuilderWidget/splitter" ).toByteArray () );
70
76
functionsplit->restoreState ( settings.value ( " /windows/QgsExpressionBuilderWidget/functionsplitter" ).toByteArray () );
@@ -101,6 +107,8 @@ QgsExpressionBuilderWidget::~QgsExpressionBuilderWidget()
101
107
102
108
delete mModel ;
103
109
delete mProxyModel ;
110
+ delete mValuesModel ;
111
+ delete mProxyValues ;
104
112
}
105
113
106
114
void QgsExpressionBuilderWidget::setLayer ( QgsVectorLayer *layer )
@@ -115,25 +123,22 @@ void QgsExpressionBuilderWidget::setLayer( QgsVectorLayer *layer )
115
123
116
124
void QgsExpressionBuilderWidget::currentChanged ( const QModelIndex &index, const QModelIndex & )
117
125
{
126
+ txtSearchEditValues->setText ( QString ( " " ) );
127
+
118
128
// Get the item
119
129
QModelIndex idx = mProxyModel ->mapToSource ( index );
120
130
QgsExpressionItem* item = dynamic_cast <QgsExpressionItem*>( mModel ->itemFromIndex ( idx ) );
121
131
if ( !item )
122
132
return ;
123
133
124
- mValueListWidget ->clear ();
125
134
if ( item->getItemType () == QgsExpressionItem::Field && mFieldValues .contains ( item->text () ) )
126
135
{
127
136
const QStringList& values = mFieldValues [item->text ()];
128
- mValueListWidget ->setUpdatesEnabled ( false );
129
- mValueListWidget ->blockSignals ( true );
130
- mValueListWidget ->addItems ( values );
131
- mValueListWidget ->setUpdatesEnabled ( true );
132
- mValueListWidget ->blockSignals ( false );
137
+ mValuesModel ->setStringList ( values );
133
138
}
134
139
135
140
mLoadGroupBox ->setVisible ( item->getItemType () == QgsExpressionItem::Field && mLayer );
136
- mValueGroupBox ->setVisible (( item->getItemType () == QgsExpressionItem::Field && mLayer ) || mValueListWidget -> count () > 0 );
141
+ mValueGroupBox ->setVisible ( ( item->getItemType () == QgsExpressionItem::Field && mLayer ) || mValuesListView -> model ()-> rowCount () > 0 );
137
142
138
143
// Show the help for the current item.
139
144
QString help = loadFunctionHelp ( item );
@@ -188,7 +193,7 @@ void QgsExpressionBuilderWidget::updateFunctionFileList( QString path )
188
193
dir.setNameFilters ( QStringList () << " *.py" );
189
194
QStringList files = dir.entryList ( QDir::Files );
190
195
cmbFileNames->clear ();
191
- Q_FOREACH ( const QString& name, files )
196
+ Q_FOREACH ( const QString& name, files )
192
197
{
193
198
QFileInfo info ( mFunctionsPath + QDir::separator () + name );
194
199
if ( info.baseName () == " __init__" ) continue ;
@@ -292,7 +297,7 @@ void QgsExpressionBuilderWidget::loadFieldNames( const QgsFields& fields )
292
297
void QgsExpressionBuilderWidget::loadFieldsAndValues ( const QMap<QString, QStringList> &fieldValues )
293
298
{
294
299
QgsFields fields;
295
- Q_FOREACH ( const QString& fieldName, fieldValues.keys () )
300
+ Q_FOREACH ( const QString& fieldName, fieldValues.keys () )
296
301
{
297
302
fields.append ( QgsField ( fieldName ) );
298
303
}
@@ -308,20 +313,16 @@ void QgsExpressionBuilderWidget::fillFieldValues( const QString& fieldName, int
308
313
return ;
309
314
310
315
// TODO We should thread this so that we don't hold the user up if the layer is massive.
311
- mValueListWidget ->clear ();
312
316
313
317
int fieldIndex = mLayer ->fieldNameIndex ( fieldName );
314
318
315
319
if ( fieldIndex < 0 )
316
320
return ;
317
321
318
- mValueListWidget ->setUpdatesEnabled ( false );
319
- mValueListWidget ->blockSignals ( true );
320
-
321
322
QList<QVariant> values;
322
323
QStringList strValues;
323
324
mLayer ->uniqueValues ( fieldIndex, values, countLimit );
324
- Q_FOREACH ( const QVariant& value, values )
325
+ Q_FOREACH ( const QVariant& value, values )
325
326
{
326
327
QString strValue;
327
328
if ( value.isNull () )
@@ -330,13 +331,10 @@ void QgsExpressionBuilderWidget::fillFieldValues( const QString& fieldName, int
330
331
strValue = value.toString ();
331
332
else
332
333
strValue = " '" + value.toString ().replace ( " '" , " ''" ) + " '" ;
333
- mValueListWidget ->addItem ( strValue );
334
334
strValues.append ( strValue );
335
335
}
336
+ mValuesModel ->setStringList ( strValues );
336
337
mFieldValues [fieldName] = strValues;
337
-
338
- mValueListWidget ->setUpdatesEnabled ( true );
339
- mValueListWidget ->blockSignals ( false );
340
338
}
341
339
342
340
void QgsExpressionBuilderWidget::registerItem ( QString group,
@@ -417,7 +415,7 @@ void QgsExpressionBuilderWidget::loadRecent( QString key )
417
415
QSettings settings;
418
416
QString location = QString ( " /expressions/recent/%1" ).arg ( key );
419
417
QStringList expressions = settings.value ( location ).toStringList ();
420
- Q_FOREACH ( const QString& expression, expressions )
418
+ Q_FOREACH ( const QString& expression, expressions )
421
419
{
422
420
this ->registerItem ( name, expression, expression, expression );
423
421
}
@@ -598,7 +596,7 @@ QString QgsExpressionBuilderWidget::formatPreviewString( const QString& previewS
598
596
void QgsExpressionBuilderWidget::loadExpressionContext ()
599
597
{
600
598
QStringList variableNames = mExpressionContext .filteredVariableNames ();
601
- Q_FOREACH ( const QString& variable, variableNames )
599
+ Q_FOREACH ( const QString& variable, variableNames )
602
600
{
603
601
registerItem ( " Variables" , variable, " @" + variable + " " ,
604
602
QgsExpression::variableHelpText ( variable, true , mExpressionContext .variable ( variable ) ),
@@ -608,7 +606,7 @@ void QgsExpressionBuilderWidget::loadExpressionContext()
608
606
609
607
// Load the functions from the expression context
610
608
QStringList contextFunctions = mExpressionContext .functionNames ();
611
- Q_FOREACH ( const QString& functionName, contextFunctions )
609
+ Q_FOREACH ( const QString& functionName, contextFunctions )
612
610
{
613
611
QgsExpression::Function* func = mExpressionContext .function ( functionName );
614
612
QString name = func->name ();
@@ -629,6 +627,12 @@ void QgsExpressionBuilderWidget::on_txtSearchEdit_textChanged()
629
627
expressionTree->expandAll ();
630
628
}
631
629
630
+ void QgsExpressionBuilderWidget::on_txtSearchEditValues_textChanged ()
631
+ {
632
+ mProxyValues ->setFilterCaseSensitivity ( Qt::CaseInsensitive );
633
+ mProxyValues ->setFilterWildcard ( txtSearchEditValues->text () );
634
+ }
635
+
632
636
void QgsExpressionBuilderWidget::on_lblPreview_linkActivated ( QString link )
633
637
{
634
638
Q_UNUSED ( link );
@@ -638,10 +642,10 @@ void QgsExpressionBuilderWidget::on_lblPreview_linkActivated( QString link )
638
642
mv->exec ();
639
643
}
640
644
641
- void QgsExpressionBuilderWidget::on_mValueListWidget_itemDoubleClicked ( QListWidgetItem *item )
645
+ void QgsExpressionBuilderWidget::on_mValuesListView_doubleClicked ( const QModelIndex &index )
642
646
{
643
647
// Insert the item text or replace selected text
644
- txtExpressionString->insertText ( " " + item-> text () + " " );
648
+ txtExpressionString->insertText ( " " + index. data ( Qt::DisplayRole ). toString () + " " );
645
649
txtExpressionString->setFocus ();
646
650
}
647
651
0 commit comments