17 #include <QMessageBox>
18 #include <QVersionNumber>
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 );
84 QString
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 );
215 void QgsExpressionTreeView::onDoubleClicked(
const QModelIndex &index )
217 QModelIndex idx = mProxyModel->mapToSource( index );
229 void QgsExpressionTreeView::showContextMenu( QPoint pt )
231 QModelIndex idx = indexAt( pt );
232 idx = mProxyModel->mapToSource( idx );
237 if ( !mMenuProvider )
243 menu->popup( mapToGlobal( pt ) );
246 void QgsExpressionTreeView::currentItemChanged(
const QModelIndex &index,
const QModelIndex & )
249 QModelIndex idx = mProxyModel->mapToSource( index );
257 void QgsExpressionTreeView::updateFunctionTree()
260 mExpressionGroups.clear();
263 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"+" ), QStringLiteral(
" + " ) );
264 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"-" ), QStringLiteral(
" - " ) );
265 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"*" ), QStringLiteral(
" * " ) );
266 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"/" ), QStringLiteral(
" / " ) );
267 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"%" ), QStringLiteral(
" % " ) );
268 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"^" ), QStringLiteral(
" ^ " ) );
269 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"=" ), QStringLiteral(
" = " ) );
270 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"~" ), QStringLiteral(
" ~ " ) );
271 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
">" ), QStringLiteral(
" > " ) );
272 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"<" ), QStringLiteral(
" < " ) );
273 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"<>" ), QStringLiteral(
" <> " ) );
274 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"<=" ), QStringLiteral(
" <= " ) );
275 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
">=" ), QStringLiteral(
" >= " ) );
276 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"[]" ), QStringLiteral(
"[ ]" ) );
277 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"||" ), QStringLiteral(
" || " ) );
278 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"IN" ), QStringLiteral(
" IN " ) );
279 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"LIKE" ), QStringLiteral(
" LIKE " ) );
280 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"ILIKE" ), QStringLiteral(
" ILIKE " ) );
281 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"IS" ), QStringLiteral(
" IS " ) );
282 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"IS NOT" ), QStringLiteral(
" IS NOT " ) );
283 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"OR" ), QStringLiteral(
" OR " ) );
284 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"AND" ), QStringLiteral(
" AND " ) );
285 registerItem( QStringLiteral(
"Operators" ), QStringLiteral(
"NOT" ), QStringLiteral(
" NOT " ) );
287 QString casestring = QStringLiteral(
"CASE WHEN condition THEN result END" );
288 registerItem( QStringLiteral(
"Conditionals" ), QStringLiteral(
"CASE" ), casestring );
291 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"NULL" ), QStringLiteral(
"NULL" ), QString(),
QgsExpressionItem::ExpressionNode,
false, -1 );
295 for (
int i = 0; i < count; i++ )
298 QString name = func->
name();
299 if ( name.startsWith(
'_' ) )
309 if ( func->
params() != 0 )
311 else if ( !name.startsWith(
'$' ) )
312 name += QLatin1String(
"()" );
323 loadExpressionContext();
327 const QString &label,
328 const QString &expressionText,
329 const QString &helpText,
330 QgsExpressionItem::ItemType type,
bool highlightedItem,
int sortOrder,
const QIcon &icon,
const QStringList &tags,
const QString &name )
333 item->setData( label, Qt::UserRole );
337 item->setIcon( icon );
340 if ( mExpressionGroups.contains( group ) )
343 groupNode->appendRow( item );
349 newgroupNode->setData( group, Qt::UserRole );
352 newgroupNode->appendRow( item );
353 newgroupNode->setBackground( QBrush( QColor( 150, 150, 150, 150 ) ) );
354 mModel->appendRow( newgroupNode );
355 mExpressionGroups.insert( group, newgroupNode );
358 if ( highlightedItem )
362 topLevelItem->setData( label, Qt::UserRole );
364 QFont font = topLevelItem->font();
365 font.setBold(
true );
366 topLevelItem->setFont( font );
367 mModel->appendRow( topLevelItem );
372 void QgsExpressionTreeView::registerItemForAllGroups(
const QStringList &groups,
const QString &label,
const QString &expressionText,
const QString &helpText,
QgsExpressionItem::ItemType type,
bool highlightedItem,
int sortOrder,
const QStringList &tags )
374 const auto constGroups = groups;
375 for (
const QString &group : constGroups )
377 registerItem( group, label, expressionText, helpText, type, highlightedItem, sortOrder, QIcon(), tags );
381 void QgsExpressionTreeView::loadExpressionContext()
384 const auto constVariableNames = variableNames;
385 for (
const QString &variable : constVariableNames )
387 registerItem( QStringLiteral(
"Variables" ), variable,
" @" + variable +
' ',
394 QStringList contextFunctions = mExpressionContext.
functionNames();
395 const auto constContextFunctions = contextFunctions;
396 for (
const QString &functionName : constContextFunctions )
399 QString name = func->
name();
400 if ( name.startsWith(
'_' ) )
402 if ( func->
params() != 0 )
408 void QgsExpressionTreeView::loadLayers()
413 QMap<QString, QgsMapLayer *> layers = mProject->mapLayers();
414 QMap<QString, QgsMapLayer *>::const_iterator layerIt = layers.constBegin();
415 for ( ; layerIt != layers.constEnd(); ++layerIt )
419 loadLayerFields( qobject_cast<QgsVectorLayer *>( layerIt.value() ), parentItem );
430 for (
int fieldIdx = 0; fieldIdx < fields.
count(); ++fieldIdx )
436 item->setData( label, Qt::UserRole );
441 item->setIcon( icon );
442 parentItem->appendRow( item );
448 for (
int i = 0; i < fields.
count(); ++i )
457 void QgsExpressionTreeView::loadFieldNames()
460 if ( mExpressionGroups.contains( QStringLiteral(
"Fields and Values" ) ) )
462 QgsExpressionItem *node = mExpressionGroups.value( QStringLiteral(
"Fields and Values" ) );
463 node->removeRows( 0, node->rowCount() );
466 registerItem( QStringLiteral(
"Fields and Values" ), QStringLiteral(
"NULL" ), QStringLiteral(
"NULL" ), QString(),
QgsExpressionItem::ExpressionNode,
false, -1 );
478 void QgsExpressionTreeView::loadRelations()
483 QMap<QString, QgsRelation> relations = mProject->relationManager()->relations();
484 QMap<QString, QgsRelation>::const_iterator relIt = relations.constBegin();
485 for ( ; relIt != relations.constEnd(); ++relIt )
487 registerItemForAllGroups( QStringList() << tr(
"Relations" ), relIt->name(), QStringLiteral(
"'%1'" ).arg( relIt->id() ),
formatRelationHelp( relIt.value() ) );
493 mRecentKey = collection;
494 QString name = tr(
"Recent (%1)" ).arg( collection );
495 if ( mExpressionGroups.contains( name ) )
498 node->removeRows( 0, node->rowCount() );
502 const QString location = QStringLiteral(
"/expressions/recent/%1" ).arg( collection );
503 const QStringList expressions = settings.
value( location ).toStringList();
505 for (
const QString &expression : expressions )
508 QString label = expression;
509 label.replace(
'\n',
' ' );
518 QString location = QStringLiteral(
"/expressions/recent/%1" ).arg( collection );
519 QStringList expressions = settings.
value( location ).toStringList();
520 expressions.removeAll( expressionText );
522 expressions.prepend( expressionText );
524 while ( expressions.count() > 20 )
526 expressions.pop_back();
529 settings.
setValue( location, expressions );
536 const QString location = QStringLiteral(
"user" );
537 settings.
beginGroup( location, QgsSettings::Section::Expressions );
539 settings.
setValue( QStringLiteral(
"expression" ), expression );
540 settings.
setValue( QStringLiteral(
"helpText" ), helpText );
543 const QModelIndexList idxs { mModel->match( mModel->index( 0, 0 ), Qt::DisplayRole, label, 1, Qt::MatchFlag::MatchRecursive ) };
544 if ( ! idxs.isEmpty() )
546 scrollTo( idxs.first() );
553 settings.
remove( QStringLiteral(
"user/%1" ).arg( label ), QgsSettings::Section::Expressions );
561 if ( mExpressionGroups.contains( QStringLiteral(
"UserGroup" ) ) )
563 QgsExpressionItem *node = mExpressionGroups.value( QStringLiteral(
"UserGroup" ) );
564 node->removeRows( 0, node->rowCount() );
568 const QString location = QStringLiteral(
"user" );
569 settings.
beginGroup( location, QgsSettings::Section::Expressions );
574 for (
const auto &label : std::as_const( mUserExpressionLabels ) )
577 expression = settings.
value( QStringLiteral(
"expression" ) ).toString();
586 return mUserExpressionLabels;
591 const QString group = QStringLiteral(
"user" );
593 QJsonArray exportList;
594 QJsonObject exportObject
597 {
"exported_at", QDateTime::currentDateTime().toString( Qt::ISODate )},
599 {
"expressions", exportList}
602 settings.
beginGroup( group, QgsSettings::Section::Expressions );
606 for (
const QString &label : std::as_const( mUserExpressionLabels ) )
610 const QString expression = settings.
value( QStringLiteral(
"expression" ) ).toString();
611 const QString helpText = settings.
value( QStringLiteral(
"helpText" ) ).toString();
612 const QJsonObject expressionObject
615 {
"type",
"expression"},
616 {
"expression", expression},
618 {
"description", helpText}
620 exportList.push_back( expressionObject );
625 exportObject[QStringLiteral(
"expressions" )] = exportList;
626 QJsonDocument exportJson = QJsonDocument( exportObject );
634 if ( ! expressionsDocument.isObject() )
637 QJsonObject expressionsObject = expressionsDocument.object();
640 if ( ! expressionsObject[QStringLiteral(
"qgis_version" )].isString()
641 || ! expressionsObject[QStringLiteral(
"exported_at" )].isString()
642 || ! expressionsObject[QStringLiteral(
"author" )].isString()
643 || ! expressionsObject[QStringLiteral(
"expressions" )].isArray() )
647 QVersionNumber qgisJsonVersion = QVersionNumber::fromString( expressionsObject[QStringLiteral(
"qgis_version" )].toString() );
648 QVersionNumber qgisVersion = QVersionNumber::fromString(
Qgis::version() );
652 if ( qgisJsonVersion > qgisVersion )
654 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No;
655 switch ( QMessageBox::question(
this,
656 tr(
"QGIS Version Mismatch" ),
657 tr(
"The imported expressions are from newer version of QGIS (%1) "
658 "and some of the expression might not work the current version (%2). "
659 "Are you sure you want to continue?" ).arg( qgisJsonVersion.toString(), qgisVersion.toString() ), buttons ) )
661 case QMessageBox::No:
664 case QMessageBox::Yes:
673 QStringList skippedExpressionLabels;
674 bool isApplyToAll =
false;
675 bool isOkToOverwrite =
false;
678 settings.
beginGroup( QStringLiteral(
"user" ), QgsSettings::Section::Expressions );
681 const QJsonArray expressions = expressionsObject[QStringLiteral(
"expressions" )].toArray();
682 for (
const QJsonValue && expressionValue : expressions )
685 if ( ! expressionValue.isObject() )
688 skippedExpressionLabels.append( expressionValue.toString() );
692 QJsonObject expressionObj = expressionValue.toObject();
695 if ( ! expressionObj[QStringLiteral(
"name" )].isString()
696 || ! expressionObj[QStringLiteral(
"type" )].isString()
697 || ! expressionObj[QStringLiteral(
"expression" )].isString()
698 || ! expressionObj[QStringLiteral(
"group" )].isString()
699 || ! expressionObj[QStringLiteral(
"description" )].isString() )
702 if ( ! expressionObj[QStringLiteral(
"name" )].toString().isEmpty() )
703 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
705 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"expression" )].toString() );
711 if ( expressionObj[QStringLiteral(
"type" )].toString() != QLatin1String(
"expression" ) )
713 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
718 if ( expressionObj[QStringLiteral(
"group" )].toString() != QLatin1String(
"user" ) )
720 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
724 const QString label = expressionObj[QStringLiteral(
"name" )].toString();
725 const QString expression = expressionObj[QStringLiteral(
"expression" )].toString();
726 const QString helpText = expressionObj[QStringLiteral(
"description" )].toString();
729 if ( label.contains( QLatin1String(
"\\" ) ) || label.contains(
'/' ) )
731 skippedExpressionLabels.append( expressionObj[QStringLiteral(
"name" )].toString() );
736 const QString oldExpression = settings.
value( QStringLiteral(
"expression" ) ).toString();
740 if ( mUserExpressionLabels.contains( label ) && expression != oldExpression )
742 if ( ! isApplyToAll )
743 showMessageBoxConfirmExpressionOverwrite( isApplyToAll, isOkToOverwrite, label, oldExpression, expression );
745 if ( isOkToOverwrite )
749 skippedExpressionLabels.append( label );
761 if ( ! skippedExpressionLabels.isEmpty() )
763 QStringList skippedExpressionLabelsQuoted;
764 skippedExpressionLabelsQuoted.reserve( skippedExpressionLabels.size() );
765 for (
const QString &skippedExpressionLabel : skippedExpressionLabels )
766 skippedExpressionLabelsQuoted.append( QStringLiteral(
"'%1'" ).arg( skippedExpressionLabel ) );
768 QMessageBox::information(
this,
769 tr(
"Skipped Expression Imports" ),
770 QStringLiteral(
"%1\n%2" ).arg( tr(
"The following expressions have been skipped:" ),
771 skippedExpressionLabelsQuoted.join( QLatin1String(
", " ) ) ) );
777 QList<QgsExpressionItem *> result;
778 const QList<QStandardItem *> found { mModel->findItems( label, Qt::MatchFlag::MatchRecursive ) };
779 result.reserve( found.size() );
780 std::transform( found.begin(), found.end(), std::back_inserter( result ),
781 []( QStandardItem * item ) ->
QgsExpressionItem* { return static_cast<QgsExpressionItem *>( item ); } );
785 void QgsExpressionTreeView::showMessageBoxConfirmExpressionOverwrite(
787 bool &isOkToOverwrite,
788 const QString &label,
789 const QString &oldExpression,
790 const QString &newExpression )
792 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll;
793 switch ( QMessageBox::question(
this,
794 tr(
"Expression Overwrite" ),
795 tr(
"The expression with label '%1' was already defined."
796 "The old expression \"%2\" will be overwritten by \"%3\"."
797 "Are you sure you want to overwrite the expression?" ).arg( label, oldExpression, newExpression ), buttons ) )
799 case QMessageBox::NoToAll:
801 isOkToOverwrite =
false;
804 case QMessageBox::No:
805 isApplyToAll =
false;
806 isOkToOverwrite =
false;
809 case QMessageBox::YesToAll:
811 isOkToOverwrite =
true;
814 case QMessageBox::Yes:
815 isApplyToAll =
false;
816 isOkToOverwrite =
true;
833 setFilterCaseSensitivity( Qt::CaseInsensitive );
838 QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
844 int count = sourceModel()->rowCount( index );
845 bool matchchild =
false;
846 for (
int i = 0; i < count; ++i )
858 const QString name = sourceModel()->data( index, Qt::DisplayRole ).toString();
859 if ( name.contains( mFilterString, Qt::CaseInsensitive ) )
865 return std::any_of( tags.begin(), tags.end(), [
this](
const QString & tag )
867 return tag.contains( mFilterString, Qt::CaseInsensitive );
873 mFilterString = string;
881 if ( leftSort != rightSort )
882 return leftSort < rightSort;
884 QString leftString = sourceModel()->data( left, Qt::DisplayRole ).toString();
885 QString rightString = sourceModel()->data( right, Qt::DisplayRole ).toString();
888 if ( leftString.startsWith(
'$' ) )
889 leftString = leftString.mid( 1 );
890 if ( rightString.startsWith(
'$' ) )
891 rightString = rightString.mid( 1 );
893 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 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.
int count() const
Returns number of items.
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.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
This class is a composition of two QSettings instances:
QStringList childGroups() 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.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
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.