35#include "moc_qgsexpressionlineedit.cpp"
37using namespace Qt::StringLiterals;
41 , mExpressionDialogTitle( tr(
"Expression Builder" ) )
43 mButton =
new QToolButton();
44 mButton->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
46 connect( mButton, &QAbstractButton::clicked,
this, &QgsExpressionLineEdit::editExpression );
59 mExpressionDialogTitle = title;
66 if ( multiLine && !mCodeEditor )
69 mCodeEditor->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
73 QHBoxLayout *newLayout =
new QHBoxLayout();
74 newLayout->setContentsMargins( 0, 0, 0, 0 );
75 newLayout->addWidget( mCodeEditor );
77 QVBoxLayout *vLayout =
new QVBoxLayout();
78 vLayout->addWidget( mButton );
79 vLayout->addStretch();
80 newLayout->addLayout( vLayout );
83 setLayout( newLayout );
85 setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
87 setFocusProxy( mCodeEditor );
88 connect( mCodeEditor, &QsciScintilla::textChanged,
this,
static_cast<void (
QgsExpressionLineEdit::* )()
>( &QgsExpressionLineEdit::expressionEdited ) );
92 else if ( !multiLine && !mLineEdit )
95 mCodeEditor =
nullptr;
97 mLineEdit->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum );
99 QHBoxLayout *newLayout =
new QHBoxLayout();
100 newLayout->setContentsMargins( 0, 0, 0, 0 );
101 newLayout->addWidget( mLineEdit );
102 newLayout->addWidget( mButton );
105 setLayout( newLayout );
107 setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum );
109 setFocusProxy( mLineEdit );
110 connect( mLineEdit, &QLineEdit::textChanged,
this,
static_cast<void (
QgsExpressionLineEdit::* )(
const QString & )
>( &QgsExpressionLineEdit::expressionEdited ) );
118 return mExpectedOutputFormat;
123 mExpectedOutputFormat = expected;
128 mDa = std::make_unique<QgsDistanceArea>( da );
133 if ( !mExpressionContextGenerator || mExpressionContextGenerator == mLayer )
134 mExpressionContextGenerator = layer;
141 return mLineEdit->text();
142 else if ( mCodeEditor )
143 return mCodeEditor->text();
151 const QgsExpressionContext context = mExpressionContextGenerator ? mExpressionContextGenerator->createExpressionContext() : mExpressionContext;
157 mExpressionContextGenerator = generator;
163 mLineEdit->setText( newExpression );
164 else if ( mCodeEditor )
165 mCodeEditor->setText( newExpression );
168void QgsExpressionLineEdit::editExpression()
170 const QString currentExpression =
expression();
175 dlg.setExpectedOutputFormat( mExpectedOutputFormat );
178 dlg.setGeomCalculator( *mDa );
180 dlg.setWindowTitle( mExpressionDialogTitle );
184 const QString newExpression = dlg.expressionText();
189void QgsExpressionLineEdit::expressionEdited()
194void QgsExpressionLineEdit::expressionEdited(
const QString &expression )
202 if ( event->type() == QEvent::EnabledChange )
208void QgsExpressionLineEdit::updateLineEditStyle(
const QString &expression )
213 QPalette appPalette = qApp->palette();
214 QPalette palette = mLineEdit->palette();
217 palette.setColor( QPalette::Text, appPalette.color( QPalette::Disabled, QPalette::Text ) );
228 palette.setColor( QPalette::Text, Qt::red );
232 palette.setColor( QPalette::Text, appPalette.color( QPalette::Text ) );
235 mLineEdit->setPalette( palette );
238bool QgsExpressionLineEdit::isExpressionValid(
const QString &expressionStr )
242 const QgsExpressionContext context = mExpressionContextGenerator ? mExpressionContextGenerator->createExpressionContext() : mExpressionContext;
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
A QGIS expression editor based on QScintilla2.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
A generic dialog for building expression strings.
Abstract interface for generating an expression context.
virtual QgsExpressionContext createExpressionContext() const =0
This method needs to be reimplemented in all classes which implement this interface and return an exp...
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QString expression() const
Returns the current expression shown in the widget.
void setMultiLine(bool multiLine)
Sets whether the widget should show a multiline text editor.
void changeEvent(QEvent *event) override
bool isValidExpression(QString *expressionError=nullptr) const
Determines if the current expression is valid.
~QgsExpressionLineEdit() override
void expressionChanged(const QString &expression)
Emitted when the expression is changed.
void registerExpressionContextGenerator(const QgsExpressionContextGenerator *generator)
Register an expression context generator class that will be used to retrieve an expression context fo...
void setExpectedOutputFormat(const QString &expected)
Set the expected format string, which is shown in the expression builder dialog for the widget.
void setGeomCalculator(const QgsDistanceArea &distanceArea)
Set the geometry calculator used in the expression dialog.
void setExpressionDialogTitle(const QString &title)
Sets the title used in the expression builder dialog.
void setExpression(const QString &expression)
Sets the current expression to show in the widget.
QString expectedOutputFormat() const
Returns the expected format string, which is shown in the expression builder dialog for the widget.
QgsExpressionLineEdit(QWidget *parent=nullptr)
Constructor for QgsExpressionLineEdit.
void setLayer(QgsVectorLayer *layer)
Sets a layer associated with the widget.
static bool checkExpression(const QString &text, const QgsExpressionContext *context, QString &errorMessage)
Tests whether a string is a valid expression.
QLineEdit subclass with built in support for clearing the widget's value and handling custom null val...
static QgsProject * instance()
Returns the QgsProject singleton instance.
Represents a vector layer which manages a vector based dataset.