18#include <QVersionNumber>
21#include "moc_qgsexpressiontreeview.cpp"
34 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
35 .arg( QCoreApplication::translate(
"relation_help",
"relation %1" ).arg( relation.
name() ),
36 QObject::tr(
"Inserts the relation ID for the relation named '%1'." ).arg( relation.
name() ) );
38 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
39 .arg( QObject::tr(
"Current value" ), relation.
id() );
48 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
49 .arg( QCoreApplication::translate(
"layer_help",
"map layer %1" ).arg( layer->
name() ),
50 QObject::tr(
"Inserts the layer ID for the layer named '%1'." ).arg( layer->
name() ) );
52 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
53 .arg( QObject::tr(
"Current value" ), layer->
id() );
61 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
62 .arg( QCoreApplication::translate(
"recent_expression_help",
"expression %1" ).arg( label ),
63 QCoreApplication::translate(
"recent_expression_help",
"Recently used expression." ) );
65 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
66 .arg( QObject::tr(
"Expression" ), expression );
74 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
75 .arg( QCoreApplication::translate(
"user_expression_help",
"expression %1" ).arg( label ), description );
77 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
78 .arg( QObject::tr(
"Expression" ), expression );
84QString
formatVariableHelp(
const QString &variable,
const QString &description,
bool showValue,
const QVariant &value )
86 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
87 .arg( QCoreApplication::translate(
"variable_help",
"variable %1" ).arg( variable ), description );
91 QString valueString = !value.isValid()
92 ? QCoreApplication::translate(
"variable_help",
"not set" )
95 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><p>%2</p></div>" )
96 .arg( QObject::tr(
"Current value" ), valueString );
110 : QTreeView( parent )
113 connect(
this, &QTreeView::doubleClicked,
this, &QgsExpressionTreeView::onDoubleClicked );
115 mModel = std::make_unique<QStandardItemModel>();
116 mProxyModel = std::make_unique<QgsExpressionItemSearchProxy>();
117 mProxyModel->setDynamicSortFilter(
true );
118 mProxyModel->setSourceModel( mModel.get() );
119 setModel( mProxyModel.get() );
120 setSortingEnabled(
true );
121 sortByColumn( 0, Qt::AscendingOrder );
123 setSelectionMode( QAbstractItemView::SelectionMode::SingleSelection );
125 setContextMenuPolicy( Qt::CustomContextMenu );
126 connect(
this, &QWidget::customContextMenuRequested,
this, &QgsExpressionTreeView::showContextMenu );
127 connect( selectionModel(), &QItemSelectionModel::currentChanged,
this, &QgsExpressionTreeView::currentItemChanged );
129 updateFunctionTree();
134 QModelIndex firstItem = mProxyModel->index( 0, 0, QModelIndex() );
135 setCurrentIndex( firstItem );
152 mExpressionContext = context;
153 updateFunctionTree();
161 mMenuProvider = provider;
166 updateFunctionTree();
174 QModelIndex idx = mProxyModel->mapToSource( currentIndex() );
192 updateFunctionTree();
198 mProxyModel->setFilterString( text );
199 if ( text.isEmpty() )
206 QModelIndex index = mProxyModel->index( 0, 0 );
207 if ( mProxyModel->hasChildren( index ) )
209 QModelIndex child = mProxyModel->index( 0, 0, index );
210 selectionModel()->setCurrentIndex( child, QItemSelectionModel::ClearAndSelect );
215void QgsExpressionTreeView::onDoubleClicked(
const QModelIndex &index )
217 QModelIndex idx = mProxyModel->mapToSource( index );
229void QgsExpressionTreeView::showContextMenu( QPoint pt )
231 QModelIndex idx = indexAt( pt );
232 idx = mProxyModel->mapToSource( idx );
237 if ( !mMenuProvider )
243 menu->popup( mapToGlobal( pt ) );
246void QgsExpressionTreeView::currentItemChanged(
const QModelIndex &index,
const QModelIndex & )
249 QModelIndex idx = mProxyModel->mapToSource( index );
257void QgsExpressionTreeView::updateFunctionTree()
260 mExpressionGroups.clear();
263 static const QList< QPair<QString, QString> > operators = QList< QPair<QString, QString> >()
264 << QPair<QString, QString>( QStringLiteral(
"+" ), QStringLiteral(
" + " ) )
265 << QPair<QString, QString>( QStringLiteral(
"-" ), QStringLiteral(
" - " ) )
266 << QPair<QString, QString>( QStringLiteral(
"*" ), QStringLiteral(
" * " ) )
267 << QPair<QString, QString>( QStringLiteral(
"/" ), QStringLiteral(
" / " ) )
268 << QPair<QString, QString>( QStringLiteral(
"//" ), QStringLiteral(
" // " ) )
269 << QPair<QString, QString>( QStringLiteral(
"%" ), QStringLiteral(
" % " ) )
270 << QPair<QString, QString>( QStringLiteral(
"^" ), QStringLiteral(
" ^ " ) )
271 << QPair<QString, QString>( QStringLiteral(
"=" ), QStringLiteral(
" = " ) )
272 << QPair<QString, QString>( QStringLiteral(
"~" ), QStringLiteral(
" ~ " ) )
273 << QPair<QString, QString>( QStringLiteral(
">" ), QStringLiteral(
" > " ) )
274 << QPair<QString, QString>( QStringLiteral(
"<" ), QStringLiteral(
" < " ) )
275 << QPair<QString, QString>( QStringLiteral(
"<>" ), QStringLiteral(
" <> " ) )
276 << QPair<QString, QString>( QStringLiteral(
"<=" ), QStringLiteral(
" <= " ) )
277 << QPair<QString, QString>( QStringLiteral(
">=" ), QStringLiteral(
" >= " ) )
278 << QPair<QString, QString>( QStringLiteral(
"[]" ), QStringLiteral(
"[]" ) )
279 << QPair<QString, QString>( QStringLiteral(
"||" ), QStringLiteral(
" || " ) )
280 << QPair<QString, QString>( QStringLiteral(
"BETWEEN" ), QStringLiteral(
" BETWEEN " ) )
281 << QPair<QString, QString>( QStringLiteral(
"NOT BETWEEN" ), QStringLiteral(
" NOT BETWEEN " ) )
282 << QPair<QString, QString>( QStringLiteral(
"IN" ), QStringLiteral(
" IN " ) )
283 << QPair<QString, QString>( QStringLiteral(
"LIKE" ), QStringLiteral(
" LIKE " ) )
284 << QPair<QString, QString>( QStringLiteral(
"ILIKE" ), QStringLiteral(
" ILIKE " ) )
285 << QPair<QString, QString>( QStringLiteral(
"IS" ), QStringLiteral(
" IS " ) )
286 << QPair<QString, QString>( QStringLiteral(
"IS NOT" ), QStringLiteral(
" IS NOT " ) )
287 << QPair<QString, QString>( QStringLiteral(
"OR" ), QStringLiteral(
" OR " ) )
288 << QPair<QString, QString>( QStringLiteral(
"AND" ), QStringLiteral(
" AND " ) )
289 << QPair<QString, QString>( QStringLiteral(
"NOT" ), QStringLiteral(
" NOT " ) );
290 for (
const auto &name : operators )
295 QString casestring = QStringLiteral(
"CASE WHEN condition THEN result END" );
299 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"NULL" ), QStringLiteral(
"NULL" ), QString(),
QgsExpressionItem::ExpressionNode,
false, -1 );
303 for (
int i = 0; i < count; i++ )
306 QString name = func->
name();
307 if ( name.startsWith(
'_' ) )
317 if ( func->
params() != 0 )
319 else if ( !name.startsWith(
'$' ) )
320 name += QLatin1String(
"()" );
331 loadExpressionContext();
335 const QString &label,
336 const QString &expressionText,
337 const QString &helpText,
338 QgsExpressionItem::ItemType type,
bool highlightedItem,
int sortOrder,
const QIcon &icon,
const QStringList &tags,
const QString &name )
341 item->setData( label, Qt::UserRole );
345 item->setIcon( icon );
348 if ( mExpressionGroups.contains( group ) )
351 groupNode->appendRow( item );
357 newgroupNode->setData( group, Qt::UserRole );
359 newgroupNode->setData( group.startsWith( QLatin1String(
"Recent (" ) ) ? 2 : 1,
QgsExpressionItem::CUSTOM_SORT_ROLE );
360 newgroupNode->appendRow( item );
361 newgroupNode->setBackground( QBrush( QColor( 150, 150, 150, 150 ) ) );
362 mModel->appendRow( newgroupNode );
363 mExpressionGroups.insert( group, newgroupNode );
366 if ( highlightedItem )
370 topLevelItem->setData( label, Qt::UserRole );
372 QFont font = topLevelItem->font();
373 font.setBold(
true );
374 topLevelItem->setFont( font );
375 mModel->appendRow( topLevelItem );
380void QgsExpressionTreeView::registerItemForAllGroups(
const QStringList &groups,
const QString &label,
const QString &expressionText,
const QString &helpText,
QgsExpressionItem::ItemType type,
bool highlightedItem,
int sortOrder,
const QStringList &tags )
382 const auto constGroups = groups;
383 for (
const QString &group : constGroups )
385 registerItem( group, label, expressionText, helpText, type, highlightedItem, sortOrder, QIcon(), tags );
389void QgsExpressionTreeView::loadExpressionContext()
392 const auto constVariableNames = variableNames;
393 for (
const QString &variable : constVariableNames )
395 registerItem( QStringLiteral(
"Variables" ), variable,
" @" + variable +
' ',
402 QStringList contextFunctions = mExpressionContext.
functionNames();
403 const auto constContextFunctions = contextFunctions;
404 for (
const QString &functionName : constContextFunctions )
407 QString name = func->
name();
408 if ( name.startsWith(
'_' ) )
410 if ( func->
params() != 0 )
416void QgsExpressionTreeView::loadLayers()
421 QMap<QString, QgsMapLayer *> layers = mProject->mapLayers();
422 QMap<QString, QgsMapLayer *>::const_iterator layerIt = layers.constBegin();
423 for ( ; layerIt != layers.constEnd(); ++layerIt )
427 loadLayerFields( qobject_cast<QgsVectorLayer *>( layerIt.value() ), parentItem );
438 for (
int fieldIdx = 0; fieldIdx < fields.
count(); ++fieldIdx )
444 item->setData( label, Qt::UserRole );
449 item->setIcon( icon );
450 parentItem->appendRow( item );
456 for (
int i = 0; i < fields.
count(); ++i )
465void QgsExpressionTreeView::loadFieldNames()
468 if ( mExpressionGroups.contains( QStringLiteral(
"Fields and Values" ) ) )
470 QgsExpressionItem *node = mExpressionGroups.value( QStringLiteral(
"Fields and Values" ) );
471 node->removeRows( 0, node->rowCount() );
474 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"NULL" ), QStringLiteral(
"NULL" ), QString(),
QgsExpressionItem::ExpressionNode,
false, -1 );
485 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"feature" ), QStringLiteral(
"@feature" ), currentFeatureHelp,
QgsExpressionItem::ExpressionNode,
false, -1 );
486 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"id" ), QStringLiteral(
"@id" ), currentFeatureIdHelp,
QgsExpressionItem::ExpressionNode,
false, -1 );
487 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"geometry" ), QStringLiteral(
"@geometry" ), currentGeometryHelp,
QgsExpressionItem::ExpressionNode,
false, -1 );
491 registerItem( QStringLiteral(
"Variables" ), QStringLiteral(
"geometry" ), QStringLiteral(
"@geometry" ), currentGeometryHelp,
QgsExpressionItem::ExpressionNode,
false );
493 registerItem( QStringLiteral(
"Record and Attributes" ), QStringLiteral(
"feature" ), QStringLiteral(
"@feature" ), currentFeatureHelp,
QgsExpressionItem::ExpressionNode,
true, -1 );
494 registerItem( QStringLiteral(
"Record and Attributes" ), QStringLiteral(
"id" ), QStringLiteral(
"@id" ), currentFeatureIdHelp,
QgsExpressionItem::ExpressionNode,
true, -1 );
495 registerItem( QStringLiteral(
"Record and Attributes" ), QStringLiteral(
"geometry" ), QStringLiteral(
"@geometry" ), currentGeometryHelp,
QgsExpressionItem::ExpressionNode,
true, -1 );
507void QgsExpressionTreeView::loadRelations()
512 QMap<QString, QgsRelation> relations = mProject->relationManager()->relations();
513 QMap<QString, QgsRelation>::const_iterator relIt = relations.constBegin();
514 for ( ; relIt != relations.constEnd(); ++relIt )
516 registerItemForAllGroups( QStringList() << tr(
"Relations" ), relIt->name(), QStringLiteral(
"'%1'" ).arg( relIt->id() ),
formatRelationHelp( relIt.value() ) );
522 mRecentKey = collection;
523 QString name = tr(
"Recent (%1)" ).arg( collection );
524 if ( mExpressionGroups.contains( name ) )
527 node->removeRows( 0, node->rowCount() );
531 const QString location = QStringLiteral(
"/expressions/recent/%1" ).arg( collection );
532 const QStringList expressions = settings.
value( location ).toStringList();
534 for (
const QString &expression : expressions )
537 QString label = expression;
538 label.replace(
'\n',
' ' );
547 QString location = QStringLiteral(
"/expressions/recent/%1" ).arg( collection );
548 QStringList expressions = settings.
value( location ).toStringList();
549 expressions.removeAll( expressionText );
551 expressions.prepend( expressionText );
553 while ( expressions.count() > 20 )
555 expressions.pop_back();
558 settings.
setValue( location, expressions );
565 const QString location = QStringLiteral(
"user" );
568 settings.
setValue( QStringLiteral(
"expression" ), expression );
569 settings.
setValue( QStringLiteral(
"helpText" ), helpText );
572 const QModelIndexList idxs { mModel->match( mModel->index( 0, 0 ), Qt::DisplayRole, label, 1, Qt::MatchFlag::MatchRecursive ) };
573 if ( ! idxs.isEmpty() )
575 scrollTo( idxs.first() );
590 if ( mExpressionGroups.contains( QStringLiteral(
"UserGroup" ) ) )
592 QgsExpressionItem *node = mExpressionGroups.value( QStringLiteral(
"UserGroup" ) );
593 node->removeRows( 0, node->rowCount() );
597 const QString location = QStringLiteral(
"user" );
603 for (
const auto &label : std::as_const( mUserExpressionLabels ) )
606 expression = settings.
value( QStringLiteral(
"expression" ) ).toString();
615 return mUserExpressionLabels;
620 const QString group = QStringLiteral(
"user" );
622 QJsonArray exportList;
623 QJsonObject exportObject
626 {
"exported_at", QDateTime::currentDateTime().toString( Qt::ISODate )},
628 {
"expressions", exportList}
635 for (
const QString &label : std::as_const( mUserExpressionLabels ) )
639 const QString expression = settings.
value( QStringLiteral(
"expression" ) ).toString();
640 const QString helpText = settings.
value( QStringLiteral(
"helpText" ) ).toString();
641 const QJsonObject expressionObject
644 {
"type",
"expression"},
645 {
"expression", expression},
647 {
"description", helpText}
649 exportList.push_back( expressionObject );
654 exportObject[QStringLiteral(
"expressions" )] = exportList;
655 QJsonDocument exportJson = QJsonDocument( exportObject );
663 if ( ! expressionsDocument.isObject() )
666 QJsonObject expressionsObject = expressionsDocument.object();
669 if ( ! expressionsObject[QStringLiteral(
"qgis_version" )].isString()
670 || ! expressionsObject[QStringLiteral(
"exported_at" )].isString()
671 || ! expressionsObject[QStringLiteral(
"author" )].isString()
672 || ! expressionsObject[QStringLiteral(
"expressions" )].isArray() )
676 QVersionNumber qgisJsonVersion = QVersionNumber::fromString( expressionsObject[QStringLiteral(
"qgis_version" )].toString() );
677 QVersionNumber qgisVersion = QVersionNumber::fromString(
Qgis::version() );
681 if ( qgisJsonVersion > qgisVersion )
683 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No;
684 switch ( QMessageBox::question(
this,
685 tr(
"QGIS Version Mismatch" ),
686 tr(
"The imported expressions are from newer version of QGIS (%1) "
687 "and some of the expression might not work the current version (%2). "
688 "Are you sure you want to continue?" ).arg( qgisJsonVersion.toString(), qgisVersion.toString() ), buttons ) )
690 case QMessageBox::No:
693 case QMessageBox::Yes:
702 QStringList skippedExpressionLabels;
703 bool isApplyToAll =
false;
704 bool isOkToOverwrite =
false;
710 const QJsonArray expressions = expressionsObject[QStringLiteral(
"expressions" )].toArray();
711 for (
const QJsonValue && expressionValue : expressions )
714 if ( ! expressionValue.isObject() )
717 skippedExpressionLabels.append( expressionValue.toString() );
721 QJsonObject expressionObj = expressionValue.toObject();
724 if ( ! expressionObj[QStringLiteral(
"name" )].isString()
725 || ! expressionObj[QStringLiteral(
"type" )].isString()
726 || ! expressionObj[QStringLiteral(
"expression" )].isString()
727 || ! expressionObj[QStringLiteral(
"group" )].isString()
728 || ! expressionObj[QStringLiteral(
"description" )].isString() )
731 if ( ! expressionObj[QStringLiteral(
"name" )].toString().isEmpty() )
732 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
734 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"expression" )].toString() );
740 if ( expressionObj[QStringLiteral(
"type" )].toString() != QLatin1String(
"expression" ) )
742 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
747 if ( expressionObj[QStringLiteral(
"group" )].toString() != QLatin1String(
"user" ) )
749 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
753 const QString label = expressionObj[QStringLiteral(
"name" )].toString();
754 const QString expression = expressionObj[QStringLiteral(
"expression" )].toString();
755 const QString helpText = expressionObj[QStringLiteral(
"description" )].toString();
758 if ( label.contains( QLatin1String(
"\\" ) ) || label.contains(
'/' ) )
760 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
765 const QString oldExpression = settings.
value( QStringLiteral(
"expression" ) ).toString();
769 if ( mUserExpressionLabels.contains( label ) && expression != oldExpression )
771 if ( ! isApplyToAll )
772 showMessageBoxConfirmExpressionOverwrite( isApplyToAll, isOkToOverwrite, label, oldExpression, expression );
774 if ( isOkToOverwrite )
778 skippedExpressionLabels.append( label );
790 if ( ! skippedExpressionLabels.isEmpty() )
792 QStringList skippedExpressionLabelsQuoted;
793 skippedExpressionLabelsQuoted.reserve( skippedExpressionLabels.size() );
794 for (
const QString &skippedExpressionLabel : skippedExpressionLabels )
795 skippedExpressionLabelsQuoted.append( QStringLiteral(
"'%1'" ).arg( skippedExpressionLabel ) );
797 QMessageBox::information(
this,
798 tr(
"Skipped Expression Imports" ),
799 QStringLiteral(
"%1\n%2" ).arg( tr(
"The following expressions have been skipped:" ),
800 skippedExpressionLabelsQuoted.join( QLatin1String(
", " ) ) ) );
806 QList<QgsExpressionItem *> result;
807 const QList<QStandardItem *> found { mModel->findItems( label, Qt::MatchFlag::MatchRecursive ) };
808 result.reserve( found.size() );
809 std::transform( found.begin(), found.end(), std::back_inserter( result ),
810 []( QStandardItem * item ) ->
QgsExpressionItem* { return static_cast<QgsExpressionItem *>( item ); } );
814void QgsExpressionTreeView::showMessageBoxConfirmExpressionOverwrite(
816 bool &isOkToOverwrite,
817 const QString &label,
818 const QString &oldExpression,
819 const QString &newExpression )
821 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll;
822 switch ( QMessageBox::question(
this,
823 tr(
"Expression Overwrite" ),
824 tr(
"The expression with label '%1' was already defined."
825 "The old expression \"%2\" will be overwritten by \"%3\"."
826 "Are you sure you want to overwrite the expression?" ).arg( label, oldExpression, newExpression ), buttons ) )
828 case QMessageBox::NoToAll:
830 isOkToOverwrite =
false;
833 case QMessageBox::No:
834 isApplyToAll =
false;
835 isOkToOverwrite =
false;
838 case QMessageBox::YesToAll:
840 isOkToOverwrite =
true;
843 case QMessageBox::Yes:
844 isApplyToAll =
false;
845 isOkToOverwrite =
true;
862 setFilterCaseSensitivity( Qt::CaseInsensitive );
867 QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
873 int count = sourceModel()->rowCount( index );
874 bool matchchild =
false;
875 for (
int i = 0; i < count; ++i )
887 const QString name = sourceModel()->data( index, Qt::DisplayRole ).toString();
888 if ( name.contains( mFilterString, Qt::CaseInsensitive ) )
894 return std::any_of( tags.begin(), tags.end(), [
this](
const QString & tag )
896 return tag.contains( mFilterString, Qt::CaseInsensitive );
902 mFilterString = string;
910 if ( leftSort != rightSort )
911 return leftSort < rightSort;
913 QString leftString = sourceModel()->data( left, Qt::DisplayRole ).toString();
914 QString rightString = sourceModel()->data( right, Qt::DisplayRole ).toString();
917 if ( leftString.startsWith(
'$' ) )
918 leftString = leftString.mid( 1 );
919 if ( rightString.startsWith(
'$' ) )
920 rightString = rightString.mid( 1 );
922 return QString::localeAwareCompare( leftString, rightString ) < 0;
static QString version()
Version string.
static QString userFullName()
Returns the user's operating system login account full display name.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QString description(const QString &name) const
Returns a translated description string for the variable with specified name.
QStringList functionNames() const
Retrieves a list of function names contained in the context.
bool isHighlightedFunction(const QString &name) const
Returns true if the specified function name is intended to be highlighted to the user.
QStringList filteredVariableNames() const
Returns a filtered list of variables names set by all scopes in the context.
bool isHighlightedVariable(const QString &name) const
Returns true if the specified variable name is intended to be highlighted to the user.
QgsExpressionFunction * function(const QString &name) const
Fetches a matching function from the context.
QVariant variable(const QString &name) const
Fetches a matching variable from the context.
A abstract base class for defining QgsExpression functions.
bool isContextual() const
Returns whether the function is only available if provided by a QgsExpressionContext object.
int params() const
The number of parameters this function takes.
QStringList groups() const
Returns a list of the groups the function belongs to.
virtual bool isDeprecated() const
Returns true if the function is deprecated and should not be presented as a valid option to users in ...
QString name() const
The name of the function.
const QString helpText() const
The help text for the function.
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
void setFilterString(const QString &string)
Sets the search filter string.
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override
QgsExpressionItemSearchProxy()
An expression item that can be used in the QgsExpressionBuilderWidget tree.
static const int LAYER_ID_ROLE
Layer ID role.
QString getExpressionText() const
static const int SEARCH_TAGS_ROLE
Search tags role.
static const int ITEM_TYPE_ROLE
Item type role.
static const int CUSTOM_SORT_ROLE
Custom sort order role.
QgsExpressionItem::ItemType getItemType() const
Gets the type of expression item, e.g., header, field, ExpressionNode.
static const int ITEM_NAME_ROLE
Item name role.
QgsProject * project()
Returns the project currently associated with the widget.
void refresh()
Refreshes the content of the tree.
void setProject(QgsProject *project)
Sets the project currently associated with the widget.
void saveToUserExpressions(const QString &label, const QString &expression, const QString &helpText)
Stores the user expression with given label and helpText.
QgsExpressionItem * currentItem() const
Returns the current item or a nullptr.
void setLayer(QgsVectorLayer *layer)
Sets layer in order to get the fields and values.
void setMenuProvider(MenuProvider *provider)
Sets the menu provider.
QStringList userExpressionLabels() const
Returns the user expression labels.
void expressionItemDoubleClicked(const QString &text)
Emitted when a expression item is double clicked.
void currentExpressionItemChanged(QgsExpressionItem *item)
Emitter when the current expression item changed.
QJsonDocument exportUserExpressions()
Create the expressions JSON document storing all the user expressions to be exported.
QgsExpressionTreeView(QWidget *parent=nullptr)
Constructor.
void loadExpressionsFromJson(const QJsonDocument &expressionsDocument)
Load and permanently store the expressions from the expressions JSON document.
void saveToRecent(const QString &expressionText, const QString &collection="generic")
Adds the current expression to the given collection.
void setSearchText(const QString &text)
Sets the text to filter the expression tree.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context for the tree view.
const QList< QgsExpressionItem * > findExpressions(const QString &label)
Returns the list of expression items matching a label.
void removeFromUserExpressions(const QString &label)
Removes the expression label from the user stored expressions.
void loadRecent(const QString &collection=QStringLiteral("generic"))
Loads the recent expressions from the given collection.
void loadUserExpressions()
Loads the user expressions.
Q_DECL_DEPRECATED QStandardItemModel * model()
Returns a pointer to the dialog's function item model.
void loadFieldNames(const QgsFields &fields)
This allows loading fields without specifying a layer.
static const QList< QgsExpressionFunction * > & Functions()
static int functionCount()
Returns the number of functions defined in the parser.
static QString variableHelpText(const QString &variableName)
Returns the help text for a specified variable.
static QString formatPreviewString(const QVariant &value, bool htmlOutput=true, int maximumPreviewLength=60)
Formats an expression result for friendly display to the user.
static QStringList tags(const QString &name)
Returns a string list of search tags for a specified function.
static QString group(const QString &group)
Returns the translated name for a function group.
Encapsulate a field in an attribute table or data source.
QString displayNameWithAlias() const
Returns the name to use when displaying this field and adds the alias in parenthesis if it is defined...
Container of fields for a vector layer.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
QIcon iconForField(int fieldIdx, bool considerOrigin=false) const
Returns an icon corresponding to a field index, based on the field's type and source.
static QIcon iconForLayer(const QgsMapLayer *layer)
Returns the icon corresponding to a specified map layer.
Base class for all map layer types.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Represents a relationship between two vector layers.
This class is a composition of two QSettings instances:
QStringList childGroups(Qgis::SettingsOrigin origin=Qgis::SettingsOrigin::Any) const
Returns a list of all key top-level groups that contain keys that can be read using the QSettings obj...
void endGroup()
Resets the group to what it was before the corresponding beginGroup() call.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void beginGroup(const QString &prefix, QgsSettings::Section section=QgsSettings::NoSection)
Appends prefix to the current group.
void remove(const QString &key, QgsSettings::Section section=QgsSettings::NoSection)
Removes the setting key and any sub-settings of key in a section.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
Represents a vector layer which manages a vector based data sets.
QString formatLayerHelp(const QgsMapLayer *layer)
Returns a HTML formatted string for use as a layer item help.
QString formatUserExpressionHelp(const QString &label, const QString &expression, const QString &description)
Returns a HTML formatted string for use as a user expression item help.
QString formatVariableHelp(const QString &variable, const QString &description, bool showValue, const QVariant &value)
Returns a HTML formatted string for use as a variable item help.
QString formatRecentExpressionHelp(const QString &label, const QString &expression)
Returns a HTML formatted string for use as a recent expression item help.
QString formatRelationHelp(const QgsRelation &relation)
Returns a HTML formatted string for use as a relation item help.