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() ), QObject::tr(
"Inserts the relation ID for the relation named '%1'." ).arg( relation.
name() ) );
37 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
38 .arg( QObject::tr(
"Current value" ), relation.
id() );
47 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
48 .arg( QCoreApplication::translate(
"layer_help",
"map layer %1" ).arg( layer->
name() ), QObject::tr(
"Inserts the layer ID for the layer named '%1'." ).arg( layer->
name() ) );
50 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
51 .arg( QObject::tr(
"Current value" ), layer->
id() );
59 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
60 .arg( QCoreApplication::translate(
"recent_expression_help",
"expression %1" ).arg( label ), QCoreApplication::translate(
"recent_expression_help",
"Recently used expression." ) );
62 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
63 .arg( QObject::tr(
"Expression" ), expression );
71 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
72 .arg( QCoreApplication::translate(
"user_expression_help",
"expression %1" ).arg( label ), description );
74 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
75 .arg( QObject::tr(
"Expression" ), expression );
81QString
formatVariableHelp(
const QString &variable,
const QString &description,
bool showValue,
const QVariant &value )
83 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
84 .arg( QCoreApplication::translate(
"variable_help",
"variable %1" ).arg( variable ), description );
88 QString valueString = !value.isValid()
89 ? QCoreApplication::translate(
"variable_help",
"not set" )
92 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><p>%2</p></div>" )
93 .arg( QObject::tr(
"Current value" ), valueString );
107 : QTreeView( parent )
110 connect(
this, &QTreeView::doubleClicked,
this, &QgsExpressionTreeView::onDoubleClicked );
112 mModel = std::make_unique<QStandardItemModel>();
113 mProxyModel = std::make_unique<QgsExpressionItemSearchProxy>();
114 mProxyModel->setDynamicSortFilter(
true );
115 mProxyModel->setSourceModel( mModel.get() );
116 setModel( mProxyModel.get() );
117 setSortingEnabled(
true );
118 sortByColumn( 0, Qt::AscendingOrder );
120 setSelectionMode( QAbstractItemView::SelectionMode::SingleSelection );
122 setContextMenuPolicy( Qt::CustomContextMenu );
123 connect(
this, &QWidget::customContextMenuRequested,
this, &QgsExpressionTreeView::showContextMenu );
124 connect( selectionModel(), &QItemSelectionModel::currentChanged,
this, &QgsExpressionTreeView::currentItemChanged );
126 updateFunctionTree();
131 QModelIndex firstItem = mProxyModel->index( 0, 0, QModelIndex() );
132 setCurrentIndex( firstItem );
149 mExpressionContext = context;
150 updateFunctionTree();
158 mMenuProvider = provider;
163 updateFunctionTree();
171 QModelIndex idx = mProxyModel->mapToSource( currentIndex() );
189 updateFunctionTree();
195 mProxyModel->setFilterString( text );
196 if ( text.isEmpty() )
203 QModelIndex index = mProxyModel->index( 0, 0 );
204 if ( mProxyModel->hasChildren( index ) )
206 QModelIndex child = mProxyModel->index( 0, 0, index );
207 selectionModel()->setCurrentIndex( child, QItemSelectionModel::ClearAndSelect );
212void QgsExpressionTreeView::onDoubleClicked(
const QModelIndex &index )
214 QModelIndex idx = mProxyModel->mapToSource( index );
226void QgsExpressionTreeView::showContextMenu( QPoint pt )
228 QModelIndex idx = indexAt( pt );
229 idx = mProxyModel->mapToSource( idx );
234 if ( !mMenuProvider )
240 menu->popup( mapToGlobal( pt ) );
243void QgsExpressionTreeView::currentItemChanged(
const QModelIndex &index,
const QModelIndex & )
246 QModelIndex idx = mProxyModel->mapToSource( index );
254void QgsExpressionTreeView::updateFunctionTree()
257 mExpressionGroups.clear();
260 static const QList<QPair<QString, QString>> operators = QList<QPair<QString, QString>>()
261 << QPair<QString, QString>( QStringLiteral(
"+" ), QStringLiteral(
" + " ) )
262 << QPair<QString, QString>( QStringLiteral(
"-" ), QStringLiteral(
" - " ) )
263 << QPair<QString, QString>( QStringLiteral(
"*" ), QStringLiteral(
" * " ) )
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(
"BETWEEN" ), QStringLiteral(
" BETWEEN " ) )
278 << QPair<QString, QString>( QStringLiteral(
"NOT BETWEEN" ), QStringLiteral(
" NOT BETWEEN " ) )
279 << QPair<QString, QString>( QStringLiteral(
"IN" ), QStringLiteral(
" IN " ) )
280 << QPair<QString, QString>( QStringLiteral(
"LIKE" ), QStringLiteral(
" LIKE " ) )
281 << QPair<QString, QString>( QStringLiteral(
"ILIKE" ), QStringLiteral(
" ILIKE " ) )
282 << QPair<QString, QString>( QStringLiteral(
"IS" ), QStringLiteral(
" IS " ) )
283 << QPair<QString, QString>( QStringLiteral(
"IS NOT" ), QStringLiteral(
" IS NOT " ) )
284 << QPair<QString, QString>( QStringLiteral(
"OR" ), QStringLiteral(
" OR " ) )
285 << QPair<QString, QString>( QStringLiteral(
"AND" ), QStringLiteral(
" AND " ) )
286 << QPair<QString, QString>( QStringLiteral(
"NOT" ), QStringLiteral(
" NOT " ) );
287 for (
const auto &name : operators )
292 QString casestring = QStringLiteral(
"CASE WHEN condition THEN result END" );
296 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"NULL" ), QStringLiteral(
"NULL" ), QString(),
QgsExpressionItem::ExpressionNode,
false, -1 );
300 for (
int i = 0; i < count; i++ )
303 QString name = func->
name();
304 if ( name.startsWith(
'_' ) )
314 if ( func->
params() != 0 )
316 else if ( !name.startsWith(
'$' ) )
317 name += QLatin1String(
"()" );
328 loadExpressionContext();
331QgsExpressionItem *QgsExpressionTreeView::registerItem(
const QString &group,
const QString &label,
const QString &expressionText,
const QString &helpText,
QgsExpressionItem::ItemType type,
bool highlightedItem,
int sortOrder,
const QIcon &icon,
const QStringList &tags,
const QString &name )
334 item->setData( label, Qt::UserRole );
338 item->setIcon( icon );
341 if ( mExpressionGroups.contains( group ) )
344 groupNode->appendRow( item );
350 newgroupNode->setData( group, Qt::UserRole );
352 newgroupNode->setData( group.startsWith( QLatin1String(
"Recent (" ) ) ? 2 : 1,
QgsExpressionItem::CUSTOM_SORT_ROLE );
353 newgroupNode->appendRow( item );
354 newgroupNode->setBackground( QBrush( QColor( 150, 150, 150, 150 ) ) );
355 mModel->appendRow( newgroupNode );
356 mExpressionGroups.insert( group, newgroupNode );
359 if ( highlightedItem )
363 topLevelItem->setData( label, Qt::UserRole );
365 QFont font = topLevelItem->font();
366 font.setBold(
true );
367 topLevelItem->setFont( font );
368 mModel->appendRow( topLevelItem );
373void QgsExpressionTreeView::registerItemForAllGroups(
const QStringList &groups,
const QString &label,
const QString &expressionText,
const QString &helpText,
QgsExpressionItem::ItemType type,
bool highlightedItem,
int sortOrder,
const QStringList &tags )
375 const auto constGroups = groups;
376 for (
const QString &group : constGroups )
378 registerItem( group, label, expressionText, helpText, type, highlightedItem, sortOrder, QIcon(), tags );
382void QgsExpressionTreeView::loadExpressionContext()
385 const auto constVariableNames = variableNames;
386 for (
const QString &variable : constVariableNames )
392 QStringList contextFunctions = mExpressionContext.
functionNames();
393 const auto constContextFunctions = contextFunctions;
394 for (
const QString &functionName : constContextFunctions )
397 QString name = func->
name();
398 if ( name.startsWith(
'_' ) )
400 if ( func->
params() != 0 )
406void QgsExpressionTreeView::loadLayers()
411 QMap<QString, QgsMapLayer *> layers = mProject->mapLayers();
412 QMap<QString, QgsMapLayer *>::const_iterator layerIt = layers.constBegin();
413 for ( ; layerIt != layers.constEnd(); ++layerIt )
417 loadLayerFields( qobject_cast<QgsVectorLayer *>( layerIt.value() ), parentItem );
427 for (
int fieldIdx = 0; fieldIdx < fields.
count(); ++fieldIdx )
433 item->setData( label, Qt::UserRole );
438 item->setIcon( icon );
439 parentItem->appendRow( item );
445 for (
int i = 0; i < fields.
count(); ++i )
453void QgsExpressionTreeView::loadFieldNames()
456 if ( mExpressionGroups.contains( QStringLiteral(
"Fields and Values" ) ) )
458 QgsExpressionItem *node = mExpressionGroups.value( QStringLiteral(
"Fields and Values" ) );
459 node->removeRows( 0, node->rowCount() );
462 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"NULL" ), QStringLiteral(
"NULL" ), QString(),
QgsExpressionItem::ExpressionNode,
false, -1 );
473 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"feature" ), QStringLiteral(
"@feature" ), currentFeatureHelp,
QgsExpressionItem::ExpressionNode,
false, -1 );
474 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"id" ), QStringLiteral(
"@id" ), currentFeatureIdHelp,
QgsExpressionItem::ExpressionNode,
false, -1 );
475 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"geometry" ), QStringLiteral(
"@geometry" ), currentGeometryHelp,
QgsExpressionItem::ExpressionNode,
false, -1 );
479 registerItem( QStringLiteral(
"Variables" ), QStringLiteral(
"geometry" ), QStringLiteral(
"@geometry" ), currentGeometryHelp,
QgsExpressionItem::ExpressionNode,
false );
481 registerItem( QStringLiteral(
"Record and Attributes" ), QStringLiteral(
"feature" ), QStringLiteral(
"@feature" ), currentFeatureHelp,
QgsExpressionItem::ExpressionNode,
true, -1 );
482 registerItem( QStringLiteral(
"Record and Attributes" ), QStringLiteral(
"id" ), QStringLiteral(
"@id" ), currentFeatureIdHelp,
QgsExpressionItem::ExpressionNode,
true, -1 );
483 registerItem( QStringLiteral(
"Record and Attributes" ), QStringLiteral(
"geometry" ), QStringLiteral(
"@geometry" ), currentGeometryHelp,
QgsExpressionItem::ExpressionNode,
true, -1 );
495void QgsExpressionTreeView::loadRelations()
500 QMap<QString, QgsRelation> relations = mProject->relationManager()->relations();
501 QMap<QString, QgsRelation>::const_iterator relIt = relations.constBegin();
502 for ( ; relIt != relations.constEnd(); ++relIt )
504 registerItemForAllGroups( QStringList() << tr(
"Relations" ), relIt->name(), QStringLiteral(
"'%1'" ).arg( relIt->id() ),
formatRelationHelp( relIt.value() ) );
510 mRecentKey = collection;
511 QString name = tr(
"Recent (%1)" ).arg( collection );
512 if ( mExpressionGroups.contains( name ) )
515 node->removeRows( 0, node->rowCount() );
519 const QString location = QStringLiteral(
"/expressions/recent/%1" ).arg( collection );
520 const QStringList expressions = settings.
value( location ).toStringList();
522 for (
const QString &expression : expressions )
525 QString label = expression;
526 label.replace(
'\n',
' ' );
535 QString location = QStringLiteral(
"/expressions/recent/%1" ).arg( collection );
536 QStringList expressions = settings.
value( location ).toStringList();
537 expressions.removeAll( expressionText );
539 expressions.prepend( expressionText );
541 while ( expressions.count() > 20 )
543 expressions.pop_back();
546 settings.
setValue( location, expressions );
553 const QString location = QStringLiteral(
"user" );
556 settings.
setValue( QStringLiteral(
"expression" ), expression );
557 settings.
setValue( QStringLiteral(
"helpText" ), helpText );
560 const QModelIndexList idxs { mModel->match( mModel->index( 0, 0 ), Qt::DisplayRole, label, 1, Qt::MatchFlag::MatchRecursive ) };
561 if ( !idxs.isEmpty() )
563 scrollTo( idxs.first() );
578 if ( mExpressionGroups.contains( QStringLiteral(
"UserGroup" ) ) )
580 QgsExpressionItem *node = mExpressionGroups.value( QStringLiteral(
"UserGroup" ) );
581 node->removeRows( 0, node->rowCount() );
585 const QString location = QStringLiteral(
"user" );
591 for (
const auto &label : std::as_const( mUserExpressionLabels ) )
594 expression = settings.
value( QStringLiteral(
"expression" ) ).toString();
603 return mUserExpressionLabels;
608 const QString group = QStringLiteral(
"user" );
610 QJsonArray exportList;
611 QJsonObject exportObject {
613 {
"exported_at", QDateTime::currentDateTime().toString( Qt::ISODate ) },
615 {
"expressions", exportList }
622 for (
const QString &label : std::as_const( mUserExpressionLabels ) )
626 const QString expression = settings.
value( QStringLiteral(
"expression" ) ).toString();
627 const QString helpText = settings.
value( QStringLiteral(
"helpText" ) ).toString();
628 const QJsonObject expressionObject {
630 {
"type",
"expression" },
631 {
"expression", expression },
633 {
"description", helpText }
635 exportList.push_back( expressionObject );
640 exportObject[QStringLiteral(
"expressions" )] = exportList;
641 QJsonDocument exportJson = QJsonDocument( exportObject );
649 if ( !expressionsDocument.isObject() )
652 QJsonObject expressionsObject = expressionsDocument.object();
655 if ( !expressionsObject[QStringLiteral(
"qgis_version" )].isString()
656 || !expressionsObject[QStringLiteral(
"exported_at" )].isString()
657 || !expressionsObject[QStringLiteral(
"author" )].isString()
658 || !expressionsObject[QStringLiteral(
"expressions" )].isArray() )
662 QVersionNumber qgisJsonVersion = QVersionNumber::fromString( expressionsObject[QStringLiteral(
"qgis_version" )].toString() );
663 QVersionNumber qgisVersion = QVersionNumber::fromString(
Qgis::version() );
667 if ( qgisJsonVersion > qgisVersion )
669 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No;
670 switch ( QMessageBox::question(
this, tr(
"QGIS Version Mismatch" ), tr(
"The imported expressions are from newer version of QGIS (%1) "
671 "and some of the expression might not work the current version (%2). "
672 "Are you sure you want to continue?" )
673 .arg( qgisJsonVersion.toString(), qgisVersion.toString() ),
676 case QMessageBox::No:
679 case QMessageBox::Yes:
688 QStringList skippedExpressionLabels;
689 bool isApplyToAll =
false;
690 bool isOkToOverwrite =
false;
696 const QJsonArray expressions = expressionsObject[QStringLiteral(
"expressions" )].toArray();
697 for (
const QJsonValue &&expressionValue : expressions )
700 if ( !expressionValue.isObject() )
703 skippedExpressionLabels.append( expressionValue.toString() );
707 QJsonObject expressionObj = expressionValue.toObject();
710 if ( !expressionObj[QStringLiteral(
"name" )].isString()
711 || !expressionObj[QStringLiteral(
"type" )].isString()
712 || !expressionObj[QStringLiteral(
"expression" )].isString()
713 || !expressionObj[QStringLiteral(
"group" )].isString()
714 || !expressionObj[QStringLiteral(
"description" )].isString() )
717 if ( !expressionObj[QStringLiteral(
"name" )].toString().isEmpty() )
718 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
720 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"expression" )].toString() );
726 if ( expressionObj[QStringLiteral(
"type" )].toString() != QLatin1String(
"expression" ) )
728 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
733 if ( expressionObj[QStringLiteral(
"group" )].toString() != QLatin1String(
"user" ) )
735 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
739 const QString label = expressionObj[QStringLiteral(
"name" )].toString();
740 const QString expression = expressionObj[QStringLiteral(
"expression" )].toString();
741 const QString helpText = expressionObj[QStringLiteral(
"description" )].toString();
744 if ( label.contains( QLatin1String(
"\\" ) ) || label.contains(
'/' ) )
746 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
751 const QString oldExpression = settings.
value( QStringLiteral(
"expression" ) ).toString();
755 if ( mUserExpressionLabels.contains( label ) && expression != oldExpression )
758 showMessageBoxConfirmExpressionOverwrite( isApplyToAll, isOkToOverwrite, label, oldExpression, expression );
760 if ( isOkToOverwrite )
764 skippedExpressionLabels.append( label );
776 if ( !skippedExpressionLabels.isEmpty() )
778 QStringList skippedExpressionLabelsQuoted;
779 skippedExpressionLabelsQuoted.reserve( skippedExpressionLabels.size() );
780 for (
const QString &skippedExpressionLabel : skippedExpressionLabels )
781 skippedExpressionLabelsQuoted.append( QStringLiteral(
"'%1'" ).arg( skippedExpressionLabel ) );
783 QMessageBox::information(
this, tr(
"Skipped Expression Imports" ), QStringLiteral(
"%1\n%2" ).arg( tr(
"The following expressions have been skipped:" ), skippedExpressionLabelsQuoted.join( QLatin1String(
", " ) ) ) );
789 QList<QgsExpressionItem *> result;
790 const QList<QStandardItem *> found { mModel->findItems( label, Qt::MatchFlag::MatchRecursive ) };
791 result.reserve( found.size() );
792 std::transform( found.begin(), found.end(), std::back_inserter( result ), []( QStandardItem *item ) ->
QgsExpressionItem * { return static_cast<QgsExpressionItem *>( item ); } );
796void QgsExpressionTreeView::showMessageBoxConfirmExpressionOverwrite(
798 bool &isOkToOverwrite,
799 const QString &label,
800 const QString &oldExpression,
801 const QString &newExpression
804 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll;
805 switch ( QMessageBox::question(
this, tr(
"Expression Overwrite" ), tr(
"The expression with label '%1' was already defined."
806 "The old expression \"%2\" will be overwritten by \"%3\"."
807 "Are you sure you want to overwrite the expression?" )
808 .arg( label, oldExpression, newExpression ),
811 case QMessageBox::NoToAll:
813 isOkToOverwrite =
false;
816 case QMessageBox::No:
817 isApplyToAll =
false;
818 isOkToOverwrite =
false;
821 case QMessageBox::YesToAll:
823 isOkToOverwrite =
true;
826 case QMessageBox::Yes:
827 isApplyToAll =
false;
828 isOkToOverwrite =
true;
845 setFilterCaseSensitivity( Qt::CaseInsensitive );
850 QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
856 int count = sourceModel()->rowCount( index );
857 bool matchchild =
false;
858 for (
int i = 0; i < count; ++i )
870 const QString name = sourceModel()->data( index, Qt::DisplayRole ).toString();
871 if ( name.contains( mFilterString, Qt::CaseInsensitive ) )
877 return std::any_of( tags.begin(), tags.end(), [
this](
const QString &tag ) {
878 return tag.contains( mFilterString, Qt::CaseInsensitive );
884 mFilterString = string;
892 if ( leftSort != rightSort )
893 return leftSort < rightSort;
895 QString leftString = sourceModel()->data( left, Qt::DisplayRole ).toString();
896 QString rightString = sourceModel()->data( right, Qt::DisplayRole ).toString();
899 if ( leftString.startsWith(
'$' ) )
900 leftString = leftString.mid( 1 );
901 if ( rightString.startsWith(
'$' ) )
902 rightString = rightString.mid( 1 );
904 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.