18#include <QVersionNumber>
33 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
34 .arg( QCoreApplication::translate(
"relation_help",
"relation %1" ).arg( relation.
name() ),
35 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() ),
49 QObject::tr(
"Inserts the layer ID for the layer named '%1'." ).arg( layer->
name() ) );
51 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
52 .arg( QObject::tr(
"Current value" ), layer->
id() );
60 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
61 .arg( QCoreApplication::translate(
"recent_expression_help",
"expression %1" ).arg( label ),
62 QCoreApplication::translate(
"recent_expression_help",
"Recently used expression." ) );
64 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
65 .arg( QObject::tr(
"Expression" ), expression );
73 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
74 .arg( QCoreApplication::translate(
"user_expression_help",
"expression %1" ).arg( label ), description );
76 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><pre>%2</pre></div>" )
77 .arg( QObject::tr(
"Expression" ), expression );
83QString
formatVariableHelp(
const QString &variable,
const QString &description,
bool showValue,
const QVariant &value )
85 QString text = QStringLiteral(
"<h3>%1</h3>\n<div class=\"description\"><p>%2</p></div>" )
86 .arg( QCoreApplication::translate(
"variable_help",
"variable %1" ).arg( variable ), description );
90 QString valueString = !value.isValid()
91 ? QCoreApplication::translate(
"variable_help",
"not set" )
94 text += QStringLiteral(
"<h4>%1</h4><div class=\"description\"><p>%2</p></div>" )
95 .arg( QObject::tr(
"Current value" ), valueString );
109 : QTreeView( parent )
112 connect(
this, &QTreeView::doubleClicked,
this, &QgsExpressionTreeView::onDoubleClicked );
114 mModel = std::make_unique<QStandardItemModel>();
115 mProxyModel = std::make_unique<QgsExpressionItemSearchProxy>();
116 mProxyModel->setDynamicSortFilter(
true );
117 mProxyModel->setSourceModel( mModel.get() );
118 setModel( mProxyModel.get() );
119 setSortingEnabled(
true );
120 sortByColumn( 0, Qt::AscendingOrder );
122 setSelectionMode( QAbstractItemView::SelectionMode::SingleSelection );
124 setContextMenuPolicy( Qt::CustomContextMenu );
125 connect(
this, &QWidget::customContextMenuRequested,
this, &QgsExpressionTreeView::showContextMenu );
126 connect( selectionModel(), &QItemSelectionModel::currentChanged,
this, &QgsExpressionTreeView::currentItemChanged );
128 updateFunctionTree();
133 QModelIndex firstItem = mProxyModel->index( 0, 0, QModelIndex() );
134 setCurrentIndex( firstItem );
151 mExpressionContext = context;
152 updateFunctionTree();
160 mMenuProvider = provider;
165 updateFunctionTree();
173 QModelIndex idx = mProxyModel->mapToSource( currentIndex() );
191 updateFunctionTree();
197 mProxyModel->setFilterString( text );
198 if ( text.isEmpty() )
205 QModelIndex index = mProxyModel->index( 0, 0 );
206 if ( mProxyModel->hasChildren( index ) )
208 QModelIndex child = mProxyModel->index( 0, 0, index );
209 selectionModel()->setCurrentIndex( child, QItemSelectionModel::ClearAndSelect );
214void QgsExpressionTreeView::onDoubleClicked(
const QModelIndex &index )
216 QModelIndex idx = mProxyModel->mapToSource( index );
228void QgsExpressionTreeView::showContextMenu( QPoint pt )
230 QModelIndex idx = indexAt( pt );
231 idx = mProxyModel->mapToSource( idx );
236 if ( !mMenuProvider )
242 menu->popup( mapToGlobal( pt ) );
245void QgsExpressionTreeView::currentItemChanged(
const QModelIndex &index,
const QModelIndex & )
248 QModelIndex idx = mProxyModel->mapToSource( index );
256void QgsExpressionTreeView::updateFunctionTree()
259 mExpressionGroups.clear();
262 static const QList< QPair<QString, QString> > operators = QList< QPair<QString, QString> >()
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(
"[]" ), QStringLiteral(
"[]" ) )
278 << QPair<QString, QString>( QStringLiteral(
"||" ), QStringLiteral(
" || " ) )
279 << QPair<QString, QString>( QStringLiteral(
"BETWEEN" ), QStringLiteral(
" BETWEEN " ) )
280 << QPair<QString, QString>( QStringLiteral(
"NOT BETWEEN" ), QStringLiteral(
" NOT BETWEEN " ) )
281 << QPair<QString, QString>( QStringLiteral(
"IN" ), QStringLiteral(
" IN " ) )
282 << QPair<QString, QString>( QStringLiteral(
"LIKE" ), QStringLiteral(
" LIKE " ) )
283 << QPair<QString, QString>( QStringLiteral(
"ILIKE" ), QStringLiteral(
" ILIKE " ) )
284 << QPair<QString, QString>( QStringLiteral(
"IS" ), QStringLiteral(
" IS " ) )
285 << QPair<QString, QString>( QStringLiteral(
"IS NOT" ), QStringLiteral(
" IS NOT " ) )
286 << QPair<QString, QString>( QStringLiteral(
"OR" ), QStringLiteral(
" OR " ) )
287 << QPair<QString, QString>( QStringLiteral(
"AND" ), QStringLiteral(
" AND " ) )
288 << QPair<QString, QString>( QStringLiteral(
"NOT" ), QStringLiteral(
" NOT " ) );
289 for (
const auto &name : operators )
294 QString casestring = QStringLiteral(
"CASE WHEN condition THEN result END" );
298 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"NULL" ), QStringLiteral(
"NULL" ), QString(),
QgsExpressionItem::ExpressionNode,
false, -1 );
302 for (
int i = 0; i < count; i++ )
305 QString name = func->
name();
306 if ( name.startsWith(
'_' ) )
316 if ( func->
params() != 0 )
318 else if ( !name.startsWith(
'$' ) )
319 name += QLatin1String(
"()" );
330 loadExpressionContext();
334 const QString &label,
335 const QString &expressionText,
336 const QString &helpText,
337 QgsExpressionItem::ItemType type,
bool highlightedItem,
int sortOrder,
const QIcon &icon,
const QStringList &tags,
const QString &name )
340 item->setData( label, Qt::UserRole );
344 item->setIcon( icon );
347 if ( mExpressionGroups.contains( group ) )
350 groupNode->appendRow( item );
356 newgroupNode->setData( group, Qt::UserRole );
358 newgroupNode->setData( group.startsWith( QLatin1String(
"Recent (" ) ) ? 2 : 1,
QgsExpressionItem::CUSTOM_SORT_ROLE );
359 newgroupNode->appendRow( item );
360 newgroupNode->setBackground( QBrush( QColor( 150, 150, 150, 150 ) ) );
361 mModel->appendRow( newgroupNode );
362 mExpressionGroups.insert( group, newgroupNode );
365 if ( highlightedItem )
369 topLevelItem->setData( label, Qt::UserRole );
371 QFont font = topLevelItem->font();
372 font.setBold(
true );
373 topLevelItem->setFont( font );
374 mModel->appendRow( topLevelItem );
379void QgsExpressionTreeView::registerItemForAllGroups(
const QStringList &groups,
const QString &label,
const QString &expressionText,
const QString &helpText,
QgsExpressionItem::ItemType type,
bool highlightedItem,
int sortOrder,
const QStringList &tags )
381 const auto constGroups = groups;
382 for (
const QString &group : constGroups )
384 registerItem( group, label, expressionText, helpText, type, highlightedItem, sortOrder, QIcon(), tags );
388void QgsExpressionTreeView::loadExpressionContext()
391 const auto constVariableNames = variableNames;
392 for (
const QString &variable : constVariableNames )
394 registerItem( QStringLiteral(
"Variables" ), variable,
" @" + variable +
' ',
401 QStringList contextFunctions = mExpressionContext.
functionNames();
402 const auto constContextFunctions = contextFunctions;
403 for (
const QString &functionName : constContextFunctions )
406 QString name = func->
name();
407 if ( name.startsWith(
'_' ) )
409 if ( func->
params() != 0 )
415void QgsExpressionTreeView::loadLayers()
420 QMap<QString, QgsMapLayer *> layers = mProject->mapLayers();
421 QMap<QString, QgsMapLayer *>::const_iterator layerIt = layers.constBegin();
422 for ( ; layerIt != layers.constEnd(); ++layerIt )
426 loadLayerFields( qobject_cast<QgsVectorLayer *>( layerIt.value() ), parentItem );
437 for (
int fieldIdx = 0; fieldIdx < fields.
count(); ++fieldIdx )
443 item->setData( label, Qt::UserRole );
448 item->setIcon( icon );
449 parentItem->appendRow( item );
455 for (
int i = 0; i < fields.
count(); ++i )
464void QgsExpressionTreeView::loadFieldNames()
467 if ( mExpressionGroups.contains( QStringLiteral(
"Fields and Values" ) ) )
469 QgsExpressionItem *node = mExpressionGroups.value( QStringLiteral(
"Fields and Values" ) );
470 node->removeRows( 0, node->rowCount() );
473 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"NULL" ), QStringLiteral(
"NULL" ), QString(),
QgsExpressionItem::ExpressionNode,
false, -1 );
484 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"feature" ), QStringLiteral(
"@feature" ), currentFeatureHelp,
QgsExpressionItem::ExpressionNode,
false, -1 );
485 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"id" ), QStringLiteral(
"@id" ), currentFeatureIdHelp,
QgsExpressionItem::ExpressionNode,
false, -1 );
486 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"geometry" ), QStringLiteral(
"@geometry" ), currentGeometryHelp,
QgsExpressionItem::ExpressionNode,
false, -1 );
490 registerItem( QStringLiteral(
"Variables" ), QStringLiteral(
"geometry" ), QStringLiteral(
"@geometry" ), currentGeometryHelp,
QgsExpressionItem::ExpressionNode,
false );
492 registerItem( QStringLiteral(
"Record and Attributes" ), QStringLiteral(
"feature" ), QStringLiteral(
"@feature" ), currentFeatureHelp,
QgsExpressionItem::ExpressionNode,
true, -1 );
493 registerItem( QStringLiteral(
"Record and Attributes" ), QStringLiteral(
"id" ), QStringLiteral(
"@id" ), currentFeatureIdHelp,
QgsExpressionItem::ExpressionNode,
true, -1 );
494 registerItem( QStringLiteral(
"Record and Attributes" ), QStringLiteral(
"geometry" ), QStringLiteral(
"@geometry" ), currentGeometryHelp,
QgsExpressionItem::ExpressionNode,
true, -1 );
506void QgsExpressionTreeView::loadRelations()
511 QMap<QString, QgsRelation> relations = mProject->relationManager()->relations();
512 QMap<QString, QgsRelation>::const_iterator relIt = relations.constBegin();
513 for ( ; relIt != relations.constEnd(); ++relIt )
515 registerItemForAllGroups( QStringList() << tr(
"Relations" ), relIt->name(), QStringLiteral(
"'%1'" ).arg( relIt->id() ),
formatRelationHelp( relIt.value() ) );
521 mRecentKey = collection;
522 QString name = tr(
"Recent (%1)" ).arg( collection );
523 if ( mExpressionGroups.contains( name ) )
526 node->removeRows( 0, node->rowCount() );
530 const QString location = QStringLiteral(
"/expressions/recent/%1" ).arg( collection );
531 const QStringList expressions = settings.
value( location ).toStringList();
533 for (
const QString &expression : expressions )
536 QString label = expression;
537 label.replace(
'\n',
' ' );
546 QString location = QStringLiteral(
"/expressions/recent/%1" ).arg( collection );
547 QStringList expressions = settings.
value( location ).toStringList();
548 expressions.removeAll( expressionText );
550 expressions.prepend( expressionText );
552 while ( expressions.count() > 20 )
554 expressions.pop_back();
557 settings.
setValue( location, expressions );
564 const QString location = QStringLiteral(
"user" );
567 settings.
setValue( QStringLiteral(
"expression" ), expression );
568 settings.
setValue( QStringLiteral(
"helpText" ), helpText );
571 const QModelIndexList idxs { mModel->match( mModel->index( 0, 0 ), Qt::DisplayRole, label, 1, Qt::MatchFlag::MatchRecursive ) };
572 if ( ! idxs.isEmpty() )
574 scrollTo( idxs.first() );
589 if ( mExpressionGroups.contains( QStringLiteral(
"UserGroup" ) ) )
591 QgsExpressionItem *node = mExpressionGroups.value( QStringLiteral(
"UserGroup" ) );
592 node->removeRows( 0, node->rowCount() );
596 const QString location = QStringLiteral(
"user" );
602 for (
const auto &label : std::as_const( mUserExpressionLabels ) )
605 expression = settings.
value( QStringLiteral(
"expression" ) ).toString();
614 return mUserExpressionLabels;
619 const QString group = QStringLiteral(
"user" );
621 QJsonArray exportList;
622 QJsonObject exportObject
625 {
"exported_at", QDateTime::currentDateTime().toString( Qt::ISODate )},
627 {
"expressions", exportList}
634 for (
const QString &label : std::as_const( mUserExpressionLabels ) )
638 const QString expression = settings.
value( QStringLiteral(
"expression" ) ).toString();
639 const QString helpText = settings.
value( QStringLiteral(
"helpText" ) ).toString();
640 const QJsonObject expressionObject
643 {
"type",
"expression"},
644 {
"expression", expression},
646 {
"description", helpText}
648 exportList.push_back( expressionObject );
653 exportObject[QStringLiteral(
"expressions" )] = exportList;
654 QJsonDocument exportJson = QJsonDocument( exportObject );
662 if ( ! expressionsDocument.isObject() )
665 QJsonObject expressionsObject = expressionsDocument.object();
668 if ( ! expressionsObject[QStringLiteral(
"qgis_version" )].isString()
669 || ! expressionsObject[QStringLiteral(
"exported_at" )].isString()
670 || ! expressionsObject[QStringLiteral(
"author" )].isString()
671 || ! expressionsObject[QStringLiteral(
"expressions" )].isArray() )
675 QVersionNumber qgisJsonVersion = QVersionNumber::fromString( expressionsObject[QStringLiteral(
"qgis_version" )].toString() );
676 QVersionNumber qgisVersion = QVersionNumber::fromString(
Qgis::version() );
680 if ( qgisJsonVersion > qgisVersion )
682 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No;
683 switch ( QMessageBox::question(
this,
684 tr(
"QGIS Version Mismatch" ),
685 tr(
"The imported expressions are from newer version of QGIS (%1) "
686 "and some of the expression might not work the current version (%2). "
687 "Are you sure you want to continue?" ).arg( qgisJsonVersion.toString(), qgisVersion.toString() ), buttons ) )
689 case QMessageBox::No:
692 case QMessageBox::Yes:
701 QStringList skippedExpressionLabels;
702 bool isApplyToAll =
false;
703 bool isOkToOverwrite =
false;
709 const QJsonArray expressions = expressionsObject[QStringLiteral(
"expressions" )].toArray();
710 for (
const QJsonValue && expressionValue : expressions )
713 if ( ! expressionValue.isObject() )
716 skippedExpressionLabels.append( expressionValue.toString() );
720 QJsonObject expressionObj = expressionValue.toObject();
723 if ( ! expressionObj[QStringLiteral(
"name" )].isString()
724 || ! expressionObj[QStringLiteral(
"type" )].isString()
725 || ! expressionObj[QStringLiteral(
"expression" )].isString()
726 || ! expressionObj[QStringLiteral(
"group" )].isString()
727 || ! expressionObj[QStringLiteral(
"description" )].isString() )
730 if ( ! expressionObj[QStringLiteral(
"name" )].toString().isEmpty() )
731 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
733 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"expression" )].toString() );
739 if ( expressionObj[QStringLiteral(
"type" )].toString() != QLatin1String(
"expression" ) )
741 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
746 if ( expressionObj[QStringLiteral(
"group" )].toString() != QLatin1String(
"user" ) )
748 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
752 const QString label = expressionObj[QStringLiteral(
"name" )].toString();
753 const QString expression = expressionObj[QStringLiteral(
"expression" )].toString();
754 const QString helpText = expressionObj[QStringLiteral(
"description" )].toString();
757 if ( label.contains( QLatin1String(
"\\" ) ) || label.contains(
'/' ) )
759 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
764 const QString oldExpression = settings.
value( QStringLiteral(
"expression" ) ).toString();
768 if ( mUserExpressionLabels.contains( label ) && expression != oldExpression )
770 if ( ! isApplyToAll )
771 showMessageBoxConfirmExpressionOverwrite( isApplyToAll, isOkToOverwrite, label, oldExpression, expression );
773 if ( isOkToOverwrite )
777 skippedExpressionLabels.append( label );
789 if ( ! skippedExpressionLabels.isEmpty() )
791 QStringList skippedExpressionLabelsQuoted;
792 skippedExpressionLabelsQuoted.reserve( skippedExpressionLabels.size() );
793 for (
const QString &skippedExpressionLabel : skippedExpressionLabels )
794 skippedExpressionLabelsQuoted.append( QStringLiteral(
"'%1'" ).arg( skippedExpressionLabel ) );
796 QMessageBox::information(
this,
797 tr(
"Skipped Expression Imports" ),
798 QStringLiteral(
"%1\n%2" ).arg( tr(
"The following expressions have been skipped:" ),
799 skippedExpressionLabelsQuoted.join( QLatin1String(
", " ) ) ) );
805 QList<QgsExpressionItem *> result;
806 const QList<QStandardItem *> found { mModel->findItems( label, Qt::MatchFlag::MatchRecursive ) };
807 result.reserve( found.size() );
808 std::transform( found.begin(), found.end(), std::back_inserter( result ),
809 []( QStandardItem * item ) ->
QgsExpressionItem* { return static_cast<QgsExpressionItem *>( item ); } );
813void QgsExpressionTreeView::showMessageBoxConfirmExpressionOverwrite(
815 bool &isOkToOverwrite,
816 const QString &label,
817 const QString &oldExpression,
818 const QString &newExpression )
820 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll;
821 switch ( QMessageBox::question(
this,
822 tr(
"Expression Overwrite" ),
823 tr(
"The expression with label '%1' was already defined."
824 "The old expression \"%2\" will be overwritten by \"%3\"."
825 "Are you sure you want to overwrite the expression?" ).arg( label, oldExpression, newExpression ), buttons ) )
827 case QMessageBox::NoToAll:
829 isOkToOverwrite =
false;
832 case QMessageBox::No:
833 isApplyToAll =
false;
834 isOkToOverwrite =
false;
837 case QMessageBox::YesToAll:
839 isOkToOverwrite =
true;
842 case QMessageBox::Yes:
843 isApplyToAll =
false;
844 isOkToOverwrite =
true;
861 setFilterCaseSensitivity( Qt::CaseInsensitive );
866 QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
872 int count = sourceModel()->rowCount( index );
873 bool matchchild =
false;
874 for (
int i = 0; i < count; ++i )
886 const QString name = sourceModel()->data( index, Qt::DisplayRole ).toString();
887 if ( name.contains( mFilterString, Qt::CaseInsensitive ) )
893 return std::any_of( tags.begin(), tags.end(), [
this](
const QString & tag )
895 return tag.contains( mFilterString, Qt::CaseInsensitive );
901 mFilterString = string;
909 if ( leftSort != rightSort )
910 return leftSort < rightSort;
912 QString leftString = sourceModel()->data( left, Qt::DisplayRole ).toString();
913 QString rightString = sourceModel()->data( right, Qt::DisplayRole ).toString();
916 if ( leftString.startsWith(
'$' ) )
917 leftString = leftString.mid( 1 );
918 if ( rightString.startsWith(
'$' ) )
919 rightString = rightString.mid( 1 );
921 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.