Skip to content

Commit 440926b

Browse files
committed
Sort functions and variables in expression builder
1 parent 85bda6c commit 440926b

File tree

4 files changed

+43
-4
lines changed

4 files changed

+43
-4
lines changed

python/gui/qgsexpressionbuilderwidget.sip

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ class QgsExpressionItemSearchProxy : QSortFilterProxyModel
1212
QgsExpressionItemSearchProxy();
1313

1414
bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const;
15+
16+
protected:
17+
18+
bool lessThan( const QModelIndex &left, const QModelIndex &right ) const;
1519
};
1620

1721
/** An expression item that can be used in the QgsExpressionBuilderWidget tree.
@@ -122,11 +126,12 @@ class QgsExpressionBuilderWidget : QWidget
122126
* @param helpText The help text that the user will see when item is selected.
123127
* @param type The type of the expression item.
124128
* @param highlightedItem set to true to make the item highlighted, which inserts a bold copy of the item at the top level
129+
* @param sortOrder sort ranking for item
125130
*/
126131
void registerItem( QString group, QString label, QString expressionText,
127132
QString helpText = "",
128133
QgsExpressionItem::ItemType type = QgsExpressionItem::ExpressionNode,
129-
bool highlightedItem = false );
134+
bool highlightedItem = false, int sortOrder = 1 );
130135

131136
bool isExpressionValid();
132137

src/gui/qgsexpressionbuilderwidget.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#include <QDir>
2828
#include <QComboBox>
2929

30+
31+
3032
QgsExpressionBuilderWidget::QgsExpressionBuilderWidget( QWidget *parent )
3133
: QWidget( parent )
3234
, mLayer( NULL )
@@ -41,8 +43,11 @@ QgsExpressionBuilderWidget::QgsExpressionBuilderWidget( QWidget *parent )
4143

4244
mModel = new QStandardItemModel();
4345
mProxyModel = new QgsExpressionItemSearchProxy();
46+
mProxyModel->setDynamicSortFilter( true );
4447
mProxyModel->setSourceModel( mModel );
4548
expressionTree->setModel( mProxyModel );
49+
expressionTree->setSortingEnabled( true );
50+
expressionTree->sortByColumn( 0, Qt::AscendingOrder );
4651

4752
expressionTree->setContextMenuPolicy( Qt::CustomContextMenu );
4853
connect( this, SIGNAL( expressionParsed( bool ) ), this, SLOT( setExpressionState( bool ) ) );
@@ -277,7 +282,7 @@ void QgsExpressionBuilderWidget::loadFieldNames( const QgsFields& fields )
277282
{
278283
QString fieldName = fields[i].name();
279284
fieldNames << fieldName;
280-
registerItem( "Fields and Values", fieldName, " \"" + fieldName + "\" ", "", QgsExpressionItem::Field );
285+
registerItem( "Fields and Values", fieldName, " \"" + fieldName + "\" ", "", QgsExpressionItem::Field, false, i );
281286
}
282287
// highlighter->addFields( fieldNames );
283288
}
@@ -336,10 +341,11 @@ void QgsExpressionBuilderWidget::registerItem( QString group,
336341
QString label,
337342
QString expressionText,
338343
QString helpText,
339-
QgsExpressionItem::ItemType type, bool highlightedItem )
344+
QgsExpressionItem::ItemType type, bool highlightedItem, int sortOrder )
340345
{
341346
QgsExpressionItem* item = new QgsExpressionItem( label, expressionText, helpText, type );
342347
item->setData( label, Qt::UserRole );
348+
item->setData( sortOrder, Qt::UserRole + 1 );
343349

344350
// Look up the group and insert the new function.
345351
if ( mExpressionGroups.contains( group ) )
@@ -352,6 +358,7 @@ void QgsExpressionBuilderWidget::registerItem( QString group,
352358
// If the group doesn't exist yet we make it first.
353359
QgsExpressionItem *newgroupNode = new QgsExpressionItem( QgsExpression::group( group ), "", QgsExpressionItem::Header );
354360
newgroupNode->setData( group, Qt::UserRole );
361+
newgroupNode->setData( group == "Recent (Selection)" ? 2 : 1, Qt::UserRole + 1 );
355362
newgroupNode->appendRow( item );
356363
mModel->appendRow( newgroupNode );
357364
mExpressionGroups.insert( group, newgroupNode );
@@ -362,6 +369,7 @@ void QgsExpressionBuilderWidget::registerItem( QString group,
362369
//insert a copy as a top level item
363370
QgsExpressionItem* topLevelItem = new QgsExpressionItem( label, expressionText, helpText, type );
364371
topLevelItem->setData( label, Qt::UserRole );
372+
item->setData( 0, Qt::UserRole + 1 );
365373
QFont font = topLevelItem->font();
366374
font.setBold( true );
367375
topLevelItem->setFont( font );
@@ -717,3 +725,6 @@ QString QgsExpressionBuilderWidget::loadFunctionHelp( QgsExpressionItem* express
717725
QString myStyle = QgsApplication::reportStyleSheet();
718726
return "<head><style>" + myStyle + "</style></head><body>" + helpContents + "</body>";
719727
}
728+
729+
730+

src/gui/qgsexpressionbuilderwidget.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,27 @@ class QgsExpressionItemSearchProxy : public QSortFilterProxyModel
4545

4646
return QSortFilterProxyModel::filterAcceptsRow( source_row, source_parent );
4747
}
48+
49+
protected:
50+
51+
bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override
52+
{
53+
int leftSort = sourceModel()->data( left, Qt::UserRole + 1 ).toInt();
54+
int rightSort = sourceModel()->data( right, Qt::UserRole + 1 ).toInt();
55+
if ( leftSort != rightSort )
56+
return leftSort < rightSort;
57+
58+
QString leftString = sourceModel()->data( left, Qt::DisplayRole ).toString();
59+
QString rightString = sourceModel()->data( right, Qt::DisplayRole ).toString();
60+
61+
//ignore $ prefixes when sorting
62+
if ( leftString.startsWith( "$" ) )
63+
leftString = leftString.mid( 1 );
64+
if ( rightString.startsWith( "$" ) )
65+
rightString = rightString.mid( 1 );
66+
67+
return QString::localeAwareCompare( leftString, rightString ) < 0;
68+
}
4869
};
4970

5071
/** An expression item that can be used in the QgsExpressionBuilderWidget tree.
@@ -164,11 +185,12 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp
164185
* @param helpText The help text that the user will see when item is selected.
165186
* @param type The type of the expression item.
166187
* @param highlightedItem set to true to make the item highlighted, which inserts a bold copy of the item at the top level
188+
* @param sortOrder sort ranking for item
167189
*/
168190
void registerItem( QString group, QString label, QString expressionText,
169191
QString helpText = "",
170192
QgsExpressionItem::ItemType type = QgsExpressionItem::ExpressionNode,
171-
bool highlightedItem = false );
193+
bool highlightedItem = false, int sortOrder = 1 );
172194

173195
bool isExpressionValid();
174196

src/gui/qgsexpressionselectiondialog.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ QgsExpressionSelectionDialog::QgsExpressionSelectionDialog( QgsVectorLayer* laye
4747
context << QgsExpressionContextUtils::globalScope()
4848
<< QgsExpressionContextUtils::projectScope()
4949
<< QgsExpressionContextUtils::layerScope( mLayer );
50+
context.setHighlightedVariables( QStringList() << "layer_id" << "layer_name" );
5051
mExpressionBuilder->setExpressionContext( context );
5152

5253
QSettings settings;

0 commit comments

Comments
 (0)